Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Так и не понял что нужно сделать чтоб заработало правильно, может кто подскажет поподробнее
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Так и не понял что нужно сделать чтоб заработало правильно, может кто подскажет поподробнее
Здесь проблемно будет добавить 6 рюмку, из за ограничения кол-ва аналоговых входов. Если их 7, два используются для i2c ,один для определения заряда аккумов, остается только 5 .
Я у себя собираюсь использовать концевики ( микровыключатели ) , и подключать их через 74HC165, там практически нет ограничений по кол-ву цифровых входов. Оптопары мне не нравятся из за их глючности при ярком свете, необходимостью наклеивания всякой херни на рюмки, итп.
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Так и не понял что нужно сделать чтоб заработало правильно, может кто подскажет поподробнее
Все что угодно, от неисправности самого проверяемого устройства до неправильного подключения. Другие устройства сканер видит? Какое устройство сканируешь?
https://yadi.sk/d/iSC-hQ6K3KCJCg
обновил, проверил работает.
Спасибо тебе
https://yadi.sk/d/iSC-hQ6K3KCJCg
обновил, проверил работает.
Да всё работает, благодарю за чертёж корпуса и за подробную подборку материала добавил к себе на диск на всякий случай.
https://yadi.sk/d/1DOedRRio4NsYA
наливатор красота!
но 1602, испортит все!
но 1602, испортит все!
Такой не испортит https://ru.aliexpress.com/i/32917189276.html правда ценник не гуманный.
наливатор красота!
но 1602, испортит все!
Передняя панель у меня будет легко меняемая ) Так что в любой момент можно установить что угодно .
Вариант с 1602
Передняя панель у меня будет легко меняемая ) Так что в любой момент можно установить что угодно .
я просто тут подумываю о мега наливаторе на ESP+ Nextion, останавливает пока только корпус, сам делать не хочу, ищу кому заказать...
если у вас с корпусом срастется можем поменяться на мозги ESP+ Nextion :) (если я все-же дозрею)
Передняя панель у меня будет легко меняемая ) Так что в любой момент можно установить что угодно .
я просто тут подумываю о мега наливаторе на ESP+ Nextion, останавливает пока только корпус, сам делать не хочу, ищу кому заказать...
если у вас с корпусом срастется можем поменяться на мозги ESP+ Nextion :) (если я все-же дозрею)
Хорошо )
Заметил что часто повторяются одни и те же тосты.подскажите как сделать воспроизведение всех тостов по кругу?
вот так попробуй блок Тост поправить, но предупреждаю я НЕ ПРОГРАММИСТ! Может кто поправит.
byte num=0 //количество тостов 0...17 void Tost() { //последовательно Serial.println(num); // вывод в монитор для проверки mp3_set_volume (20);// устанвливаем громкость 20 (если хотите установить // кнопки для регулировки громкости вручную, закоментируйте эту и следующую строчку) delay (100); lcd.clear(); switch (num){ case 0: //ЗА ВСТРЕЧУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ВСТРЕЧУ!")); mp3_play (2); // Проигрываем "mp3/0002.mp3" delay(100); break; case 17: //НУ ВЫ БЛИН ДАЁТЕ! lcd.setCursor(2, 0); lcd.print(F("НУ ВЫ БЛИН")); lcd.setCursor(5, 1); lcd.print(F("ДАЁТЕ!")); mp3_play (20); // Проигрываем "mp3/0020.mp3" delay(100); break; } delay(2000); num=++; if(num>17) { num==0; } }поправляю
num=++; if(num>17) { num==0; }БРЕД!
нада так
num++; if(num>17) { num=0; }еще лаконичнее
if(++num>17) { num=0; }спасибо,попробую. от меня новая нарезка тостов.правда текст приходится выводить не полностью,но может кому пригодится.
https://yadi.sk/d/iBAHJ_Fq8le9NQ
xDriver, можешь ГСЧ в блок Тост поправить, чтобы тосты не повторялись в течении одной сессии (посиделок)?
могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)
могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)
будем считать включение девайса
могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)
будем считать включение девайса
еще раз, у нас N тостов, мы по ГСЧ отговорили все, что дальше?
спасибо,попробую. от меня новая нарезка тостов.правда текст приходится выводить не полностью,но может кому пригодится.
https://yadi.sk/d/iBAHJ_Fq8le9NQ
31 и 37 особенно колоритные, добавляю себе.
могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)
будем считать включение девайса
еще раз, у нас N тостов, мы по ГСЧ отговорили все, что дальше?
сброс, и заново.
могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)
нужно чтобы тосты шли по порядку с первого до последнего.затем опять с первого до последнего и так по кругу
могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)
нужно чтобы тосты шли по порядку с первого до последнего.затем опять с первого до последнего и так по кругу
#411 и #412
Forthomo сделал, я поправил.
могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)
нужно чтобы тосты шли по порядку с первого до последнего.затем опять с первого до последнего и так по кругу
#411 и #412
Forthomo сделал, я поправил.
что то не получилось.компилируется с ошибками. может я чего не туда вставляю?
Скомпилировал, вечером попробую в железе
клади сюда, что пытаешься скомпилировать.
Прошу прощения
я не программист можно ли адаптировать скетч под дисплей oled1.3 sh1106 i2c и на 6 рюмок ?
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Так и не понял что нужно сделать чтоб заработало правильно, может кто подскажет поподробнее
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
А прочитать 6-ю страницу вдумчиво не судьба?
Можно, даже самостоятельно, если использовать другую библиотеку, см сообщение №6 здесь:
http://arduino.ru/forum/apparatnye-voprosy/oled-diagonal-13
добавить рюмку не проблема.
//Массив , обозначаем подключенные оптопары по выводам . Оптопары подключены, A0,A1,A2,A3,A6 const byte Optics[] = {0, 1, 2, 3, 6, 7}; // Значения порога срабатывания датчика для каждой рюмки const unsigned int Optics_porog[] = {100,200,200,200,100,200}; //Серво const int PIN_SERVO = 9; Servo servo; //Позиция каждой рюмки const byte Rumka_pos[] = {0,30,60,120,150,179};А кто-нибудь заморачивался с индикаций заряда батареи на этом дисплее, как в оригинальном изделии автора?
Можно тут почитать и применить https://m.habr.com/ru/post/390967/
Можно, даже самостоятельно, если использовать другую библиотеку, см сообщение №6 здесь:
http://arduino.ru/forum/apparatnye-voprosy/oled-diagonal-13
добавить рюмку не проблема.
//Массив , обозначаем подключенные оптопары по выводам . Оптопары подключены, A0,A1,A2,A3,A6 const byte Optics[] = {0, 1, 2, 3, 6, 7}; // Значения порога срабатывания датчика для каждой рюмки const unsigned int Optics_porog[] = {100,200,200,200,100,200}; //Серво const int PIN_SERVO = 9; Servo servo; //Позиция каждой рюмки const byte Rumka_pos[] = {0,30,60,120,150,179};Здесь проблемно будет добавить 6 рюмку, из за ограничения кол-ва аналоговых входов. Если их 7, два используются для i2c ,один для определения заряда аккумов, остается только 5 .
Я у себя собираюсь использовать концевики ( микровыключатели ) , и подключать их через 74HC165, там практически нет ограничений по кол-ву цифровых входов. Оптопары мне не нравятся из за их глючности при ярком свете, необходимостью наклеивания всякой херни на рюмки, итп.
С рюмками разобрался а вот с дисплеем никак
спасибо,попробую. от меня новая нарезка тостов.правда текст приходится выводить не полностью,но может кому пригодится.
https://yadi.sk/d/iBAHJ_Fq8le9NQ
31 и 37 особенно колоритные, добавляю себе.
Добавил:
void Tost() { //Рандом - 1 randomSeed(currentTime); byte num=random(22); // 0...21 Serial.println(num); //mp3_set_volume (20);// устанвливаем громкость 20 (если хотите установить // кнопки для регулировки громкости вручную, закоментируйте эту и следующую строчку) delay (100); lcd.clear(); switch (num){ //case 0...19 case 20: //ЖЕЛАЮ ЧТОБЫ ВСЕ lcd.setCursor(0, 0); lcd.print(F("ЖЕЛАЮ ЧТОБЫ ВСЕ")); lcd.setCursor(5, 1); lcd.print(F("!!!!")); mp3_play (31); // Проигрываем "mp3/0031.mp3" delay(100); break; case 21: //ХЛОПНУТЬ ПО РЮМАШКЕ lcd.setCursor(0, 0); lcd.print(F("А НЕ ХЛОПНУТЬ ЛИ")); lcd.setCursor(1, 1); lcd.print(F("НАМ ПО РЮМАШКЕ?")); mp3_play (31); // Проигрываем "mp3/0031.mp3" delay(3500); lcd.clear(); lcd.setCursor(1, 0); lcd.print(F("ЗАМЕТЬТЕ, НЕ Я")); lcd.setCursor(1, 1); lcd.print(F("ЭТО ПРЕДЛОЖИЛ!")); break; } delay(2000) }Ну на него просто можно бумашку с натписями наклеить
...один для определения заряда аккумов...
уже реализовал?
...один для определения заряда аккумов...
уже реализовал?
Пока нет, но в этом никакой сложности не вижу.
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
А прочитать 6-ю страницу вдумчиво не судьба?
Спасибо тебе добрый человек
Что за проблема с датчиками, то же не правильно работают?
По применению датчиков TCRT5000 без переделки и добавления инвертора.
Это только предположение, но возможно в скетче поправить всего две строчки
432 if (analogRead(Optics[y]) > Optics_porog[y] ) {
490 if (val > Optics_porog[i]) {
поменять ">" (больше) на "<" (меньше). Это лучше объяснит автор скетча stpavel.
Был бы датчик попробовал бы.
Я поменял у меня все заработало
Коментарии как отключить их..
Коментарии как отключить их..
Да никак. Убогий движок. Добавляй в спам ))
Или ты не про рассылку ?
Коментарии как отключить их..
Да никак. Убогий движок. Добавляй в спам ))
Или ты не про рассылку ?
Да, про рассылку. Кое-как получилось отключить
клади сюда, что пытаешься скомпилировать.
#include <LCD_1602_RUS.h> #include <Servo.h> #include "Adafruit_NeoPixel.h" #include <SoftwareSerial.h>//добавляем библиотеки #include <DFPlayer_Mini_Mp3.h>//добавляем библиотеку МП3 плейера LCD_1602_RUS lcd(0x27, 16, 2); //Подключение экрана А4-SDA-зеленый, А5-SCL-желтый 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[] = {100,100,100,100,100}; //Серво const int PIN_SERVO = 9; Servo servo; //Позиция каждой рюмки const byte Rumka_pos[] = {3,50,98,145,179}; //12 - 48 - 90 - 135 - 174 const byte servo_speed=10; // Скорость поворота серво, 10 - норм, 20 медленно, 30 очень медленно byte Menu = 0; byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в Главном меню. 1 Вошли в меню Авто, 2 вошли в Ручное управление byte Drink = 20; // По умолчанию в рюмку наливаем 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 = 5500; //-------- 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(byte Menu) { lcd.clear(); lcd.setCursor(3, 0); lcd.print(F("РАЗЛИВАТОР")); lcd.setCursor(0, 1); lcd.print(F(">")); lcd.setCursor(15, 1); lcd.print(F("<")); switch (Menu) { case 0: lcd.setCursor(6, 1); lcd.print(F("АВТО")); break; case 1: lcd.setCursor(2, 1); lcd.print(F("РУЧНОЙ РЕЖИМ")); break; case 2: lcd.setCursor(4, 1); lcd.print(F("ПРОМЫВКА")); break; } } // выводит строчку по чуть чуть, в самый раз и тд. Передается номер строки, на которой выводить сообщение void DrinkInfo(byte pos) { Serial.println(F("INFO_DRINK")); lcd.setCursor(0, 1); if (Drink < 15) { // lcd.setCursor(0, 1); lcd.print(F(" НИ О ЧЕМ ")); } else if (Drink < 28) { // lcd.setCursor(0, 1); lcd.print(F(" ПО ЧУТЬ - ЧУТЬ ")); } else if (Drink < 38) { // lcd.setCursor(0, 1); lcd.print(F(" В САМЫЙ РАЗ ")); } else if (Drink < 48) { // lcd.setCursor(0, 1); lcd.print(F(" ПО ПОЛНОЙ ")); } else { // lcd.setCursor(0, 1); lcd.print(F(" ДО КРАЕВ ")); } } // Меню Авто режим void oled_auto(int Drink) { Serial.println(F("MENU_AUTO")); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("HАЛИТЬ ПО")); lcd.setCursor(10, 0); lcd.print(Drink); Serial.println(Drink); lcd.setCursor(13, 0); lcd.print(F("мЛ?")); DrinkInfo(57); } // Меню Ручной режим void oled_manual(int DrinkCount, int Drink) { Serial.println(F("MENU_RUCHN")); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("HАЛИТЬ ПО")); lcd.setCursor(10, 0); lcd.print(Drink); lcd.setCursor(13, 0); lcd.print(F("мЛ?")); Serial.println(Drink); lcd.setCursor(0, 1); lcd.print(F(" В РЮМ")); lcd.setCursor(5, 1); lcd.print(DrinkCount); Serial.println(DrinkCount); if (DrinkCount == 1) { lcd.setCursor(10, 1); lcd.print(F("КУ ")); } else if (DrinkCount <= 4 ) { lcd.setCursor(10, 1); lcd.print(F("КИ ")); } else { lcd.setCursor(10, 1); lcd.print(F("ОК ")); } } // Меню налива void oled_naliv(int MenuFlag, int Drink, int DrinkCount) { Serial.println(F("NALIVAIU")); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("НАЛИВАЮ ПО")); lcd.setCursor(11, 0); lcd.print(Drink); Serial.println(Drink); lcd.setCursor(14, 0); lcd.print(F("мЛ")); lcd.setCursor(0, 1); lcd.print(F(" В")); lcd.setCursor(5, 1); lcd.print(DrinkCount); Serial.println(DrinkCount); lcd.setCursor(7, 1); lcd.print(F("РЮМ")); if (DrinkCount == 1) { lcd.setCursor(10, 1); lcd.print(F("КУ ")); } else if (DrinkCount <= 4 ) { lcd.setCursor(10, 1); lcd.print(F("КИ ")); } else { lcd.setCursor(10, 1); lcd.print(F("ОК ")); } } // Меню налито void oled_nalito(int MenuFlag, int Nalito, int Drink) { Serial.println(F("NALITO")); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("HАЛИТО ПО")); lcd.setCursor(11, 0); lcd.print(Drink); Serial.println(Drink); lcd.setCursor(14, 0); lcd.print(F("мЛ")); lcd.setCursor(0, 1); lcd.print(F(" В")); lcd.setCursor(5, 1); lcd.print(Nalito); lcd.setCursor(7, 1); lcd.print(F("РЮМ")); Serial.println(Nalito); if (Nalito == 1) { lcd.setCursor(10, 1); lcd.print(F("КУ ")); } else if (Nalito <= 4 ) { lcd.setCursor(10, 1); lcd.print(F("КИ ")); } else { lcd.setCursor(10, 1); lcd.print(F("ОК ")); } } void Tost() { //Рандом - 1 Serial.println(F("Tost")); delay (100); lcd.clear(); switch (num){ byte num=0 // 0...19 Serial.println(num); delay (100); lcd.clear(); switch (num){ //switch (random(20)) { // 0...19 case 0: //ЗА ВСТРЕЧУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ВСТРЕЧУ!")); mp3_play (2); // Проигрываем "mp3/0002.mp3" delay(100); break; case 1: //ЗА КРАСОТУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА КРАСОТУ!")); mp3_play (3); // Проигрываем "mp3/0003.mp3" delay(100); break; case 2: //"ЗА ДРУЖБУ!" lcd.setCursor(7, 0); lcd.print(F("НУ,"));// lcd.setCursor(3, 1); lcd.print(F("ЗА ДРУЖБУ!")); mp3_play (4); // Проигрываем "mp3/0004.mp3" delay(100); break; case 3: //"ЗА БРАТСТВО! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА БРАТСТВО!")); mp3_play (5); // Проигрываем "mp3/0005.mp3" delay(100); break; case 4: //ЗА СПРАВЕДЛИВОСТЬ! lcd.setCursor(5, 0); lcd.print(F("НУ, ЗА")); lcd.setCursor(1, 1); lcd.print(F("СПРАВЕДЛИВОСТЬ!")); mp3_play (6); // Проигрываем "mp3/0006.mp3"11 delay(100); break; case 5: //ЗА РЫБАЛКУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА РЫБАЛКУ!")); mp3_play (7); // Проигрываем "mp3/0007.mp3" delay(100); break; case 6: //ЗА ИСКУССТВО! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ИСКУССТВО!")); mp3_play (8); // Проигрываем "mp3/0008.mp3" delay(100); break; case 7: //ЗА РАЗУМ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА РАЗУМ!")); mp3_play (9); // Проигрываем "mp3/0009.mp3" delay(100); break; case 8: //ЗА ИСТИННЫХ ЖЕНЩИН! lcd.setCursor(5, 0); lcd.print(F("НУ, ЗА")); lcd.setCursor(0, 1); lcd.print(F("ИСТИННЫХ ЖЕНЩИН!!")); mp3_play (10); // Проигрываем "mp3/0010.mp3" delay(100); break; case 9: //ЗА ПОНИМАНИЕ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ПОНИМАНИЕ!")); mp3_play (11); // Проигрываем "mp3/0011.mp3" delay(100); break; case 10: //ЗА ЕДИНЕНИЕ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ЕДИНЕНИЕ!")); mp3_play (13); // Проигрываем "mp3/0013.mp3" delay(100); break; case 11: //ЗА ПОБЕДУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА ПОБЕДУ!")); mp3_play (16); // Проигрываем "mp3/0016.mp3" delay(100); break; case 12: //ЗА РОДИНУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА РОДИНУ!")); mp3_play (21); // Проигрываем "mp3/0021.mp3" delay(100); break; case 13: //ЧТОБ ГОЛОВА НЕ ТРЕЩАЛА! lcd.setCursor(0, 0); lcd.print(F("НУ, ЧТОБ ГОЛОВА")); lcd.setCursor(2, 1); lcd.print(F("НЕ ТРЕЩАЛА!")); mp3_play (17); // Проигрываем "mp3/0017.mp3" delay(100); break; case 14: //ЗА СОЛИДНОЕ МУЖСКОЕ МОЛЧАНИЕ lcd.setCursor(0, 0); lcd.print(F("НУ, ЗА СОЛИДНОЕ"));//НУ, lcd.setCursor(0, 1); lcd.print(F("МУЖСКОЕ МОЛЧАНИЕ!")); mp3_play (12); // Проигрываем "mp3/0012.mp3" delay(100); break; case 15: //ЧТОБ МОРЩИЛО НАС МЕНЬШЕ! lcd.setCursor(0, 0); lcd.print(F("НУ,ЧТОБ МОРЩИЛО")); lcd.setCursor(2, 1); lcd.print(F("НАС МЕНЬШЕ ЧЕМ")); mp3_play (18); // Проигрываем "mp3/0018.mp3" delay(100); break; case 16: //ЧТОБ В СТОРОНУ НЕ ВИЛЬНУЛО! lcd.setCursor(0, 0); lcd.print(F("НУ,ЧТОБ В СТОРО-")); lcd.setCursor(0, 1); lcd.print(F("НУ НЕ ВИЛЬНУЛО!")); mp3_play (19); // Проигрываем "mp3/0019.mp3" delay(100); break; case 17: //НУ ВЫ БЛИН ДАЁТЕ! lcd.setCursor(3, 0); lcd.print(F("НУ ВЫ БЛИН")); lcd.setCursor(5, 1); lcd.print(F("ДАЁТЕ!")); mp3_play (20); // Проигрываем "mp3/0020.mp3" delay(100); break; case 18: //ЗА МИР ВО ВСЕМ МИРЕ lcd.setCursor(5, 0); lcd.print(F("ЗА МИР")); lcd.setCursor(2, 1); lcd.print(F("ВО ВСЕМ МИРЕ")); delay(2000); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("И БОЛЬШИЕ СИСЬКИ")); lcd.setCursor(5, 1); lcd.print("!!!!"); break; case 19: //ЗА НАС С ВАМИ lcd.setCursor(1, 0); lcd.print(F("ЗА НАС С ВАМИ")); lcd.setCursor(1, 1); lcd.print(F("И ХРЕН С НИМИ")); delay(100); break; case 20: //ЗА ЖЕНЩИН! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА ЖЕНЩИН!")); mp3_play (15); // Проигрываем "mp3/0015.mp3" delay(100); break; case 21: //ЖЕЛАЮ ЧТОБЫ ВСЕ lcd.setCursor(0, 0); lcd.print(F("ЖЕЛАЮ ЧТОБЫ ВСЕ")); lcd.setCursor(5, 1); lcd.print(F("!!!!")); mp3_play (31); // Проигрываем "mp3/0031.mp3" delay(100); break; case 22: //ХЛОПНУТЬ ПО РЮМАШКЕ lcd.setCursor(0, 0); lcd.print(F("А НЕ ХЛОПНУТЬ ЛИ")); lcd.setCursor(1, 1); lcd.print(F("НАМ ПО РЮМАШКЕ?")); mp3_play (31); // Проигрываем "mp3/0031.mp3" delay(3500); lcd.clear(); lcd.setCursor(1, 0); lcd.print(F("ЗАМЕТЬТЕ, НЕ Я")); lcd.setCursor(1, 1); lcd.print(F("ЭТО ПРЕДЛОЖИЛ!")); break; } delay(2000); num++; if(num>17) { num=0; } } 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(255, 0, 255)); 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 (15);// устанвливаем громкость 30 delay (100); mp3_play (1); // Проигрываем "mp3/0001.mp3"(0001_get started!.mp3) delay (100); lcd.init();// initialize the lcd lcd.backlight(); lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(1, 1); lcd.print(F("НАА-ЧАА-ЛИИИИ!")); delay (2500); 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(); // Включаем насос lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("П Р О М Ы В К А")); lcd.setCursor(2, 1); lcd.print("<><><><><><>"); } } //После отпускания кнопки , обрабатываем 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("AUTO"); //Начало автоматического разлива oled_naliv(MenuFlag, Drink, DrinkCount); // Выводим на экран наливаем ... 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, Drink ); ServoParking(); delay(1000); Tost(); CvetoMuzik(); oled_auto(Drink); } else { lcd.setCursor(7, 1); lcd.print(F("НЕТ РЮМОК!")); 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("RUCHNOY" + String(DrinkCount)); oled_naliv(MenuFlag, Drink, DrinkCount); // Выводим на экран наливаем ... 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, Drink ); // Выводим на экран налито ... 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; } }219bytenum=0;// 0...19Вынеси после 49 строчки.
Сори повторился
#include <LCD_1602_RUS.h> #include <Servo.h> #include "Adafruit_NeoPixel.h" #include <SoftwareSerial.h>//добавляем библиотеки #include <DFPlayer_Mini_Mp3.h>//добавляем библиотеку МП3 плейера LCD_1602_RUS lcd(0x27, 16, 2); //Подключение экрана А4-SDA-зеленый, А5-SCL-желтый 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[] = {100, 100, 100, 100, 100}; //Серво const int PIN_SERVO = 9; Servo servo; //Позиция каждой рюмки const byte Rumka_pos[] = {3, 50, 98, 145, 179}; //12 - 48 - 90 - 135 - 174 const byte servo_speed = 10; // Скорость поворота серво, 10 - норм, 20 медленно, 30 очень медленно byte Menu = 0; byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в Главном меню. 1 Вошли в меню Авто, 2 вошли в Ручное управление byte Drink = 20; // По умолчанию в рюмку наливаем 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 = 5500; //-------- 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); byte num = 0 // 0...22 //------- 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(byte Menu) { lcd.clear(); lcd.setCursor(3, 0); lcd.print(F("РАЗЛИВАТОР")); lcd.setCursor(0, 1); lcd.print(F(">")); lcd.setCursor(15, 1); lcd.print(F("<")); switch (Menu) { case 0: lcd.setCursor(6, 1); lcd.print(F("АВТО")); break; case 1: lcd.setCursor(2, 1); lcd.print(F("РУЧНОЙ РЕЖИМ")); break; case 2: lcd.setCursor(4, 1); lcd.print(F("ПРОМЫВКА")); break; } } // выводит строчку по чуть чуть, в самый раз и тд. Передается номер строки, на которой выводить сообщение void DrinkInfo(byte pos) { Serial.println(F("INFO_DRINK")); lcd.setCursor(0, 1); if (Drink < 15) { // lcd.setCursor(0, 1); lcd.print(F(" НИ О ЧЕМ ")); } else if (Drink < 28) { // lcd.setCursor(0, 1); lcd.print(F(" ПО ЧУТЬ - ЧУТЬ ")); } else if (Drink < 38) { // lcd.setCursor(0, 1); lcd.print(F(" В САМЫЙ РАЗ ")); } else if (Drink < 48) { // lcd.setCursor(0, 1); lcd.print(F(" ПО ПОЛНОЙ ")); } else { // lcd.setCursor(0, 1); lcd.print(F(" ДО КРАЕВ ")); } } // Меню Авто режим void oled_auto(int Drink) { Serial.println(F("MENU_AUTO")); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("HАЛИТЬ ПО")); lcd.setCursor(10, 0); lcd.print(Drink); Serial.println(Drink); lcd.setCursor(13, 0); lcd.print(F("мЛ?")); DrinkInfo(57); } // Меню Ручной режим void oled_manual(int DrinkCount, int Drink) { Serial.println(F("MENU_RUCHN")); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("HАЛИТЬ ПО")); lcd.setCursor(10, 0); lcd.print(Drink); lcd.setCursor(13, 0); lcd.print(F("мЛ?")); Serial.println(Drink); lcd.setCursor(0, 1); lcd.print(F(" В РЮМ")); lcd.setCursor(5, 1); lcd.print(DrinkCount); Serial.println(DrinkCount); if (DrinkCount == 1) { lcd.setCursor(10, 1); lcd.print(F("КУ ")); } else if (DrinkCount <= 4 ) { lcd.setCursor(10, 1); lcd.print(F("КИ ")); } else { lcd.setCursor(10, 1); lcd.print(F("ОК ")); } } // Меню налива void oled_naliv(int MenuFlag, int Drink, int DrinkCount) { Serial.println(F("NALIVAIU")); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("НАЛИВАЮ ПО")); lcd.setCursor(11, 0); lcd.print(Drink); Serial.println(Drink); lcd.setCursor(14, 0); lcd.print(F("мЛ")); lcd.setCursor(0, 1); lcd.print(F(" В")); lcd.setCursor(5, 1); lcd.print(DrinkCount); Serial.println(DrinkCount); lcd.setCursor(7, 1); lcd.print(F("РЮМ")); if (DrinkCount == 1) { lcd.setCursor(10, 1); lcd.print(F("КУ ")); } else if (DrinkCount <= 4 ) { lcd.setCursor(10, 1); lcd.print(F("КИ ")); } else { lcd.setCursor(10, 1); lcd.print(F("ОК ")); } } // Меню налито void oled_nalito(int MenuFlag, int Nalito, int Drink) { Serial.println(F("NALITO")); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("HАЛИТО ПО")); lcd.setCursor(11, 0); lcd.print(Drink); Serial.println(Drink); lcd.setCursor(14, 0); lcd.print(F("мЛ")); lcd.setCursor(0, 1); lcd.print(F(" В")); lcd.setCursor(5, 1); lcd.print(Nalito); lcd.setCursor(7, 1); lcd.print(F("РЮМ")); Serial.println(Nalito); if (Nalito == 1) { lcd.setCursor(10, 1); lcd.print(F("КУ ")); } else if (Nalito <= 4 ) { lcd.setCursor(10, 1); lcd.print(F("КИ ")); } else { lcd.setCursor(10, 1); lcd.print(F("ОК ")); } } void Tost() { //Рандом - 1 Serial.println(F("Tost")); delay (100); lcd.clear(); switch (num) { Serial.println(num); delay (100); lcd.clear(); switch (num) { //switch (random(20)) { // 0...19 case 0: //ЗА ВСТРЕЧУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ВСТРЕЧУ!")); mp3_play (2); // Проигрываем "mp3/0002.mp3" delay(100); break; case 1: //ЗА КРАСОТУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА КРАСОТУ!")); mp3_play (3); // Проигрываем "mp3/0003.mp3" delay(100); break; case 2: //"ЗА ДРУЖБУ!" lcd.setCursor(7, 0); lcd.print(F("НУ,"));// lcd.setCursor(3, 1); lcd.print(F("ЗА ДРУЖБУ!")); mp3_play (4); // Проигрываем "mp3/0004.mp3" delay(100); break; case 3: //"ЗА БРАТСТВО! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА БРАТСТВО!")); mp3_play (5); // Проигрываем "mp3/0005.mp3" delay(100); break; case 4: //ЗА СПРАВЕДЛИВОСТЬ! lcd.setCursor(5, 0); lcd.print(F("НУ, ЗА")); lcd.setCursor(1, 1); lcd.print(F("СПРАВЕДЛИВОСТЬ!")); mp3_play (6); // Проигрываем "mp3/0006.mp3"11 delay(100); break; case 5: //ЗА РЫБАЛКУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА РЫБАЛКУ!")); mp3_play (7); // Проигрываем "mp3/0007.mp3" delay(100); break; case 6: //ЗА ИСКУССТВО! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ИСКУССТВО!")); mp3_play (8); // Проигрываем "mp3/0008.mp3" delay(100); break; case 7: //ЗА РАЗУМ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА РАЗУМ!")); mp3_play (9); // Проигрываем "mp3/0009.mp3" delay(100); break; case 8: //ЗА ИСТИННЫХ ЖЕНЩИН! lcd.setCursor(5, 0); lcd.print(F("НУ, ЗА")); lcd.setCursor(0, 1); lcd.print(F("ИСТИННЫХ ЖЕНЩИН!!")); mp3_play (10); // Проигрываем "mp3/0010.mp3" delay(100); break; case 9: //ЗА ПОНИМАНИЕ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ПОНИМАНИЕ!")); mp3_play (11); // Проигрываем "mp3/0011.mp3" delay(100); break; case 10: //ЗА ЕДИНЕНИЕ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(2, 1); lcd.print(F("ЗА ЕДИНЕНИЕ!")); mp3_play (13); // Проигрываем "mp3/0013.mp3" delay(100); break; case 11: //ЗА ПОБЕДУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА ПОБЕДУ!")); mp3_play (16); // Проигрываем "mp3/0016.mp3" delay(100); break; case 12: //ЗА РОДИНУ! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА РОДИНУ!")); mp3_play (21); // Проигрываем "mp3/0021.mp3" delay(100); break; case 13: //ЧТОБ ГОЛОВА НЕ ТРЕЩАЛА! lcd.setCursor(0, 0); lcd.print(F("НУ, ЧТОБ ГОЛОВА")); lcd.setCursor(2, 1); lcd.print(F("НЕ ТРЕЩАЛА!")); mp3_play (17); // Проигрываем "mp3/0017.mp3" delay(100); break; case 14: //ЗА СОЛИДНОЕ МУЖСКОЕ МОЛЧАНИЕ lcd.setCursor(0, 0); lcd.print(F("НУ, ЗА СОЛИДНОЕ"));//НУ, lcd.setCursor(0, 1); lcd.print(F("МУЖСКОЕ МОЛЧАНИЕ!")); mp3_play (12); // Проигрываем "mp3/0012.mp3" delay(100); break; case 15: //ЧТОБ МОРЩИЛО НАС МЕНЬШЕ! lcd.setCursor(0, 0); lcd.print(F("НУ,ЧТОБ МОРЩИЛО")); lcd.setCursor(2, 1); lcd.print(F("НАС МЕНЬШЕ ЧЕМ")); mp3_play (18); // Проигрываем "mp3/0018.mp3" delay(100); break; case 16: //ЧТОБ В СТОРОНУ НЕ ВИЛЬНУЛО! lcd.setCursor(0, 0); lcd.print(F("НУ,ЧТОБ В СТОРО-")); lcd.setCursor(0, 1); lcd.print(F("НУ НЕ ВИЛЬНУЛО!")); mp3_play (19); // Проигрываем "mp3/0019.mp3" delay(100); break; case 17: //НУ ВЫ БЛИН ДАЁТЕ! lcd.setCursor(3, 0); lcd.print(F("НУ ВЫ БЛИН")); lcd.setCursor(5, 1); lcd.print(F("ДАЁТЕ!")); mp3_play (20); // Проигрываем "mp3/0020.mp3" delay(100); break; case 18: //ЗА МИР ВО ВСЕМ МИРЕ lcd.setCursor(5, 0); lcd.print(F("ЗА МИР")); lcd.setCursor(2, 1); lcd.print(F("ВО ВСЕМ МИРЕ")); delay(2000); lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("И БОЛЬШИЕ СИСЬКИ")); lcd.setCursor(5, 1); lcd.print("!!!!"); break; case 19: //ЗА НАС С ВАМИ lcd.setCursor(1, 0); lcd.print(F("ЗА НАС С ВАМИ")); lcd.setCursor(1, 1); lcd.print(F("И ХРЕН С НИМИ")); delay(100); break; case 20: //ЗА ЖЕНЩИН! lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(3, 1); lcd.print(F("ЗА ЖЕНЩИН!")); mp3_play (15); // Проигрываем "mp3/0015.mp3" delay(100); break; case 21: //ЖЕЛАЮ ЧТОБЫ ВСЕ lcd.setCursor(0, 0); lcd.print(F("ЖЕЛАЮ ЧТОБЫ ВСЕ")); lcd.setCursor(5, 1); lcd.print(F("!!!!")); mp3_play (31); // Проигрываем "mp3/0031.mp3" delay(100); break; case 22: //ХЛОПНУТЬ ПО РЮМАШКЕ lcd.setCursor(0, 0); lcd.print(F("А НЕ ХЛОПНУТЬ ЛИ")); lcd.setCursor(1, 1); lcd.print(F("НАМ ПО РЮМАШКЕ?")); mp3_play (31); // Проигрываем "mp3/0031.mp3" delay(3500); lcd.clear(); lcd.setCursor(1, 0); lcd.print(F("ЗАМЕТЬТЕ, НЕ Я")); lcd.setCursor(1, 1); lcd.print(F("ЭТО ПРЕДЛОЖИЛ!")); break; } delay(2000); if (++num > 22) num = 0; } } 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(255, 0, 255)); 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 (15);// устанвливаем громкость 30 delay (100); mp3_play (1); // Проигрываем "mp3/0001.mp3"(0001_get started!.mp3) delay (100); lcd.init();// initialize the lcd lcd.backlight(); lcd.setCursor(7, 0); lcd.print(F("НУ,")); lcd.setCursor(1, 1); lcd.print(F("НАА-ЧАА-ЛИИИИ!")); delay (2500); 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(); // Включаем насос lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("П Р О М Ы В К А")); lcd.setCursor(2, 1); lcd.print("<><><><><><>"); } } //После отпускания кнопки , обрабатываем 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("AUTO"); //Начало автоматического разлива oled_naliv(MenuFlag, Drink, DrinkCount); // Выводим на экран наливаем ... 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, Drink ); ServoParking(); delay(1000); Tost(); CvetoMuzik(); oled_auto(Drink); } else { lcd.setCursor(7, 1); lcd.print(F("НЕТ РЮМОК!")); 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("RUCHNOY" + String(DrinkCount)); oled_naliv(MenuFlag, Drink, DrinkCount); // Выводим на экран наливаем ... 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, Drink ); // Выводим на экран налито ... 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; } }тока либ у меня нет, я не проверял.
Здесь необходимые библиотеки: https://yadi.sk/d/iSC-hQ6K3KCJCg
Ок, учту
Подскажите сканер не видит i2c, что может быть
Все что угодно, от неисправности самого проверяемого устройства до неправильного подключения. Другие устройства сканер видит? Какое устройство сканируешь?
Дисплей 1602а