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

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

kvirin1 пишет:
Ваша ссылка на диск не рабочая почему-то, может её надо обновить?

 https://yadi.sk/d/iSC-hQ6K3KCJCg

обновил, проверил работает.

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Спасибо тебе

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

Forthomo пишет:

kvirin1 пишет:
Ваша ссылка на диск не рабочая почему-то, может её надо обновить?

 https://yadi.sk/d/iSC-hQ6K3KCJCg

обновил, проверил работает.


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

https://yadi.sk/d/1DOedRRio4NsYA

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

stpavel пишет:
На передней панели экран LCD 1602 и энкодер управления.

наливатор красота!

но 1602, испортит все!

 

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

xDriver пишет:

но 1602, испортит все!

Такой не испортит  https://ru.aliexpress.com/i/32917189276.html правда ценник не гуманный.

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

xDriver пишет:

stpavel пишет:
На передней панели экран LCD 1602 и энкодер управления.

наливатор красота!

но 1602, испортит все!

 

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

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

Вариант с 1602

 

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

stpavel пишет:

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

я просто тут подумываю о мега наливаторе на ESP+ Nextion, останавливает пока только корпус, сам делать не хочу, ищу кому заказать...

если у вас с корпусом срастется можем поменяться на мозги ESP+ Nextion :) (если я все-же дозрею)

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

xDriver пишет:

stpavel пишет:

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

я просто тут подумываю о мега наливаторе на ESP+ Nextion, останавливает пока только корпус, сам делать не хочу, ищу кому заказать...

если у вас с корпусом срастется можем поменяться на мозги ESP+ Nextion :) (если я все-же дозрею)

Хорошо )

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

RW3 пишет:

Заметил что часто повторяются одни и те же тосты.подскажите как сделать воспроизведение всех тостов по кругу?

вот так попробуй блок Тост поправить, но предупреждаю я НЕ ПРОГРАММИСТ! Может кто поправит.

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;	
	}
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

поправляю

	num=++;
	if(num>17) {
	   num==0;	
	}

БРЕД!

нада так

	num++;
	if(num>17) {
	   num=0;	
	}

еще лаконичнее

	if(++num>17) {
	    num=0;	
	}

 

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

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

https://yadi.sk/d/iBAHJ_Fq8le9NQ

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

xDriver, можешь ГСЧ в блок Тост поправить, чтобы тосты не повторялись в течении одной сессии (посиделок)?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)

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

xDriver пишет:

могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)

будем считать включение девайса

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Forthomo пишет:

xDriver пишет:

могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)

будем считать включение девайса

еще раз, у нас N тостов, мы по ГСЧ отговорили все, что дальше?

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

RW3 пишет:

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

https://yadi.sk/d/iBAHJ_Fq8le9NQ

31 и 37 особенно колоритные, добавляю себе.

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

xDriver пишет:

Forthomo пишет:

xDriver пишет:

могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)

будем считать включение девайса

еще раз, у нас N тостов, мы по ГСЧ отговорили все, что дальше?

сброс, и заново.

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

xDriver пишет:

могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)

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

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

RW3 пишет:

xDriver пишет:

могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)

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

#411 и #412

Forthomo сделал, я поправил.

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

xDriver пишет:

RW3 пишет:

xDriver пишет:

могу, только если мне обЪясните что есть "одна сессия" , выпили по 18 рюмок что дальше, на 19, или предполагается что дальше никто не доживает :)

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

#411 и #412

Forthomo сделал, я поправил.

что то не получилось.компилируется с ошибками. может я чего не туда вставляю?

Скомпилировал, вечером попробую в железе

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

клади сюда, что пытаешься скомпилировать.

Rigikov
Offline
Зарегистрирован: 29.10.2018

Прошу прощения
я не программист можно ли адаптировать скетч под дисплей oled1.3 sh1106 i2c и на 6 рюмок ?

Zeerz85
Offline
Зарегистрирован: 24.09.2019

moder пишет:

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

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

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

Zeerz85 пишет:
moder пишет:

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

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

А прочитать 6-ю страницу вдумчиво не судьба?

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

Rigikov пишет:
Прошу прощения я не программист можно ли адаптировать скетч под дисплей oled1.3 sh1106 i2c и на 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}; 
byte  DrinkCount = 1; //По умолчанию, для ручного режима - 1 рюмка
const byte  max_DrinkCount = 6; //Максимальное кол-во рюмок - 6

 

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

moder пишет:

А кто-нибудь заморачивался с индикаций заряда батареи на этом дисплее, как в оригинальном изделии автора?

Можно тут почитать и применить https://m.habr.com/ru/post/390967/

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

Forthomo пишет:

Rigikov пишет:
Прошу прощения я не программист можно ли адаптировать скетч под дисплей oled1.3 sh1106 i2c и на 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}; 
byte  DrinkCount = 1; //По умолчанию, для ручного режима - 1 рюмка
const byte  max_DrinkCount = 6; //Максимальное кол-во рюмок - 6

 

Здесь проблемно будет добавить 6 рюмку, из за ограничения кол-ва аналоговых входов.  Если их 7, два используются для i2c ,один для определения заряда аккумов, остается только 5 .
Я у себя собираюсь использовать концевики ( микровыключатели ) , и подключать их через 74HC165, там практически нет ограничений по кол-ву цифровых входов. Оптопары мне не нравятся из за их глючности при ярком свете, необходимостью наклеивания всякой херни на рюмки,  итп.

 

Rigikov
Offline
Зарегистрирован: 29.10.2018

С рюмками разобрался а вот с дисплеем никак

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

Forthomo пишет:

RW3 пишет:

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

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)
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Rigikov пишет:
С рюмками разобрался а вот с дисплеем никак

Ну на него просто можно бумашку с натписями наклеить

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

stpavel пишет:

...один для определения заряда аккумов...

уже реализовал?

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

Forthomo пишет:

stpavel пишет:

...один для определения заряда аккумов...

уже реализовал?

Пока нет, но в этом никакой сложности не вижу.

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Forthomo пишет:

Zeerz85 пишет:
moder пишет:

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

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

А прочитать 6-ю страницу вдумчиво не судьба?


Спасибо тебе добрый человек

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

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

Zeerz85
Offline
Зарегистрирован: 24.09.2019

RW3 пишет:
Что за проблема с датчиками, то же не правильно работают?

По применению датчиков TCRT5000 без переделки и добавления инвертора.

Это только предположение, но возможно в скетче поправить всего две строчки

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

490 if (val > Optics_porog[i]) {

поменять ">" (больше) на "<" (меньше). Это лучше объяснит автор скетча stpavel.
Был бы датчик попробовал бы.

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Я поменял у меня все заработало

yct9
Offline
Зарегистрирован: 27.11.2015

Коментарии как отключить их..

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

yct9 пишет:

Коментарии как отключить их..

Да никак. Убогий движок. Добавляй в спам ))

Или ты не про рассылку ?

 

yct9
Offline
Зарегистрирован: 27.11.2015

stpavel пишет:

yct9 пишет:

Коментарии как отключить их..

Да никак. Убогий движок. Добавляй в спам ))

Или ты не про рассылку ?

 

Да, про рассылку. Кое-как получилось отключить 

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

xDriver пишет:

клади сюда, что пытаешься скомпилировать.

#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;

  }
}

 

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

 

219

byte num=0; // 0...19

 

Вынеси после 49 строчки.

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

Сори повторился

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
#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;

  }
}

тока либ у меня нет, я не проверял.

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

Здесь необходимые библиотеки: https://yadi.sk/d/iSC-hQ6K3KCJCg

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

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

Ок, учту

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Подскажите сканер не видит i2c, что может быть

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

Zeerz85 пишет:
Подскажите сканер не видит i2c, что может быть

Все что угодно, от неисправности самого проверяемого устройства до неправильного подключения. Другие устройства сканер видит? Какое устройство сканируешь?

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Дисплей 1602а