Наливатор - автоматизированная машина, которая будет разливать алкоголь по стопкам.
- Войдите на сайт для отправки комментариев
 
      Пнд, 27/08/2018 - 14:58
          
      нужен человек который поможет и с подключение и с написанием скетча.
Наливатор - автоматизированная машина которая будет разливать алкоголь по стопкам.
          
У меня есть, но себе, сцуко, всегда больше наливает! ;)
Модератор!!! Просьба ко всем участникам форума: Тема сильно разрослась, обновляется медленно, не давите кнопку "Отправить", не плодите дублирующих сообщений. Спасибо.
а скетч можно увидеть? если не секрет конечно
7808543@gmail.com
maslachenko767@mail.ru могу даже прислать фото того, что делал сам для себя)
Разливать наклонением бутылки (красиво) или дозатором (просто). Стопки движутся или стоят? Стопка ставится и наливается или выплевывается из раздатчика?
Скетч там есть по ссылке в Ютюбе
#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(); */ }Судя по исходнику - писали сами наливаторы. С таким можно и в минус уйти или спиться, пока выправишь.
нужен человек который поможет и с подключение и с написанием скетча.
Наливатор - автоматизированная машина которая будет разливать алкоголь по стопкам.
День добрый, Сергей, на вашу задачу уже отозвался народ. Если вопрос еще не решили, я готов взяться и помочь вам.
Детали на почту berdnikiv@mail.ru
УУУ ...доверить такое святое дело роботам )))
А у меня вопрос, в самом конце кода "включение лампочки под присутствующим". Там в схеме нет лампочки. Куда ее подключать?
Судя по скетчу к пинам A1, A2, A3, A5, A7. Трехцветные светодиоды, под каждую тару.
Автор выкладывал к коду еще и схему. В схеме к этим пинам подключены датчики TCRT5000
Что бы новую тему не создавать напишу тут.
Нужна помощь в написании кода и схема такого устройства https://youtu.be/AABi3pihuvA
Там же все координаты автора. В чем проблемма ? Сделать снова будет в разы дороже.
Позавчера ночью автор из свободного доступа всю информацию убрал. На контакт пошел, но цену заломил. И ждать сказал до осени
Пишите ydom@mail.ru До осени не нужно будет ждать - напишу летом. Проверю на макете. так что вы получите на 100% проверенный рабочий код. ydom@mail.ru
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 Ну, за Родину!
Нарезка файлов имеется.
DF Player mini управляется просто по usart, система команд открыта.
Можно и с плейером. Отчего бы не с плейером.
Нарезку на почту отправить?
Пока не нужно. Меня еще не наняли...
Оставьте свою почту, пожалуйста.
Там же все координаты автора. В чем проблемма ? Сделать снова будет в разы дороже.
Да там уже все закрыто, стерто и все ушло в коммерцию.
Укого есть схема киньте на почту shebalino2010@yandex.ru. Спасибо
нужен человек который поможет и с подключение и с написанием скетча.
Наливатор - автоматизированная машина которая будет разливать алкоголь по стопкам
Есть собраный наливатор. Похож на тот , что в теме, но свой, могу сделать описание.
Ок, сделай, если не сложно
Ошибка компиляции.
invalid digit "8" in octal constant
ошибка компиляции
Схему скиньте на kb.bk@bk.ru буду блогодарен.
Тоже загорелся собрать собственный наливатор ))
Написал скетч, все управление одним энкодером, два режима работы , автоматический по датчикам и ручной, прокачка системы.
Скетч отлажен на 90 процентов, в принципе даже на 99 , жду помпу. Пока все на макетке собрано, на след. неделе сделаю печатную плату.
Могу нарисовать схему и отдать скетч , только в обмен..
В обмен на нормальную идею из чего сделать долбаный краник , всю бошку сломал уже ( ЧТо бы цивильно выглядило. Ну и у автора там в новой версии какие то поддончики под рюмки. Просто оргстекло или чето другое ? У кого какие идеи , пишите.
Напишите свою электронку... Подумаем в месте
Я кран сделал из трубки, детальки от патрубка водного фильтра и напечатал детальки на 3Д принтере:
Я за красотой не гнался, отрабатывал саму схему и принцип работы
Да лучше думать в этой теме ) Может еще кому то полезно будет.
Выложу свой скетч . На супер-программера не претендую , если че )
В комментах вверху видно что куда подключать.
#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; } }А корпус из чего ты делать будешь?
Скетч там есть по ссылке в Ютюбе
... myOLED.print("NS LEHFR?", CENTER, 10);// ты дурак? ...Когда после очередной рюмки уже слегка окосевший клиент в 10-й раз прочитает такое сообщение, то жить сему девайсу останется недолго.... ;))
Добрый день!
Схему распиновки элементов есть у кого?
У меня есть, на электронку кину
Скинь пожалуйста на почту если можешь.
kb.bk@bk.ru
Скинь пожайлуста и мне. Sany1122@mail.ru
Скинь пожалуйста на почту и мне ladskiy86@gmail.com
Кинь пожалуйста схему подключения к своему скетчу ,если не трудно... den260484@gmail.com
Схема пришла?
спасибо,схему получил, сегодня вечером начну собирать,завтра отпишусь о результатах.
Скинь мне пожалуйста схему, скетч, и какие комплектующие нужно хочу попробовать собрать lesha_59@mail.ru.
А мне можно?
serg.egorov73@gmail.com
А можно и мне схемку этого чудного устройства, заранее спасибо!
fierybird777@gmail.com
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, краник можно сделать из трубки от монтажной пены, аккуратно согнув "П" образно.
Перед тем как сгибать наполнить мелким песком, шланг силиконовый очень гибкий 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,я хочу попробовать сделать кран из дерева, найти подходяций по форме сук, разрезать вдоль и выбрать канву бор машинкой, проложить в конавку гибкую пищевую трубку и склеить две половины сука.....