Наливатор - автоматизированная машина, которая будет разливать алкоголь по стопкам.

stpavel
Offline
Зарегистрирован: 09.10.2018

Viblis пишет:

Там перистальтические насосы по ссылкам рассчитаны на  движок 28BYJ-48 и трубку 3мм. Как бы производительность просчитать ? Что то мне кажется слишком медленно все это будет наливать.

Медленно. Производительность такого насоса будет максимум в районе 150 мл в минуту.

Viblis
Offline
Зарегистрирован: 04.11.2016

stpavel пишет:

Медленно. Производительность такого насоса будет максимум в районе 150 мл в минуту.

А нужно минимум 500 мл в минуту 

 

moder
Offline
Зарегистрирован: 30.08.2019

Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

moder пишет:

Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5

Сейчас проверил скетч из 181поста, действительно работает на оборот.наливает в отсутствующие рюмки. Надо исправить скетч, и в тостах вместо запятой ставится вопросительный знак. Со звуком ещё не проверял.

moder
Offline
Зарегистрирован: 30.08.2019

А можете поправить? Я пробовал изменить- не получилось.

stpavel
Offline
Зарегистрирован: 09.10.2018

RW3 пишет:
moder пишет:

Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5

Сейчас проверил скетч из 181поста, действительно работает на оборот.наливает в отсутствующие рюмки. Надо исправить скетч, и в тостах вместо запятой ставится вопросительный знак. Со звуком ещё не проверял.

Смотрите вот этот кусок кода
 

546
	        if (Menu == 0 && MenuFlag == 0 &&  pause_sw < 10) { //Нажатие кнопки меню авто
547
	          MenuFlag = 1;
548
	          oled_auto(Drink);
549
	        } else if (MenuFlag == 1 && pause_sw > 20) { //Выход из меню авто в главное
550
	          MenuFlag = 0;
551
	          oled_menu(0);
552
	        } else if (MenuFlag == 1 ) { //Начинается автоматический разлив
553
	          Serial.println("AUTO"); //Начало автоматического разлива
554
	          oled_naliv(MenuFlag); // Выводим на экран наливаем ...
555
	          byte drink_count = 0;
556
	          for (int y = 0; y < max_DrinkCount; y++) {
557
	            if (analogRead(Optics[y]) > Optics_porog[y] ) {
558
	              strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
559
	              strip.show();
560
	              ServoNaliv(y); // Перемещяемся к рюмке
561
	              pump_timer(Drink); // Налив.
562
	              strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито.
563
	              strip.show();
564
	              drink_count++;
565
	            }
566
	          }

А конкретнее

if (analogRead(Optics[y]) > Optics_porog[y] ) {

 

Добавьте перед этим условием

Serial.print(y);

Serial.print(" - ");

Serial.println(analogRead(Optics[y]));

И посмотрите что выдают ваши оптические датчики.

moder
Offline
Зарегистрирован: 30.08.2019

Добавил эти две строчки, но светодиоды так же светятся при включении устройства, даже без датчиков стаканов((

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

moder пишет:

Добавил эти две строчки, но светодиоды так же светятся при включении устройства, даже без датчиков стаканов((

Какие датчики используете? Почитайте пост 115. автор скетча использует датчики с инвертором, отсюда и работает всё на оборот.(скорее всего).вечером попробую перевернуть сигнал

moder
Offline
Зарегистрирован: 30.08.2019

TCRT5000 . Буду ждать прошивку.

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

Ждать можно долго.....если мои мысли верны,есть три варианта решения этой проблемы - купить другие датчики, переделать уже имеющиеся или исправить прошивку под свои датчики

moder
Offline
Зарегистрирован: 30.08.2019

Понял, буду искать датчики. Ещё момент, индикацию заряда батареи никто не делал?

Rolo1
Offline
Зарегистрирован: 13.09.2019

Господа подскажите по питанию и конденсаторам и резисторам?

И все ли на схеме впорядке?

moder
Offline
Зарегистрирован: 30.08.2019

А что тут не понятного, обычные аккумуляторы типа 18650. А конденсаторы стандартные по питанию, для борьбы с помехами типо фильтрующие.

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

А есть схема в читаемом виде?

moder
Offline
Зарегистрирован: 30.08.2019

А это чем не понятна? Разжеванная до безобразия.

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

moder пишет:

А это чем не понятна? Разжеванная до безобразия.


Тем что не понятно что и где написано

Rolo1
Offline
Зарегистрирован: 13.09.2019

Rolo1
Offline
Зарегистрирован: 13.09.2019

Так питание правильное? Я к тому что аккумуляторы и блок питания на одной линии питания это нормально?

Нужно ли еще что то добавлять в эту схему?

Rolo1
Offline
Зарегистрирован: 13.09.2019

А включается вся система только энкодером или еще должна быть кнопка включения гдето встроена или наливания?

moder
Offline
Зарегистрирован: 30.08.2019

Энкодером

Rolo1
Offline
Зарегистрирован: 13.09.2019

Я правильно понял, поворотом ручки включается, даоее поворотом устанавливается скока милилитров а нажатием запускается налив?

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

RW3 пишет:
moder пишет:

Добавил эти две строчки, но светодиоды так же светятся при включении устройства, даже без датчиков стаканов((

Какие датчики используете? Почитайте пост 115. автор скетча использует датчики с инвертором, отсюда и работает всё на оборот.(скорее всего).вечером попробую перевернуть сигнал

Перевернул, всё работает как надо.дерзайте или покупайте другие датчики

Rolo1
Offline
Зарегистрирован: 13.09.2019
RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019
Rolo1
Offline
Зарегистрирован: 13.09.2019

А включение и запуск налива с энкодера?

вот на Сплане схема https://yadi.sk/d/T--oV4uPcJEDgA

moder
Offline
Зарегистрирован: 30.08.2019

Не понял , что перевернули?

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

moder пишет:

Не понял , что перевернули?


Сигнал с датчиков

kvirin1
Offline
Зарегистрирован: 14.09.2019

схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит

moder
Offline
Зарегистрирован: 30.08.2019

Как я понял по идеи мои датчики можно же переделать, распотрошить мои платки и все.

https://yadi.sk/i/MYHSrXxUFCXWeA

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

kvirin1 пишет:

схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит

Это схема уже устарела.в этой теме новых схем полно.а что касается автора, скорее всего он решил поставить этот проект на коммерческий поток и это его право. Вы видели комментарии к его видео?народ в очередь выстраивается чтобы купить такую штуку. Я лично писал ему и он без вопросов дал схему и скетч.точно такую схему я выкладывал выше,а скетч к ЭТОЙ схеме на первой странице темы

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

moder пишет:

Как я понял по идеи мои датчики можно же переделать, распотрошить мои платки и все.

https://yadi.sk/i/MYHSrXxUFCXWeA


Не надо ничего потрашить,просто добавьте инвертор на выход каждого датчика и будет вам счастье!

moder
Offline
Зарегистрирован: 30.08.2019

Можете нарисовать как это сделать ?

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

Могу,но позже.там ничего сложного.возьмите даташит на микросхему 74hc14 на её входы это выводы 1,3,5,9,11,13 подайте сигналы с ваших датчиков.а с выходов микросхемы 2,4,6,8,10,12 сигналы подайте на ардуину. Один инвертор микросхемы останется лишним. Вот и всё

moder
Offline
Зарегистрирован: 30.08.2019

Если я понял правильно,то сигнал с моих 5ти датчиков я подаю на , 1,3,5,9 и 11. а выходы 2,4,6,8 и 10 уже подключаю на ардуину ? Ну и питание на микросхему.

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

moder пишет:

Если я понял правильно,то сигнал с моих 5ти датчиков я подаю на , 1,3,5,9 и 11. а выходы 2,4,6,8 и 10 уже подключаю на ардуину ? Ну и питание на микросхему.


Совершенно верно!

moder
Offline
Зарегистрирован: 30.08.2019

Спасибо!

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

Rolo1 пишет:

со схемой всё нормально,но она немного не под скетч из этой темы. у вас 6 рюмок,скетч под 5 и мп3 плеер у вас отсутствует.нужен скетч именно под вашу схему.

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Поправил код  из 181 сообщения, с МП3 плейером, все работает!

#include <OLED_I2C.h>
#include <Servo.h>
#include "Adafruit_NeoPixel.h"
#include <SoftwareSerial.h>//добавляем библиотеки
#include <DFPlayer_Mini_Mp3.h>//добавляем библиотеку МП3 плейера

OLED myOLED(SDA, SCL, 8); //Подключение экрана А4-SDA-зеленый, А5-SCL-желтый
extern uint8_t MegaNumbers[];
extern uint8_t RusFont[];
extern uint8_t SmallFont[];
unsigned long currentTime;
unsigned long loopTime;
unsigned long ledTime;
// Переменные для энкодера -----------
const int pin_A = 2;       // Подключение вывода A (CLK) энкодера
const int pin_B = 3;       // Подключение вывода B (DT) энкодера
const int pin_SW = 4;       // Подключение вывода кнопки (SW) энкодера
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
unsigned char encoder_sw_prew = 1;
//Массив , обозначаем подключенные оптопары по выводам . Оптопары подключены, A0,A1,A2,A3,A6
const byte  Optics[] = {0, 1, 2, 3, 6};
// Значения порога срабатывания датчика для каждой рюмки
const unsigned int Optics_porog[] = {50,50,100,100,50};
//Серво
const int PIN_SERVO = 9;
Servo servo;
//Позиция каждой рюмки 
const byte Rumka_pos[] = {0,50,98,145,179}; //12 - 48 - 90 - 135 - 174 (7,6-48,8-90,0-132,0-173,00 или 165/4=41)
const byte servo_speed=15; // Скорость поворота серво,  10 - норм, 20 медленно, 30 очень медленно
byte  Menu = 0;
byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в  Главном меню. 1 Вошли в меню Авто, 2 вошли в  Ручное управление
byte  Drink = 25; // По умолчанию в рюмку наливаем  20 мл.
//----- Минимальные и максимальные значения наполняемой жидкости и задержки для наполнения. 
const byte  min_Drink = 2; // Минимум в рюмку - 2 мл.
const byte  max_Drink = 50; // Максимум в рюмку - 50 мл.
// Калибровка работы насосика. Значения для налива min_Drink и max_Drink соотвественно 
const unsigned int min_Drink_delay = 222; 
const unsigned int max_Drink_delay = 6000;
//--------
byte  DrinkCount = 1; //По умолчанию, для ручного режима - 1 рюмка
const byte  max_DrinkCount = 5; //Максимальное кол-во рюмок - 5
// Насосик
const byte PIN_PUMP = 12;
// Светодиоды
const int PIN_LED = 5;// Сюда подключаются светодиоды
const int LED_COUNT = max_DrinkCount;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800);
//-------



void pump_enable() {
  digitalWrite(PIN_PUMP, 1); //вкл реле
}

void pump_disable() {
  digitalWrite(PIN_PUMP, 0); //выкл реле
}

void pump_timer(byte Drink) {
  digitalWrite(PIN_PUMP, 1); //вкл реле
  delay(map(Drink, min_Drink,  max_Drink, min_Drink_delay, max_Drink_delay));
  digitalWrite(PIN_PUMP, 0); //выкл реле
}

void oled_menu(int Menu) {
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("Y F K B D F N J H"), CENTER, 0);//Н А Л И В А Т О Р
  myOLED.print(F("F D N J"), CENTER, 15);//А В Т О
  myOLED.print(F("H E X Y J Q "), CENTER, 30);//Р У Ч Н О Й 
  myOLED.print(F("G H J V S D R F"), CENTER, 45);//П Р О М Ы В К А
  myOLED.setFont(SmallFont);
  myOLED.print(F(">"), LEFT, (Menu * 15) + 15);
  myOLED.print(F("<"), RIGHT, (Menu * 15) + 15);
  myOLED.update();

}
//  выводит строчку по чуть чуть, в самый раз и тд. Передается номер строки, на которой выводить сообщение
void DrinkInfo(byte pos) {
  if (Drink < 15) {
    myOLED.print(F("YB J XTV"), CENTER, pos);//НИ О ЧЕМ
  } else if (Drink < 28) {
    myOLED.print(F("GJ XENM - XENM"), CENTER, pos);//ПО ЧУТЬ - ЧУТЬ
  } else if (Drink < 38) {
    myOLED.print(F("D CFVSQ HFP"), CENTER, pos);//В САМЫЙ РАЗ
  } else if (Drink < 48) {
    myOLED.print(F("GJ GJKYJQ"), CENTER, pos);//ПО ПОЛНОЙ
  } else {
    myOLED.print(F("LJ RHFTD"), CENTER, pos);//ДО КРАЕВ
  }

}

  void Tost() {
  randomSeed(currentTime);
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("YE!"), CENTER, 20); //НУ!
  // Рандом - 1
  switch (random(18)) {  // case 0...17
  case 0:
      myOLED.print(F("PF DCNHTXE!"), CENTER, 40); //ЗА ВСТРЕЧУ!
      mp3_play (2);  // Проигрываем "mp3/0002.mp3"
    delay(100);
    break;
  case 1:
      myOLED.print(F("PF RHFCJNE!"), CENTER, 40); //ЗА КРАСОТУ!
      mp3_play (3);  // Проигрываем "mp3/0003.mp3"
    delay(100);
    break;
  case 2:
      myOLED.print(F("PF LHE;,E!"), CENTER, 40); //ЗА ДРУЖБУ!
      mp3_play (4);  // Проигрываем "mp3/0004.mp3"
    delay(100);
    break;
  case 3:
      myOLED.print(F("DS <KBY"), CENTER, 38); //ВЫ БЛИН
      myOLED.print(F("LFTNT!"), CENTER, 55); //ДАЕТЕ!
      mp3_play (4);  // Проигрываем "mp3/0004.mp3"
    delay(100);
  case 4:
      myOLED.print(F("PF ,HFNCNDJ!"), CENTER, 40); //ЗА БРАТСТВО!
      mp3_play (5);  // Проигрываем "mp3/0005.mp3"
    delay(100);
    break;
  case 5:
      myOLED.print(F("PF"), CENTER, 38); //за
    myOLED.print(F("CGHFDTLKBDJCNM!"), CENTER, 55); //СПРАВЕДЛИВОСТЬ!
      mp3_play (6);  // Проигрываем "mp3/0006.mp3"
    delay(100);
    break;
  case 6:
      myOLED.print(F("PF HS,FKRE!"), CENTER, 40); //ЗА РЫБАЛКУ!
      mp3_play (7);  // Проигрываем "mp3/0007.mp3"
    delay(100);
    break;
  case 7:
      myOLED.print(F("PF BCRECCNDJ!"), CENTER, 40); //ЗА ИСКУССТВО!
      mp3_play (8);  // Проигрываем "mp3/0008.mp3"
    delay(100);
    break;
  case 8:
      myOLED.print(F("PF HFPEV!"), CENTER, 40); //ЗА РАЗУМ!
      mp3_play (9);  // Проигрываем "mp3/0009.mp3"
    delay(100);
    break; 
  case 9:
      myOLED.print(F("PF BCNBYYS["), CENTER, 38); //ЗА ИСТИННЫХ
      myOLED.print(F(":TYOBY!"), CENTER, 55); //ЖЕНЩИН!
      mp3_play (10);  // Проигрываем "mp3/0010.mp3"
    delay(100);
    break;
  case 10:
      myOLED.print(F("PF GJYBVFYBT!"), CENTER, 40); //ЗА ПОНИМАНИЕ!
      mp3_play (11);  // Проигрываем "mp3/0011.mp3"
    delay(100);
    break;
  case 11:
      myOLED.print(F("PF TLBYTYBT!"), CENTER, 40); //ЗА ЕДИНЕНИЕ!
      mp3_play (13);  // Проигрываем "mp3/0013.mp3"
    delay(100);
    break;
  case 12:
      myOLED.print(F("PF GJ,TLE!"), CENTER, 40); //ЗА ПОБЕДУ!
      mp3_play (16);  // Проигрываем "mp3/0016.mp3"
    delay(100);
    break;
  case 13:
      myOLED.print(F("PF HJLBYE!"), CENTER, 40); //ЗА РОДИНУ!
      mp3_play (21);  // Проигрываем "mp3/0021.mp3"
    delay(100);
    break;
  case 14:
      myOLED.print(F("XNJ, UJKJDF"), CENTER, 38); //ЧТОБ ГОЛОВА
    myOLED.print(F("YT NHTOFKF!"), CENTER, 55); //НЕ ТРЕЩАЛА!
      mp3_play (17);  // Проигрываем "mp3/0017.mp3"
    delay(100);
    break;
  case 15:
      myOLED.print(F("PF CJKBLYJT"), CENTER, 38); //ЗА СОЛИДНОЕ
    myOLED.print(F("VE;CRJT VJKXFYBT"), CENTER, 55); //МУЖСКОЕ МОЛЧАНИЕ
      mp3_play (12);  // Проигрываем "mp3/0012.mp3"
    delay(100);
    break;
  case 16:
      myOLED.print(F("XNJ, VJHOBKJ"), CENTER, 38); //ЧТОБ МОРЩИЛО
    myOLED.print(F("YFC VTYMIT!"), CENTER, 55); //НАС МЕНЬШЕ!
      mp3_play (18);  // Проигрываем "mp3/0018.mp3"
    delay(100);
    break;
  case 17:
      myOLED.print(F("XNJ, D CNJHJYE"), CENTER, 38); //ЧТОБ В СТОРОНУ
    myOLED.print(F("YT DBKMYEKJ!"), CENTER, 55); //НЕ ВИЛЬНУЛО!
      mp3_play (19);  // Проигрываем "mp3/0019.mp3"
    delay(100);
    break;      
  }
  delay(2000);
  myOLED.update();

}

// Меню Авто режим
void oled_auto(int Drink) {

  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("F D N J"), CENTER, 0);
  myOLED.print(F("VK   "), RIGHT, 27);
  DrinkInfo(57);
  //  myOLED.print(DrinkInfo[map(Drink, 2, max_Drink, 0, 4)], CENTER, 57);
  myOLED.setFont(MegaNumbers);
  myOLED.print(String(Drink), CENTER, 13);
  myOLED.update();
}

// Меню Ручной режим
void oled_manual(int DrinkCount, int Drink) {

  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("H E X Y J Q"), CENTER, 0); //Р У Ч Н О Й 
  DrinkInfo(57);
  // myOLED.print(DrinkInfo[map(Drink, 2, max_Drink, 0, 4)], CENTER, 57);
  myOLED.print(F("H>V"), 24, 27);
  myOLED.print(F("VK "), RIGHT, 27);
  myOLED.setFont(MegaNumbers);
  myOLED.print(String(DrinkCount), LEFT, 13);
  myOLED.print(String(Drink), (Drink < 10) ? 80 : 57, 13);
  myOLED.update();
}


void oled_naliv(int MenuFlag) {
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print((MenuFlag == 1) ? F("F D N J") : F("H E X Y J Q") , CENTER, 0); // А В Т О    Р У Ч Н О Й 

  myOLED.print(F("Y F K B D F > "), CENTER, 27); //Н А Л И В А Ю
  DrinkInfo(47);
  myOLED.update();
}

void oled_nalito(int MenuFlag, int Nalito) {
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print((MenuFlag == 1) ? F("F D N J") : F("H E X Y J Q") , CENTER, 0);
  myOLED.print(F("Y F K B N J"), CENTER, 20); //Н А Л И Т О
  if (Nalito == 1) {
    myOLED.print(F("H > V R F"), CENTER, 55); //РЮМКА
  } else if (Nalito <= 4 ) {
    myOLED.print(F("H > V R B"), CENTER, 55); //РЮМКИ
  } else {
    myOLED.print(F("H > V J R"), CENTER, 55); //РЮМОК
  }

  myOLED.setFont(SmallFont);
  myOLED.print(String(Nalito), CENTER, 36);
  myOLED.update();
}

void ServoNaliv(byte rumka) {
  servo.attach(PIN_SERVO);
  for (int pos = servo.read(); pos <= Rumka_pos[rumka]; pos += 1) { 
    // с шагом в 1 градус
    servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos'
    delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию
  }
  servo.detach();


}

void ServoParking () {
  //Serial.println(servo.read());
  servo.attach(PIN_SERVO);
  for (int pos = servo.read();  pos >= 0; pos -= 1) {
    // с шагом в 1 градус
    servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos'
    delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию
  }
  servo.detach();
}

void CvetoMuzik() {
  for (int i = 0; i <= 7; i++) {
    for (int y = 0; y < max_DrinkCount; y++) {
      strip.setPixelColor(y, strip.Color(255, 0, 0));
      strip.show();
      delay(30);
    }
    for (int y = 0; y < max_DrinkCount; y++) {
      strip.setPixelColor(y, strip.Color(0, 255, 0));
      strip.show();
      delay(30);
    }
    for (int y = 0; y < max_DrinkCount; y++) {
      strip.setPixelColor(y, strip.Color(0, 0, 255));
      strip.show();
      delay(30);
    }
  }
}

void setup()  {
  Serial.begin(9600);//
  //устанавливаем Serial порт МП3 плейера если вывод в монитор TX(D0) и RX(D1)не нужен 
  mp3_set_serial (Serial);//инициализируем Serial порт МП3 плейера
  /*  
  при необходимости создаем програмный порт для управдения МП3 плейером, если вывод в монитор TX(D0) RX(D1) необходим
  SoftwareSerial mySoftwareSerial(10, 11); // RX, TX  обозначаем програмный порт как mySoftwareSerial
  //плейер подключаем D10 D11
  mySoftwareSerial.begin(9600);//инициализируем програмный Serial порт 
  mp3_set_serial (mySoftwareSerial);// указываем програмный порт для МП3 плейера
  //инициализируем Serial с скоростью 115200, если вывод в монитор  TX(D0) RX(D1) необходим 
  Serial.begin(115200);
  */  
  delay (100);//Между двумя командами необходимо делать задержку 100 миллисекунд, в противном случае некоторые команды могут работать не стабильно.
  mp3_set_volume (25);// устанвливаем громкость 25
  delay (100);
  mp3_play (1); // Проигрываем "mp3/0001.mp3"(0001_get started!.mp3)
  delay (100);
  //   Volume=EEPROM.read(0);
  myOLED.begin(); // Инициализация дисплея
  // выводим привествие после включения перед наливом
  myOLED.clrScr();  
  myOLED.setFont(RusFont);
  myOLED.print(F("Ye? yfxfkb!"), CENTER, 50);// Ну, начали!
  myOLED.update(); 
  pinMode(pin_SW, INPUT); // устанавливаем pin pin_SW как вход
  digitalWrite(pin_SW, HIGH); // Поддяжка вывода к 1
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  pinMode(PIN_PUMP, OUTPUT);
  digitalWrite(PIN_PUMP, 0);
  currentTime = millis();
  loopTime = currentTime;
  //---------------

  oled_menu(0);
  strip.begin();
  for (int i = 0; i < 5; i++) {
    pinMode(Optics[i], INPUT);
  }
  ServoParking();

}

void loop()  {
  currentTime = millis();
  if (currentTime >= (loopTime + 5)) { // проверяем каждые 5мс

    //     int  val = analogRead(0);     // считываем значение
    //  Serial.println(val);
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера
    if ((!encoder_A) && (encoder_A_prev)) {  // если состояние изменилось с положительного к нулю

      //Вращение влево
      if (encoder_B) {
        if (MenuFlag == 0) {
          (Menu <= 0 ) ? Menu = 2 : Menu--; // Перемещение курсора по главному меню назад
          oled_menu(Menu);
        } else if (MenuFlag == 1) {
          (Drink <= min_Drink ) ? Drink = max_Drink : Drink--; // Уменьшаем кол-во милилитров в рюмку
          oled_auto(Drink);
        } else if (MenuFlag == 2) {
          (DrinkCount >= max_DrinkCount ) ? DrinkCount = 1 : DrinkCount++; // Влево увечичиваем рюмки для ручного режима
          oled_manual(DrinkCount, Drink);
        }
        //Вращение вправо
      } else {
        if (MenuFlag == 0) {
          (Menu >= 2 ) ? Menu = 0 : Menu++; // Перемещение курсора по главному меню вперед.
          oled_menu(Menu);
        } else if (MenuFlag == 1) {
          (Drink >= max_Drink ) ? Drink = min_Drink : Drink++;
          oled_auto(Drink);
        } else if (MenuFlag == 2) {
          (Drink >= max_Drink ) ? Drink = min_Drink : Drink++;
          oled_manual(DrinkCount, Drink);
        }
      }

    }

    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла

    int encoder_sw = digitalRead(pin_SW);
    if  (encoder_sw == 0 && encoder_sw != encoder_sw_prew)  { // Нажата кнопка

      int pause_sw = 0;
      boolean promivka = false;
      while (digitalRead(pin_SW) == 0) { // Держим кнопку. Считаем сколько времени прошло...
        delay(100);
        pause_sw++;
        if (pause_sw > 20 && Menu != 2 ) break;

        if (pause_sw > 20 && Menu == 2 && promivka == false) { // Если пункт меню промывка и держим кнопку больше 2 секунд.
          promivka = true;
          pump_enable(); // Включаем насос
          myOLED.clrScr();
          myOLED.setFont(RusFont);
          myOLED.print(F("G H J V S D R F"), CENTER, 15); // П Р О М Ы В К А
          myOLED.print(F(". . ."), CENTER, 45);
          myOLED.update();
        }
      }

      //После отпускания кнопки , обрабатываем
      if (promivka == true) { //Отпустили кнопку. Если включена промывка, выключаем насос и возвращаемся в главное меню
        promivka = false;
        pump_disable() ; //Выключаем насос
        oled_menu(2);

      } else {
        //Обработка всех нажатий кнопки
        if (Menu == 0 && MenuFlag == 0 &&  pause_sw < 10) { //Нажатие кнопки меню авто
          MenuFlag = 1;
          oled_auto(Drink);
        } else if (MenuFlag == 1 && pause_sw > 20) { //Выход из меню авто в главное
          MenuFlag = 0;
          oled_menu(0);
        } else if (MenuFlag == 1 ) { //Начинается автоматический разлив
          Serial.println("Начало автоматического разлива");
          oled_naliv(MenuFlag); // Выводим на экран наливаем ...
          byte drink_count = 0;
          for (int y = 0; y < max_DrinkCount; y++) {
            if (analogRead(Optics[y]) > Optics_porog[y] ) {
              strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
              strip.show();
              ServoNaliv(y); // Перемещяемся к рюмке
              pump_timer(Drink); // Налив.
              strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито.
              strip.show();
              drink_count++;
            }
          }
          if (drink_count > 0) {
            oled_nalito(MenuFlag, drink_count );
            ServoParking();
            delay(1000);
            Tost();
            CvetoMuzik();
            oled_auto(Drink);
          } else {
            myOLED.clrScr();
            myOLED.setFont(RusFont);
            myOLED.print(F("YTN H>VJR !"), CENTER, 25); //НЕТ РЮМОК !
            myOLED.update();
            delay(2000);
            oled_auto(Drink);

          }
        } else if (Menu == 1 && MenuFlag == 0 &&  pause_sw < 10) { // Нажатие меню ручное
          MenuFlag = 2;
          oled_manual(DrinkCount, Drink);
        } else if (MenuFlag == 2 && pause_sw > 20) { //Выход из меню ручное в главное
          MenuFlag = 0;
          oled_menu(1);
        } else if (MenuFlag == 2 ) { //Начинается ручной разлив
          //  Serial.println("Начало ручного разлива " + String(DrinkCount));
          oled_naliv(MenuFlag); // Выводим на экран наливаем ...
          for (int y = 0; y < DrinkCount; y++) {
            strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом
            strip.show();
            ServoNaliv(y); // Перемещяемся к рюмке
            pump_timer(Drink); // Налив.
            strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито.
            strip.show();
          }
          oled_nalito(MenuFlag, DrinkCount );
          ServoParking();
          Tost();
          CvetoMuzik();
          oled_manual(DrinkCount, Drink);
        }
      }
    }

    if (currentTime >= (ledTime + 300)) {
      //Опрашиваем оптопары ... Если рюмка поставлена , светодиод светится синим, нет ничего - не светится
      for (int i = 0; i < max_DrinkCount; i++) {
        
        int val = analogRead(Optics[i]);     // считываем значение
        Serial.println(val);
        if (val > Optics_porog[i]) {
          strip.setPixelColor(i, strip.Color(0, 0, 255));
        } else {
          strip.setPixelColor(i, strip.Color(0, 0, 0));
        }
    //    delay(20);

      }
      strip.show();
      ledTime = currentTime;
    }
    encoder_sw_prew = encoder_sw;
    loopTime = currentTime;

  }
}

запятую вместо ? не получилось победить (по раскладке рус - "," англ - "?"), заменил на !

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

stpavel пишет:

Forthomo пишет:

Коллеги, нужна помощь в корректировке скетча под дисплей LCD1602 I2C. Ни в какую не хотят переменные отображаться на дисплее, в мониторе все прописывается.

Не понял  про какие переменные идет речь 

void DrinkInfo(byte pos) {
  lcd.setCursor(0, 0); // устанавливаем курсор в 1-ю ячейку верхней строки
  lcd.print(F("HАЛИТЬ ПО")); // пишем "HАЛИТЬ ПО" (с 1 по 9 ячейку)
  lcd.setCursor(10, 0); // устанавливаем курсор в 11-ю ячейку верхней строки
  lcd.print(Drink); // пишем переменную "Drink" в 11 и 12 ячейку (2 знака)
  Serial.println(Drink);  // выводим переменную ""Drink" в монитор порт
  lcd.setCursor(13, 0);// устанавливаем курсор в 14-ю ячейку верхней строки
  lcd.print(F("мЛ?")); // пишем "мЛ?" (с 14 по 16 ячейку)

Вот Drink и не выводиться на LCD.

 Фразы "Ни о чем", "по чуть- чуть", "в самый раз"  и др. -  при прокручивании энкодера изменяются на дисплее в зависимости от количества Drink. Аналогично и с DrinkCount и Drink в ручном режиме.

koka7777745
Offline
Зарегистрирован: 29.05.2017

При подключении дисплея вот такое. Это может быть  из-за того что дисплей 1.3 ? Как с этим боротся?

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

koka7777745 пишет:

При подключении дисплея вот такое. Это может быть  из-за того что дисплей 1.3 ? Как с этим боротся?


Такой дисплей так просто не подключается, надо скетч под него переделывать. У него даже один из выводов с другим обозначением

sha-tosik
Offline
Зарегистрирован: 16.09.2019

kvirin1 пишет:

схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит

Добрый день всем! собрал по данной схеме. теперь нужно подобрать порог срабатывания датчиков TCRT и откорректировать их в скетче. в программировании не силен. если не трудно, может кто объяснит в подробностях, как это сделать?

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

Смотрите скетч из поста 7на первой странице.срочки 027-031 выставляем порог датчиков. В последнем скетче 25 строчка

aleks_raichel
Offline
Зарегистрирован: 27.08.2019

aleks_raichel
Offline
Зарегистрирован: 27.08.2019

aleks_raichel
Offline
Зарегистрирован: 27.08.2019

сори, почему-то продублировалось.....

sha-tosik
Offline
Зарегистрирован: 16.09.2019

Как узнать порог срабатывания моих датчиков? Как конкретно происходит процесс отладки? Что и куда подключаем? Где снимаем показания?

aleks_raichel
Offline
Зарегистрирован: 27.08.2019

Выставляешь порог, ставишь стопку, под ней должен засветиться адресный диод, если диод не горит, значит маленький порог, или наоборот, если если диод горит без стопки, значит порог большой.

Rolo1
Offline
Зарегистрирован: 13.09.2019

Да я без мп3 хочу собрать, а скеч который тут потом модернизировать.

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

sha-tosik пишет:
Как узнать порог срабатывания моих датчиков? Как конкретно происходит процесс отладки? Что и куда подключаем? Где снимаем показания?

Сообщение 116, короткий скетч для проверки  и калибровки датчиков. Подключаешь датчики, заливаешь скетч, открываешь монитор порта. Смотришь значения без рюмок, ставишь рюмки , снова смотришь значения, вот эти значения и будут порогом срабатывания.