Наливатор,,,,,поправить код
- Войдите на сайт для отправки комментариев
Пнд, 08/02/2021 - 12:18
доброго дня всем,,,,,,так как я не совсем програмист,,,,ардуино можно сказать овладеваю по немногу учусь,,,,собрал наливатор ,,,,,все работает как надо но хотелось бы что бы в автомотическом режиме работал в таком режиме,,,,,,,рюмки налиты,снимаем рюмки,ставим рюмки и продолжается налив в поставленные рюмки ,,,,сейчас все работает но в автомотическом режиме работать начинает только после нажатия кнопки энкодера,,,,,код наливатора из этого форума,,,,,с создателями связаться не удается
#include <OLED_I2C.h> #include <Servo.h> #include "Adafruit_NeoPixel.h" #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> OLED myOLED(SDA, SCL, 8); //Подключение экрана А4-SDA-зеленый, А5-SCL-желтый extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; unsigned long currentTime; unsigned long loopTime; unsigned long ledTime; // Переменные для энкодера ----------- const int pin_A = 2; // Подключение вывода A (CLK) энкодера const int pin_B = 3; // Подключение вывода B (DT) энкодера const int pin_SW = 4; // Подключение вывода кнопки (SW) энкодера unsigned char encoder_A; unsigned char encoder_B; unsigned char encoder_A_prev = 0; unsigned char encoder_sw_prew = 1; //Массив , обозначаем подключенные оптопары по выводам . Оптопары подключены, A0,A1,A2,A3,A6 const byte Optics[] = {0, 1, 2, 3, 6}; // Значения порога срабатывания датчика для каждой рюмки const unsigned int Optics_porog[] = {1000,1000,1000,1000,1000}; //Серво const int PIN_SERVO = 9; Servo servo; //Позиция каждой рюмки const byte Rumka_pos[] = {15,45,90,140,175}; //53,69,84,101,117 const byte servo_speed=15; // Скорость поворота серво, 10 - норм, 20 медленно, 30 очень медленно byte Menu = 0; byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в Главном меню. 1 Вошли в меню Авто, 2 вошли в Ручное управление byte Drink = 15; // По умолчанию в рюмку наливаем 15 мл. //----- Минимальные и максимальные значения наполняемой жидкости и задержки для наполнения. const byte min_Drink = 5; // Минимум в рюмку - 5 мл. const byte max_Drink = 50; // Максимум в рюмку - 50 мл. // Калибровка работы насосика. Значения для налива min_Drink и max_Drink соотвественно const unsigned int min_Drink_delay = 300; const unsigned int max_Drink_delay = 6000; //-------- byte DrinkCount = 1; //По умолчанию, для ручного режима - 1 рюмка const byte max_DrinkCount = 5; //Максимальное кол-во рюмок - 5 // Насосик const byte PIN_PUMP = 12; // Светодиоды const int PIN_LED = 5;// Сюда подключаются светодиоды const int LED_COUNT = max_DrinkCount; Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800); //------- byte mp3_count=33; //Количество голосовых файлов на SD карте void pump_enable() { digitalWrite(PIN_PUMP, 1); //вкл реле } void pump_disable() { digitalWrite(PIN_PUMP, 0); //выкл реле } void pump_timer(byte Drink) { digitalWrite(PIN_PUMP, 1); //вкл реле delay(map(Drink, min_Drink, max_Drink, min_Drink_delay, max_Drink_delay)); digitalWrite(PIN_PUMP, 0); //выкл реле } void oled_menu(int Menu) { myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("N-34 *YFKBDFNJH*"), CENTER, 0);//Т-34 *НАЛИВАТОР* myOLED.print(F("FDNJ JUJYM"), CENTER, 25);//АВТО ОГОНЬ 15 myOLED.print(F("HEXYJQ PFHZL"), CENTER, 40);//РУЧНОЙ ЗАРЯД 30 myOLED.print(F("GHJRFXRF CBCNTVS"), CENTER, 55);//ПРОКАЧКА СИСТЕМЫ 45 myOLED.setFont(SmallFont); myOLED.print(F(">"), LEFT, (Menu * 15) + 25); // 15+15 myOLED.print(F("<"), RIGHT, (Menu * 15) + 25); // 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); mp3_play(random(mp3_count)+1); delay (5000);} /* myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("YE!"), CENTER, 20); //НУ! // Рандом - 1 switch (random(18)+1) { // case 0...17 case 0: myOLED.print(F("PF DCNHTXE!"), CENTER, 40); //ЗА ВСТРЕЧУ! mp3_play (2); // Проигрываем "mp3/0002.mp3" delay(100); break; case 1: myOLED.print(F("PF RHFCJNE!"), CENTER, 40); //ЗА КРАСОТУ! mp3_play (3); // Проигрываем "mp3/0003.mp3" delay(100); break; case 2: myOLED.print(F("PF LHE;,E!"), CENTER, 40); //ЗА ДРУЖБУ! mp3_play (4); // Проигрываем "mp3/0004.mp3" delay(100); break; case 3: myOLED.print(F("DS <KBY"), CENTER, 38); //ВЫ БЛИН myOLED.print(F("LFTNT!"), CENTER, 55); //ДАЕТЕ! mp3_play (20); // Проигрываем "mp3/0020.mp3" delay(100); break; case 4: myOLED.print(F("PF ,HFNCNDJ!"), CENTER, 40); //ЗА БРАТСТВО! mp3_play (5); // Проигрываем "mp3/0005.mp3" delay(100); break; case 5: myOLED.print(F("PF"), CENTER, 38); //за myOLED.print(F("CGHFDTLKBDJCNM!"), CENTER, 55); //СПРАВЕДЛИВОСТЬ! mp3_play (6); // Проигрываем "mp3/0006.mp3" delay(100); break; case 6: myOLED.print(F("PF HS,FKRE!"), CENTER, 40); //ЗА РЫБАЛКУ! mp3_play (7); // Проигрываем "mp3/0007.mp3" delay(100); break; case 7: myOLED.print(F("PF BCRECCNDJ!"), CENTER, 40); //ЗА ИСКУССТВО! mp3_play (8); // Проигрываем "mp3/0008.mp3" delay(100); break; case 8: myOLED.print(F("PF HFPEV!"), CENTER, 40); //ЗА РАЗУМ! mp3_play (9); // Проигрываем "mp3/0009.mp3" delay(100); break; case 9: myOLED.print(F("PF BCNBYYS["), CENTER, 38); //ЗА ИСТИННЫХ myOLED.print(F(":TYOBY!"), CENTER, 55); //ЖЕНЩИН! mp3_play (10); // Проигрываем "mp3/0010.mp3" delay(100); break; case 10: myOLED.print(F("PF GJYBVFYBT!"), CENTER, 40); //ЗА ПОНИМАНИЕ! mp3_play (11); // Проигрываем "mp3/0011.mp3" delay(100); break; case 11: myOLED.print(F("PF TLBYTYBT!"), CENTER, 40); //ЗА ЕДИНЕНИЕ! mp3_play (13); // Проигрываем "mp3/0013.mp3" delay(100); break; case 12: myOLED.print(F("PF GJ,TLE!"), CENTER, 40); //ЗА ПОБЕДУ! mp3_play (16); // Проигрываем "mp3/0016.mp3" delay(100); break; case 13: myOLED.print(F("PF HJLBYE!"), CENTER, 40); //ЗА РОДИНУ! mp3_play (21); // Проигрываем "mp3/0021.mp3" delay(100); break; case 14: myOLED.print(F("XNJ, UJKJDF"), CENTER, 38); //ЧТОБ ГОЛОВА myOLED.print(F("YT NHTOFKF!"), CENTER, 55); //НЕ ТРЕЩАЛА! mp3_play (17); // Проигрываем "mp3/0017.mp3" delay(100); break; case 15: myOLED.print(F("PF CJKBLYJT"), CENTER, 38); //ЗА СОЛИДНОЕ myOLED.print(F("VE;CRJT VJKXFYBT"), CENTER, 55); //МУЖСКОЕ МОЛЧАНИЕ mp3_play (12); // Проигрываем "mp3/0012.mp3" delay(100); break; case 16: myOLED.print(F("XNJ, VJHOBKJ"), CENTER, 38); //ЧТОБ МОРЩИЛО myOLED.print(F("YFC VTYMIT!"), CENTER, 55); //НАС МЕНЬШЕ! mp3_play (18); // Проигрываем "mp3/0018.mp3" delay(100); break; case 17: myOLED.print(F("XNJ, D CNJHJYE"), CENTER, 38); //ЧТОБ В СТОРОНУ myOLED.print(F("YT DBKMYEKJ!"), CENTER, 55); //НЕ ВИЛЬНУЛО! mp3_play (19); // Проигрываем "mp3/0019.mp3" delay(100); break; } delay(2000); myOLED.update(); }*/ // Меню Авто режим void oled_auto(int Drink) { myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("FDNJ JUJYM"), CENTER, 0); //АВТО ОГОНЬ myOLED.print(F("VK "), RIGHT, 27); DrinkInfo(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("HEXYJQ PFHZL"), CENTER, 0); //РУЧНОЙ ЗАРЯД DrinkInfo(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("FDNJ JUJYM") : F("HEXYJQ PFHZL") , CENTER, 0); // АВТО ОГОНЬ РУЧНОЙ ЗАРЯД myOLED.print(F("JNRHSDF> JUJYM"), CENTER, 27); //ОТКРЫВАЮ ОГОНЬ DrinkInfo(47); myOLED.update(); } void oled_nalito(int MenuFlag, int Nalito) { myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print((MenuFlag == 1) ? F("FDNJ JUJYM") : F("HEXYJQ PFHZL") , CENTER, 0); // АВТО ОГОНЬ РУЧНОЙ ЗАРЯД if (Nalito == 1) { myOLED.print(F("G J H F : T Y F"), CENTER, 20); // ПОРАЖЕНА myOLED.print(F("W T K M"), CENTER, 55); //ЦЕЛЬ } else if (Nalito <= 4 ) { myOLED.print(F("G J H F : T Y J"), CENTER, 20); // ПОРАЖЕНО myOLED.print(F("W T K B"), CENTER, 55); //ЦЕЛИ } else { myOLED.print(F("G J H F : T Y J"), CENTER, 20); // ПОРАЖЕНО myOLED.print(F("W T K T Q"), CENTER, 55); //ЦЕЛЕЙ } myOLED.setFont(SmallFont); myOLED.print(String(Nalito), CENTER, 36); myOLED.update(); } void ServoNaliv(byte rumka) { servo.attach(PIN_SERVO); for (int pos = servo.read(); pos <= Rumka_pos[rumka]; pos += 1) { // с шагом в 1 градус servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos' delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию } servo.detach(); } void ServoParking () { //Serial.println(servo.read()); servo.attach(PIN_SERVO); for (int pos = servo.read(); pos >= 0; pos -= 1) { // с шагом в 1 градус servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos' delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию } servo.detach(); } void CvetoMuzik() { for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 768) { for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip... int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels()); strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue))); } strip.show(); // Update strip with new contents delay(10); // Pause for a moment } } void celi() { // Мелодия перед наливом myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("J<YFHE:TYBT WTKTQ"), CENTER, 28); //ОБНАРУЖЕНИЕ ЦЕЛЕЙ myOLED.print(F("LKZ GJHF:TYBZ"), CENTER, 45); // ДЛЯ ПОРАЖЕНИЯ delay(300); mp3_play (51); myOLED.update(); delay(5000); } 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 (28);// устанвливаем громкость 20 delay (100); mp3_play (1); // Проигрываем "mp3/0001.mp3" delay (100); // Volume=EEPROM.read(0); myOLED.begin(); // Инициализация дисплея // выводим привествие после включения перед наливом myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("PFDJLBVCZ!"), CENTER, 25);// ЗАВОДИМСЯ! myOLED.update(); delay (5000); // Выводит на экран Настройка систем myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("GHJBPDJ:E"), CENTER, 25); //ПРОИЗВОЖУ myOLED.print(F("YFCNHJQRE CBCNTV"), CENTER, 35); // НАСТРОЙКУ СИТЕМ myOLED.update(); delay(2000); // Выводит на экран Все системы работают нормально myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("DCT CBNTVS"), CENTER, 15); //ВСЕ СИСТЕМЫ myOLED.print(F("D YJHVT"), CENTER, 35); // В НОРМЕ myOLED.update(); delay(3000); pinMode(pin_SW, INPUT); // устанавливаем pin pin_SW как вход digitalWrite(pin_SW, HIGH); // Поддяжка вывода к 1 pinMode(pin_A, INPUT); pinMode(pin_B, INPUT); pinMode(PIN_PUMP, OUTPUT); digitalWrite(PIN_PUMP, 0); currentTime = millis(); loopTime = currentTime; //--------------- oled_menu(0); strip.begin(); for (int i = 0; i < 5; i++) { pinMode(Optics[i], INPUT); } ServoParking(); } void loop() { currentTime = millis(); if (currentTime >= (loopTime + 5)) { // проверяем каждые 5мс // int val = analogRead(0); // считываем значение // Serial.println(val); encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера if ((!encoder_A) && (encoder_A_prev)) { // если состояние изменилось с положительного к нулю //Вращение влево if (encoder_B) { if (MenuFlag == 0) { (Menu <= 0 ) ? Menu = 2 : Menu--; // Перемещение курсора по главному меню назад oled_menu(Menu); } else if (MenuFlag == 1) { (Drink <= min_Drink ) ? Drink = max_Drink : Drink--; // Уменьшаем кол-во милилитров в рюмку oled_auto(Drink); } else if (MenuFlag == 2) { (DrinkCount >= max_DrinkCount ) ? DrinkCount = 1 : DrinkCount++; // Влево увечичиваем рюмки для ручного режима oled_manual(DrinkCount, Drink); } //Вращение вправо } else { if (MenuFlag == 0) { (Menu >= 2 ) ? Menu = 0 : Menu++; // Перемещение курсора по главному меню вперед. oled_menu(Menu); } else if (MenuFlag == 1) { (Drink >= max_Drink ) ? Drink = min_Drink : Drink++; oled_auto(Drink); } else if (MenuFlag == 2) { (Drink >= max_Drink ) ? Drink = min_Drink : Drink++; oled_manual(DrinkCount, Drink); } } } encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла int encoder_sw = digitalRead(pin_SW); if (encoder_sw == 0 && encoder_sw != encoder_sw_prew) { // Нажата кнопка int pause_sw = 0; boolean promivka = false; while (digitalRead(pin_SW) == 0) { // Держим кнопку. Считаем сколько времени прошло... delay(100); pause_sw++; if (pause_sw > 20 && Menu != 2 ) break; if (pause_sw > 20 && Menu == 2 && promivka == false) { // Если пункт меню промывка и держим кнопку больше 2 секунд. promivka = true; pump_enable(); // Включаем насос myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("GHJRFXRF CBCNTVS"), 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 ) { //Начинается автоматический разлив celi(); // Мелодия перед наливом в авторежиме Serial.println("Начало автоматического разлива"); oled_naliv(MenuFlag); // Выводим на экран наливаем ... byte drink_count = 0; for (int y = 0; y < max_DrinkCount; y++) { if (analogRead(Optics[y]) < Optics_porog[y] ) { strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом strip.show(); ServoNaliv(y); // Перемещяемся к рюмке pump_timer(Drink); // Налив. strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито. strip.show(); drink_count++; } } if (drink_count > 0) { oled_nalito(MenuFlag, drink_count ); ServoParking(); //delay(1000); Tost(); CvetoMuzik(); oled_auto(Drink); } else { myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("YTN WTKTQ!"), CENTER, 15); //НЕТ ЦЕЛЕЙ! myOLED.print(F("J<JPYFXMNT WTKM"), CENTER, 35); // ОБОЗНАЧЬТЕ ЦЕЛИ myOLED.print(F("LKZ GJHF:TYBZ!"), CENTER, 55); // ДЛЯ ПОРАЖЕНИЯ! delay(300); mp3_play (50); // Играем сирену. myOLED.update(); delay(5000); 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 ) { //Начинается ручной разлив celi(); //Мелодия перед ручным наливом oled_naliv(MenuFlag); // Выводим на экран наливаем ... for (int y = 0; y < DrinkCount; y++) { strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом strip.show(); ServoNaliv(y); // Перемещяемся к рюмке pump_timer(Drink); // Налив. strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито. strip.show(); } oled_nalito(MenuFlag, DrinkCount ); ServoParking(); Tost(); CvetoMuzik(); oled_manual(DrinkCount, Drink); } } } if (currentTime >= (ledTime + 300)) { //Опрашиваем оптопары ... Если рюмка поставлена , светодиод светится синим, нет ничего - не светится for (int i = 0; i < max_DrinkCount; i++) { int val = analogRead(Optics[i]); // считываем значение Serial.println(val); if (val < Optics_porog[i]) { strip.setPixelColor(i, strip.Color(0, 0, 255)); } else { strip.setPixelColor(i, strip.Color(30, 60, 60));// свеченте в отсутствии рюмки } // delay(20); } strip.show(); ledTime = currentTime; } encoder_sw_prew = encoder_sw; loopTime = currentTime; } }в ветке про Наливатор в Проектах - куча народу тусуется. попроси их.
писал и там но безуспешно,,,,,пока никто не отвечает или не хотят
денег скока?
предлагайте сумму
Поправлю за 1000р
За 2000 перепишу это поделие начисто.
kakmycmail@gmail.com
вайбер есть? ,,,,,удобнее будет обсудить
89124664897
Чет не находит
На почту напиши