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

Sergei36rus
Offline
Зарегистрирован: 27.08.2018

нужен человек который поможет и с подключение и с написанием скетча.

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

У меня есть, но себе, сцуко, всегда больше наливает! ;)

 

Модератор!!! Просьба ко всем участникам форума: Тема сильно разрослась, обновляется медленно, не давите кнопку "Отправить", не плодите дублирующих сообщений. Спасибо.

Sergei36rus
Offline
Зарегистрирован: 27.08.2018

а скетч можно увидеть? если не секрет конечно

 

vvadim
Offline
Зарегистрирован: 23.05.2012
karamzin01
Offline
Зарегистрирован: 08.03.2018

maslachenko767@mail.ru могу даже прислать фото того, что делал сам для себя)

DrProg
Offline
Зарегистрирован: 07.08.2015

Разливать наклонением бутылки (красиво) или дозатором (просто). Стопки движутся или стоят? Стопка ставится и наливается или выплевывается из раздатчика?

m_t
Offline
Зарегистрирован: 29.03.2012
Напишите подробнее (какие варианты бутылок, рюмок, потребителей и т.п.) на почту
m_t01@mail.ru
в сообщении указывайте страницу объявления
 
Viblis
Offline
Зарегистрирован: 04.11.2016

Скетч там есть по ссылке в Ютюбе

#include <OLED_I2C.h>
#include <Servo.h>
#include <FastLED.h> 

#define pot A0//пин потенциометра
#define button 3//пин кнопки 3
#define relPin 2// реле на 2 пин
#define LED_COUNT 15// Указываем, какое количество пикселей у нашей ленты.
#define LED_PIN 5// Указываем, к какому порту подключен вход ленты DIN.
#define BRIGHTNESS 180 //яркость ленты 0-255
// серва подключается к порту 9
CRGB strip[LED_COUNT];//подключаем ленту
OLED  myOLED(SDA, SCL, 8);
Servo myservo;
 
extern uint8_t RusFont[];//русский шрифт 
extern uint8_t MediumNumbers[];//шрифт средних чисел


byte pos = 9; // Переменная,в которой хранится позиция сервы
#define pos0 9 //Позиция парковки
#define pos1 39 //Позиция 1 стакана
#define pos2 56 //Позиция 2 стакана
#define pos3 73 //Позиция 3 стакана
#define pos4 91 //Позиция 4 стакана
#define pos5 109 //Позиция 5 стакана
#define tcr1 750//порог ИК датчика 1
#define tcr2 930//порог ИК датчика 2
#define tcr3 820//порог ИК датчика 3
#define tcr4 870//порог ИК датчика 4
#define tcr5 970//порог ИК датчика 5
bool flag=0;   // флаг кнопки
int ml=0;//переменная для отображения милилитров
int doza = 1000;      // объем для налива в микросек (не более 40 мл=2920 при испыт. напряжен)
int led_num = 0; //переменная с номером пикселя ленты
int previous_led_num = 0;//переменная с номером предыдущего пикселя ленты
int i=0;//переменная адрес пикселя
byte rum=0; //количечтво рюмок
 
void setup()
{
pinMode(pot, INPUT);//пин потенциометра
pinMode(button ,INPUT); // кнопка 
digitalWrite(button ,HIGH); // подключаем встроенный подтягивающий резистор кнопки
pinMode(relPin, OUTPUT); //реле на выход
myOLED.begin();//инициализация дисплея
FastLED.addLeds<NEOPIXEL, LED_PIN >(strip, LED_COUNT);//инициализация ленты(тип, пин(лента, кол-во пикселей)
FastLED.setBrightness( BRIGHTNESS );//устанавливаем яркость ленты
 //Serial.begin(9600);
}

void loop()
{

     while(1)
     {
      vol();
      lightLed();
      check();
        if (digitalRead(button)==LOW&&flag==0)
        {
          flag=1;
          break;
        }
      }
   
   /*  for (i = 9; i >=0; i--)//потушим пиксели 
    {
      strip[i] = CRGB::Black; // черный цвет после налива
      FastLED.show();
      delay(100);
    }
    */
// выводим выбранный объем перед наливом
    myOLED.clrScr();  
    myOLED.setFont(RusFont);
    myOLED.print("YFKBDF>", CENTER, 17);
   if(ml < 10)
   {
    myOLED.print("YB J XTV", CENTER, 30);
   } else if(ml < 25)
   {
    myOLED.print("GJ XENM-XENM", CENTER, 30);
   }
   else if(ml < 36)
   {
    myOLED.print("D CFVSQ HFP", CENTER, 30);
   }
    else if(ml < 40)
   {
    myOLED.print("GJ GJKYJQ", CENTER, 30);
   }
   else if(ml <= 40)
   {
    myOLED.print("LJ RHFTD", CENTER, 30);
   }
myOLED.update(); 
myservo.attach(9);
myservo.write(pos0);

    //1 стакан
 for (pos = pos0; pos <= pos1; pos += 1) 
 { 
    myservo.write(pos);          
    delay(12);                     
  }
  delay(10);
  myservo.detach();
  //определение наличия стакана
  int tcrt1 = analogRead(A1); 
  if( tcrt1<tcr1)
  {
  i=14;//адрес пикселя под 1 стаканом
  pump();
  }

//2 стакан
myservo.attach(9);
  for (pos = pos1; pos <= pos2; pos += 1)
  { 
    myservo.write(pos);             
    delay(12);                       
  }
  delay(10);
 myservo.detach();
  int tcrt2 = analogRead(A2);
  if( tcrt2<tcr2)
  {
  i=13;//адрес пикселя под 2 стаканом
  pump();
  }


//3 стакан
myservo.attach(9);
 for (pos = pos2; pos <= pos3; pos += 1)
 { 
    myservo.write(pos);              
    delay(12);                  
  }
  delay(10);
  myservo.detach();
  int tcrt3 = analogRead(A3);
  //Serial.println(tcrt3);
  if( tcrt3<tcr3)
  {
  i=12;//адрес пикселя под 3 стаканом
  pump();
  }

//4 стакан
myservo.attach(9);
  for (pos = pos3; pos <= pos4; pos += 1)
  { 
    myservo.write(pos);            
    delay(12);                      
  }
  delay(10);
  myservo.detach();
  int tcrt4 = analogRead(A6);
  if( tcrt4<tcr4)
  {
  i=11;//адрес пикселя под  стаканом
  pump();
  }

//5 стакан
myservo.attach(9);
 for (pos = pos4; pos <= pos5; pos += 1)
 { 
    myservo.write(pos);             
    delay(12);                     
  }
  delay(10);
  myservo.detach();
  int tcrt5 = analogRead(A7);
  if( tcrt5<tcr5)
  {
  i=10;//адрес пикселя под  стаканом
  pump();
  }

 //парковка
  myservo.attach(9);
  for (pos = pos5; pos >= pos0; pos -= 1)
  { 
    myservo.write(pos);              
    delay(7);                      
  }
  delay(200);
  myservo.detach();

     // выводим текст по окончании и ожидаем нажатия кнопки для повтора налива

   while(1)
   {
     if (digitalRead(button)==LOW&&flag==1)
        {
          flag=0;
          rum=0;
          break;
       }
        if( rum!=0)
      {
      myOLED.clrScr();  
      myOLED.setFont(RusFont);
      myOLED.print("<SKJ YFKBNJ GJ", 0, 5); //было налито по ml в rum рюмок
      myOLED.print("D", 0, 28); //в
      myOLED.print("Vk", RIGHT, 5); //в
      myOLED.print("YF:VBNT RYJGRE -JR-", 0, 50); //нажми ОК
    
       if(rum==1)
       {
         myOLED.setFont(RusFont);
          myOLED.print("H>VRE",24, 28);
        }
        else if( rum==5)
        {
          myOLED.setFont(RusFont);
           myOLED.print("H>VJR", 24, 28);
        }
       else if(rum==2 || rum==3 || rum==4 )
        {
          myOLED.setFont(RusFont);
          myOLED.print("H>VRB", 24, 28);
         }
   
       myOLED.setFont(MediumNumbers);
       myOLED.printNumI(ml,87,0);
       myOLED.printNumI(rum,10,23);
       myOLED.update();
       }
   else
   {
     myOLED.clrScr();  
     myOLED.setFont(RusFont);
     myOLED.setFont(RusFont);
     myOLED.print("NS LEHFR?", CENTER, 10);// ты дурак?
     myOLED.print("GJCNFDM H>VRB B", CENTER, 25);// поставь рюмку!
     myOLED.print("YF:VB RYJGRE -JR-", CENTER, 40); //нажми ОК
     myOLED.update();
   }
 }
   //блок светоанимации после налива и нажатия кнопки
      for (int k = 0; k <2; k++)
      {
      for (i = 0; i <=8; i++)
      {
      strip[i] = CRGB::Blue; //  цвет после налива
   
      strip[i+1] = CRGB::Red;
    
      FastLED.show();
       delay(30);
      }
  
      for (i = 8; i >=0; i--)
      {
      strip[i] = CRGB::Red; //  цвет после налива
     
      strip[i+1] = CRGB::Blue;
  
      FastLED.show();
       delay(30);
      }
     }
     for (i = 0; i <=8; i++)
      {
      strip[i] = CRGB::Blue; //  цвет после налива
   
      strip[i+1] = CRGB::Red;
    
      FastLED.show();
       delay(30);
      }
     for (i = 9; i >=0; i--)//потушим пиксели 
      {
      strip[i] = CRGB::Black; // черный цвет после налива
      delay(30);
      FastLED.show();
      }
      
}

void vol()// ф-я выбора объема на дисплее
{
 
    ml = analogRead(pot);
    ml = map(ml, 0, 1000, 1, 40);// считываем напряж с потенц 0-1023 и переводим в интервал 0-40
    myOLED.clrScr();  
    myOLED.setFont(MediumNumbers);
    myOLED.printNumI(ml,40,25);
    myOLED.setFont(RusFont);
    myOLED.print("DS<THBNT J<}TV", CENTER, 0);// Выберите объем
    myOLED.print("YFGBNRF",CENTER,12);// от 1 до 40 мл
    myOLED.print("Vk",66,33);// 
    
   if(ml < 10) myOLED.print("YB J XTV", CENTER, 50);// ни о чем
   else if(ml < 21) myOLED.print("GJ XENM-XENM", CENTER, 50);// по чуть-чуть
   else if(ml < 32) myOLED.print("D CFVSQ HFP", CENTER, 50);// в самый раз
   else if(ml < 40) myOLED.print("GJ GJKYJQ", CENTER, 50);// по полной
   else if(ml <= 40) myOLED.print("LJ RHFTD", CENTER, 50);// до краев
   myOLED.update();  
}
void lightLed()//ф-я зажигающая шкалу
{
  led_num = map(analogRead(pot), 0, 1000, 0, 10);// считываем напряж с потенц 0-1000 и переводим в интервал 0-10
  if(led_num > previous_led_num)
  {
     setLed();
  } else if(led_num < previous_led_num)
  {
     // Выключаем лишние светодиоды.
     for (int i = (previous_led_num - 1); i >= led_num; i--)
     {
       strip[i] = CRGB::Black; // Черный цвет, т.е. выключено.
     }
     FastLED.show();
     delay(10);
     setLed();
  }
  FastLED.show();
  delay(10);
  previous_led_num = led_num;
}

void setLed()
{
   if(led_num < 5)
   {
      chooseColour(CRGB::Orange);
   } else if(led_num < 8)
   {
      chooseColour(CRGB::Green);
   }else if(led_num < 11)
   {
      chooseColour(CRGB::Red);
   }
}

void chooseColour(CRGB colour)
{
  if(led_num == 5 || led_num == 8 || led_num < previous_led_num)
  {
    for (int j = 0; j < led_num; j++)
    {
      strip[j] = colour;
    }
  } else
  {
    for (int j = previous_led_num; j < led_num; j++)
    {
      strip[j] = colour;
    }
  }
}


void pump() //ф-я, включающая насос
{
  doza = map(ml, 1, 40, 125, 4700);// переводим знач перем ml интервала 0-40 в doza 0-2920
  delay(300); //ждем 0.3 секунды
  digitalWrite(relPin, HIGH);//вкл реле
  strip[i] = CRGB::Red; // красный пиксель на i адресе
  FastLED.show();
  delay(doza);// 2920=40мл
  digitalWrite(relPin, LOW);//выкл реле
  strip[i] = CRGB::Green; // зеленый пиксель на i адресе
  FastLED.show();
  rum+=1;
  delay(1500);
}
void check()
{  //проверка наличия стакана и включение лампочки под присутсвующим
  if( analogRead(A1)<tcr1) strip[14] = CRGB::Indigo;
   else strip[14] = CRGB::Black;
  if( analogRead(A2)<tcr2) strip[13] = CRGB::Indigo;
   else strip[13] = CRGB::Black;
  if( analogRead(A3)<tcr3) strip[12] = CRGB::Indigo;
   else strip[12] = CRGB::Black;
  if( analogRead(A6)<tcr4) strip[11] = CRGB::Indigo;
   else strip[11] = CRGB::Black;
  if( analogRead(A7)<tcr5) strip[10] = CRGB::Indigo;
   else strip[10] = CRGB::Black;
  FastLED.show();
 /* 
  myOLED.setFont(MediumNumbers);
    myOLED.printNumI(analogRead(A1),0,0);
    myOLED.printNumI(analogRead(A2),45,0);
    myOLED.printNumI(analogRead(A3),90,0);
    myOLED.printNumI(analogRead(A6),0,20);
    myOLED.printNumI(analogRead(A7),45,20);
    myOLED.update();  
  */
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Судя по исходнику - писали сами наливаторы. С таким можно и в минус уйти или спиться, пока выправишь.

Alexandsvoi
Offline
Зарегистрирован: 11.07.2017

Sergei36rus пишет:

нужен человек который поможет и с подключение и с написанием скетча.

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

 

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

Детали на почту berdnikiv@mail.ru

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

УУУ ...доверить такое святое дело роботам )))

Maximkms
Offline
Зарегистрирован: 17.07.2019

А у меня вопрос, в самом конце кода "включение лампочки под присутствующим". Там в схеме нет лампочки. Куда ее подключать?

Stoun
Offline
Зарегистрирован: 28.06.2017

Судя по скетчу к пинам A1, A2, A3, A5, A7. Трехцветные светодиоды, под каждую тару.

Maximkms
Offline
Зарегистрирован: 17.07.2019

Автор выкладывал к коду еще и схему. В схеме к этим пинам подключены датчики TCRT5000

Maximkms
Offline
Зарегистрирован: 17.07.2019

Что бы новую тему не создавать напишу тут.
Нужна помощь в написании кода и схема такого устройства https://youtu.be/AABi3pihuvA

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Там же все координаты автора. В чем проблемма ? Сделать снова будет в разы дороже.

Maximkms
Offline
Зарегистрирован: 17.07.2019

Позавчера ночью автор из свободного доступа всю информацию убрал. На контакт пошел, но цену заломил. И ждать сказал до осени

Onkel
Offline
Зарегистрирован: 22.02.2016

Maximkms пишет:
Позавчера ночью автор из свободного доступа всю информацию убрал. На контакт пошел, но цену заломил. И ждать сказал до осени

Пишите ydom@mail.ru До осени не нужно будет ждать - напишу летом. Проверю на макете. так что вы получите на 100% проверенный рабочий код. ydom@mail.ru 

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

 Onkel, есть предложение: добавить  в схему DF Player mini (https://ru.aliexpress.com/item/32665891488.html?spm=a2g0o.cart.0.0.3cc13c00acZQHK)
(использовать библиотеку mp3TF, а не более распространенную DFPlayer-Mini-mp3, так как эта библиотека, предоставляя бОльшие возможности, генерит более компактныйи код) ,  для аудио воспроизведения "Тостов Михалыча" после розива:

   1    Ну,начали!
2    Ну, за встречу!
3    Ну, за красоту!
4    Ну, за дружбу!
5    Ну, за братство!
6    Ну, за справедливость!
7    Ну, за рыбалку!
8    Ну, за искусство!
9    Ну, за разум!
10    Ну, за истинных женщин! А их, уверяю вас, и у нас да и во всём мире, очень много! Ну, за женщин!
11    Ну, за понимание!
12    Ну, за солидное мужское молчание!
13    Ну, за единение!
14    Ну, за истинных женщин! А их, уверяю вас, и у нас да и во всём мире, очень много!
15    Ну, за женщин!
16    Ну, за победу!
17    Ну, чтоб голова не трещала!
18    Ну,чтоб не морщило
19    Ну, чтоб в сторону не вильнуло!
20    Ну,вы блин даете
21    Ну, за Родину!

Нарезка файлов имеется. 

Onkel
Offline
Зарегистрирован: 22.02.2016

DF Player mini управляется просто по usart, система команд открыта.

Можно и с плейером. Отчего бы не с плейером.

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

Нарезку на почту отправить?

Onkel
Offline
Зарегистрирован: 22.02.2016

Пока не нужно. Меня еще не наняли...

 

alrod
Offline
Зарегистрирован: 19.07.2019

Оставьте свою почту, пожалуйста.

 

Stoun
Offline
Зарегистрирован: 28.06.2017

brokly пишет:

Там же все координаты автора. В чем проблемма ? Сделать снова будет в разы дороже.

Да там уже все закрыто, стерто и все ушло в коммерцию.

shebalino2010
Offline
Зарегистрирован: 19.07.2019

Укого есть схема киньте на почту shebalino2010@yandex.ru. Спасибо

den-a2rh
Offline
Зарегистрирован: 07.01.2018

нужен человек который поможет и с подключение и с написанием скетча.

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

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

Есть собраный наливатор. Похож на тот , что в теме, но свой, могу сделать описание.

den-a2rh
Offline
Зарегистрирован: 07.01.2018

Ок, сделай, если не сложно

Sentiurev
Offline
Зарегистрирован: 01.08.2019

Ошибка компиляции.

invalid digit "8" in octal constant

Sentiurev
Offline
Зарегистрирован: 01.08.2019

ошибка компиляции

AlexVita
AlexVita аватар
Offline
Зарегистрирован: 09.06.2017

Схему скиньте на kb.bk@bk.ru буду блогодарен.

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

Тоже загорелся собрать собственный наливатор ))

Написал скетч, все управление одним энкодером, два режима работы  , автоматический по датчикам и ручной, прокачка системы.  

Скетч отлажен на 90 процентов, в принципе даже на 99 , жду помпу. Пока все на макетке собрано, на след. неделе сделаю печатную плату. 

Могу нарисовать схему и отдать скетч , только в обмен..

В обмен на нормальную идею из чего сделать долбаный краник , всю бошку сломал уже ( ЧТо бы цивильно выглядило. Ну и у автора там в новой версии какие то поддончики под рюмки. Просто оргстекло или чето другое ? У кого какие идеи , пишите. 

 

den-a2rh
Offline
Зарегистрирован: 07.01.2018

Напишите свою электронку... Подумаем в месте

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

Я кран сделал из трубки, детальки от патрубка водного фильтра и напечатал детальки на 3Д принтере:

 

Я за красотой не гнался, отрабатывал саму схему и принцип работы

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

den-a2rh пишет:
Напишите свою электронку... Подумаем в месте

Да лучше думать в этой теме ) Может еще кому то полезно будет. 

Выложу свой скетч . На супер-программера не претендую , если че ) 

В комментах вверху видно что куда подключать. 

#include <OLED_I2C.h>
#include <Servo.h>
#include "Adafruit_NeoPixel.h"

OLED  myOLED(SDA, SCL, 8); //Подключение экрана А4, А5
extern uint8_t MegaNumbers[];
extern uint8_t RusFont[];
extern uint8_t SmallFont[];
unsigned long currentTime;
unsigned long loopTime;
unsigned long ledTime;
// Переменные для энкодера -----------
const int pin_A = 2;       // Подключение вывода A (CLK) энкодера
const int pin_B = 3;       // Подключение вывода B (DT) энкодера
const int pin_SW = 4;       // Подключение вывода кнопки (SW) энкодера
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
unsigned char encoder_sw_prew = 1;
//Массив , обозначаем подключенные оптопары по выводам . Оптопары подключены, A0,A1,A2,A3,A6
byte  Optics[] = {0, 1, 2, 3, 6};
//Серво
const int PIN_SERVO = 9;
Servo servo;
//-------------------------
byte  Menu = 0;
byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в  Главном меню. 1 Вошли в меню Авто, 2 вошли в  Ручное управление
byte  Drink = 25; // По умолчанию в рюмку наливаем  20 мл.
const byte  max_Drink = 50; // Максимум в рюмку - 50 мл.
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, 2, 50, 300, 4000));
  digitalWrite(PIN_PUMP, 0);
}

int oled_menu(int Menu) {
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("Y F K B D F N J H"), CENTER, 0);
  myOLED.print(F("F D N J"), CENTER, 15);
  myOLED.print(F("H E X Y J Q "), CENTER, 30);
  myOLED.print(F("G H J V S D R F"), CENTER, 45);
  myOLED.setFont(SmallFont);
  myOLED.print(F(">"), LEFT, (Menu * 15) + 15);
  myOLED.print(F("<"), RIGHT, (Menu * 15) + 15);
  myOLED.update();

}
//  выводит строчку по чуть чуть, в самый раз и тд. Передается номер строки, на которой выводить сообщение
void DrinkInfo(byte pos) {
  if (Drink < 15) {
    myOLED.print(F("YB J XTV"), CENTER, pos);
  } else if (Drink < 28) {
    myOLED.print(F("GJ XENM - XENM"), CENTER, pos);
  } else if (Drink < 38) {
    myOLED.print(F("D CFVSQ HFP"), CENTER, pos);
  } else if (Drink < 48) {
    myOLED.print(F("GJ GJKYJQ"), CENTER, pos);
  } else {
    myOLED.print(F("LJ RHFTD"), CENTER, pos);
  }

}

void Tost() {
  randomSeed(currentTime);
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print(F("DSGMTV"), CENTER, 20); //Выпьем
  // Рандом - 1
  switch (random(11)) {
    case 0:
      myOLED.print(F("PF LHEPTQ!"), CENTER, 40); //За друзей
      break;
    case 1:
      myOLED.print(F("PF VBKS{ LFV!"), CENTER, 40); //За милых дам
      break;
    case 2:
      myOLED.print(F("PF PLJHJDMT!"), CENTER, 40); //За здоровье
      break;
    case 3:
      myOLED.print(F("PF ELFXE!"), CENTER, 40); //За удачу
      break;
    case 4:
      myOLED.print(F("PF VBH DJ DCTV VBHT!"), CENTER, 40); //За мир во всем мире
      break;
    case 5:
      myOLED.print(F("PF NT{ RNJ D VJHT!"), CENTER, 40); //За тех кто в море
      break;
    case 6:
      myOLED.print(F("PF K><JDM !"), CENTER, 40); //За любовь !
      break;
    case 7:
      myOLED.print(F("PF RHFCJNE !"), CENTER, 40); //За красоту !
      break;
    case 8:
      myOLED.print(F("PF DTPTYBT !"), CENTER, 40); //За везение !
      break;
    case 9:
      myOLED.print(F("PF HJLBYE !"), CENTER, 40); //За родину !
      break;
    case 10:
      myOLED.print(F("PF YFC C DFVB"), CENTER, 38); //За нас с вами
      myOLED.print(F("B {HTY C YBVB !"), CENTER, 55); //И хрен с ними
      break;

  }
  myOLED.update();

}

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

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

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

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


void oled_naliv(int MenuFlag) {
  myOLED.clrScr();
  myOLED.setFont(RusFont);
  myOLED.print((MenuFlag == 1) ? F("F D N J") : F("H E X Y J Q") , CENTER, 0);

  myOLED.print(F("Y F K B D F > "), CENTER, 27);
  DrinkInfo(47);
  myOLED.update();
}

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

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

void ServoNaliv(int rumka) {
  servo.attach(PIN_SERVO);
  for (int pos = servo.read(); pos <= rumka * 35; pos += 1) { // вращаем ротор от 0 до 180 градусов
    // с шагом в 1 градус
    servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos'
    delay(10); // ждем 15 миллисекунд, пока ротор сервы выйдет в заданную позицию
  }
  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(10); // ждем 15 миллисекунд, пока ротор сервы выйдет в заданную позицию
  }
  servo.detach();
}

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

void setup()  {
  // Serial.begin(9600);
  //  servo.attach(PIN_SERVO);
  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;
  //   Volume=EEPROM.read(0);
  myOLED.begin();
  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 <= 2 ) ? 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 = 2 : Drink++;
          oled_auto(Drink);
        } else if (MenuFlag == 2) {
          (Drink >= max_Drink ) ? Drink = 2 : Drink++;
          oled_manual(DrinkCount, Drink);
        }
      }

    }

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

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

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

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

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

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

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

    if (currentTime >= (ledTime + 300)) {
      //Опрашиваем оптопары ... Если рюмка поставлена , светодиод светится синим, нет ничего - не светится
      for (int i = 0; i < 5; i++) {

        int val = analogRead(Optics[i]);     // считываем значение
        if (val > 1000) {
          strip.setPixelColor(i, strip.Color(0, 0, 255));
        } else {
          strip.setPixelColor(i, strip.Color(0, 0, 0));
        }

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

  }
}
den-a2rh
Offline
Зарегистрирован: 07.01.2018

А корпус из чего ты делать будешь?

rst
Offline
Зарегистрирован: 25.06.2018

Viblis пишет:

Скетч там есть по ссылке в Ютюбе

...
myOLED.print("NS LEHFR?", CENTER, 10);// ты дурак?
...

Когда после очередной рюмки уже слегка окосевший клиент в 10-й раз прочитает такое сообщение, то жить сему девайсу останется недолго....  ;))

AlexVita
AlexVita аватар
Offline
Зарегистрирован: 09.06.2017

Добрый день!

Схему распиновки элементов есть у кого?

den-a2rh
Offline
Зарегистрирован: 07.01.2018

У меня есть, на электронку кину

AlexVita
AlexVita аватар
Offline
Зарегистрирован: 09.06.2017

Скинь пожалуйста на почту если можешь.

kb.bk@bk.ru

 

Sany1122
Offline
Зарегистрирован: 05.08.2019

Скинь пожайлуста и мне. Sany1122@mail.ru

ladskiy
Offline
Зарегистрирован: 05.08.2019

Скинь пожалуйста на почту и мне ladskiy86@gmail.com

den-a2rh
Offline
Зарегистрирован: 07.01.2018

Кинь пожалуйста схему подключения к своему скетчу ,если не трудно... den260484@gmail.com

den-a2rh
Offline
Зарегистрирован: 07.01.2018

Схема пришла?

ladskiy
Offline
Зарегистрирован: 05.08.2019

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

lesha_59
Offline
Зарегистрирован: 05.08.2019

Скинь мне пожалуйста схему, скетч, и какие комплектующие нужно хочу попробовать собрать lesha_59@mail.ru.

Stoun
Offline
Зарегистрирован: 28.06.2017

den-a2rh пишет:
У меня есть, на электронку кину

А мне можно?
serg.egorov73@gmail.com

JohnnyEagle
Offline
Зарегистрирован: 06.08.2019

А можно и мне схемку этого чудного устройства, заранее спасибо!

fierybird777@gmail.com

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

stpavel, краник можно сделать из трубки от монтажной пены, аккуратно согнув "П" образно.

Перед тем как сгибать наполнить мелким песком, шланг силиконовый очень гибкий D6.0*1.5 покупал здесь

https://www.mirbeer.ru/catalog/pivovarenie/oborudovanie_1/trubki_shlangi_soedineniya/trubka_silikonovaya_d_6_0_1_5/

идеально подошщл к насосу и трубке.

Схемкой поделишся? forthomo@yandex.ru

 

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

Forthomo пишет:

stpavel, краник можно сделать из трубки от монтажной пены, аккуратно согнув "П" образно.

Перед тем как сгибать наполнить мелким песком, шланг силиконовый очень гибкий D6.0*1.5 покупал здесь

https://www.mirbeer.ru/catalog/pivovarenie/oborudovanie_1/trubki_shlangi_soedineniya/trubka_silikonovaya_d_6_0_1_5/

идеально подошщл к насосу и трубке.

Схемкой поделишся? forthomo@yandex.ru

 

В скетче комментарии, куда что подсоеденять , если  что-то не понятно, пиши , разъясню.

den-a2rh
Offline
Зарегистрирован: 07.01.2018

stpavel,я хочу попробовать сделать кран из дерева, найти подходяций по форме сук, разрезать вдоль и выбрать канву бор машинкой, проложить в конавку гибкую пищевую трубку и склеить две половины сука.....