Там перистальтические насосы по ссылкам рассчитаны на движок 28BYJ-48 и трубку 3мм. Как бы производительность просчитать ? Что то мне кажется слишком медленно все это будет наливать.
Медленно. Производительность такого насоса будет максимум в районе 150 мл в минуту.
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Сейчас проверил скетч из 181поста, действительно работает на оборот.наливает в отсутствующие рюмки. Надо исправить скетч, и в тостах вместо запятой ставится вопросительный знак. Со звуком ещё не проверял.
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Сейчас проверил скетч из 181поста, действительно работает на оборот.наливает в отсутствующие рюмки. Надо исправить скетч, и в тостах вместо запятой ставится вопросительный знак. Со звуком ещё не проверял.
Добавил эти две строчки, но светодиоды так же светятся при включении устройства, даже без датчиков стаканов((
Какие датчики используете? Почитайте пост 115. автор скетча использует датчики с инвертором, отсюда и работает всё на оборот.(скорее всего).вечером попробую перевернуть сигнал
Ждать можно долго.....если мои мысли верны,есть три варианта решения этой проблемы - купить другие датчики, переделать уже имеющиеся или исправить прошивку под свои датчики
Добавил эти две строчки, но светодиоды так же светятся при включении устройства, даже без датчиков стаканов((
Какие датчики используете? Почитайте пост 115. автор скетча использует датчики с инвертором, отсюда и работает всё на оборот.(скорее всего).вечером попробую перевернуть сигнал
Перевернул, всё работает как надо.дерзайте или покупайте другие датчики
схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит
схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит
Это схема уже устарела.в этой теме новых схем полно.а что касается автора, скорее всего он решил поставить этот проект на коммерческий поток и это его право. Вы видели комментарии к его видео?народ в очередь выстраивается чтобы купить такую штуку. Я лично писал ему и он без вопросов дал схему и скетч.точно такую схему я выкладывал выше,а скетч к ЭТОЙ схеме на первой странице темы
Могу,но позже.там ничего сложного.возьмите даташит на микросхему 74hc14 на её входы это выводы 1,3,5,9,11,13 подайте сигналы с ваших датчиков.а с выходов микросхемы 2,4,6,8,10,12 сигналы подайте на ардуину. Один инвертор микросхемы останется лишним. Вот и всё
Если я понял правильно,то сигнал с моих 5ти датчиков я подаю на , 1,3,5,9 и 11. а выходы 2,4,6,8 и 10 уже подключаю на ардуину ? Ну и питание на микросхему.
Если я понял правильно,то сигнал с моих 5ти датчиков я подаю на , 1,3,5,9 и 11. а выходы 2,4,6,8 и 10 уже подключаю на ардуину ? Ну и питание на микросхему.
со схемой всё нормально,но она немного не под скетч из этой темы. у вас 6 рюмок,скетч под 5 и мп3 плеер у вас отсутствует.нужен скетч именно под вашу схему.
Коллеги, нужна помощь в корректировке скетча под дисплей LCD1602 I2C. Ни в какую не хотят переменные отображаться на дисплее, в мониторе все прописывается.
Не понял про какие переменные идет речь
void DrinkInfo(byte pos) {
lcd.setCursor(0, 0); // устанавливаем курсор в 1-ю ячейку верхней строки
lcd.print(F("HАЛИТЬ ПО")); // пишем "HАЛИТЬ ПО" (с 1 по 9 ячейку)
lcd.setCursor(10, 0); // устанавливаем курсор в 11-ю ячейку верхней строки
lcd.print(Drink); // пишем переменную "Drink" в 11 и 12 ячейку (2 знака)
Serial.println(Drink); // выводим переменную ""Drink" в монитор порт
lcd.setCursor(13, 0);// устанавливаем курсор в 14-ю ячейку верхней строки
lcd.print(F("мЛ?")); // пишем "мЛ?" (с 14 по 16 ячейку)
Вот Drink и не выводиться на LCD.
Фразы "Ни о чем", "по чуть- чуть", "в самый раз" и др. - при прокручивании энкодера изменяются на дисплее в зависимости от количества Drink. Аналогично и с DrinkCount и Drink в ручном режиме.
схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит
Добрый день всем! собрал по данной схеме. теперь нужно подобрать порог срабатывания датчиков TCRT и откорректировать их в скетче. в программировании не силен. если не трудно, может кто объяснит в подробностях, как это сделать?
Выставляешь порог, ставишь стопку, под ней должен засветиться адресный диод, если диод не горит, значит маленький порог, или наоборот, если если диод горит без стопки, значит порог большой.
Как узнать порог срабатывания моих датчиков? Как конкретно происходит процесс отладки? Что и куда подключаем? Где снимаем показания?
Сообщение 116, короткий скетч для проверки и калибровки датчиков. Подключаешь датчики, заливаешь скетч, открываешь монитор порта. Смотришь значения без рюмок, ставишь рюмки , снова смотришь значения, вот эти значения и будут порогом срабатывания.
Там перистальтические насосы по ссылкам рассчитаны на движок 28BYJ-48 и трубку 3мм. Как бы производительность просчитать ? Что то мне кажется слишком медленно все это будет наливать.
Медленно. Производительность такого насоса будет максимум в районе 150 мл в минуту.
Медленно. Производительность такого насоса будет максимум в районе 150 мл в минуту.
А нужно минимум 500 мл в минуту
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Сейчас проверил скетч из 181поста, действительно работает на оборот.наливает в отсутствующие рюмки. Надо исправить скетч, и в тостах вместо запятой ставится вопросительный знак. Со звуком ещё не проверял.
А можете поправить? Я пробовал изменить- не получилось.
Парни, подскажите пожалуйста, залил крайний скетч, все типо работает , но в инверсии, те светодиоды светятся сразу после включения, ставлю рюмку, светодиод тухнет. Что может быть за ерунда? Датчик подключил 1 из 5
Смотрите вот этот кусок кода
546 if (Menu == 0 && MenuFlag == 0 && pause_sw < 10) { //Нажатие кнопки меню авто 547 MenuFlag = 1; 548 oled_auto(Drink); 549 } else if (MenuFlag == 1 && pause_sw > 20) { //Выход из меню авто в главное 550 MenuFlag = 0; 551 oled_menu(0); 552 } else if (MenuFlag == 1 ) { //Начинается автоматический разлив 553 Serial.println("AUTO"); //Начало автоматического разлива 554 oled_naliv(MenuFlag); // Выводим на экран наливаем ... 555 byte drink_count = 0; 556 for (int y = 0; y < max_DrinkCount; y++) { 557 if (analogRead(Optics[y]) > Optics_porog[y] ) { 558 strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом 559 strip.show(); 560 ServoNaliv(y); // Перемещяемся к рюмке 561 pump_timer(Drink); // Налив. 562 strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито. 563 strip.show(); 564 drink_count++; 565 } 566 }А конкретнее
if(analogRead(Optics[y]) > Optics_porog[y] ) {Добавьте перед этим условием
Serial.print(y);
Serial.print(" - ");
Serial.println(analogRead(Optics[y]));
И посмотрите что выдают ваши оптические датчики.
Добавил эти две строчки, но светодиоды так же светятся при включении устройства, даже без датчиков стаканов((
Добавил эти две строчки, но светодиоды так же светятся при включении устройства, даже без датчиков стаканов((
Какие датчики используете? Почитайте пост 115. автор скетча использует датчики с инвертором, отсюда и работает всё на оборот.(скорее всего).вечером попробую перевернуть сигнал
TCRT5000 . Буду ждать прошивку.
Ждать можно долго.....если мои мысли верны,есть три варианта решения этой проблемы - купить другие датчики, переделать уже имеющиеся или исправить прошивку под свои датчики
Понял, буду искать датчики. Ещё момент, индикацию заряда батареи никто не делал?
Господа подскажите по питанию и конденсаторам и резисторам?
И все ли на схеме впорядке?
А что тут не понятного, обычные аккумуляторы типа 18650. А конденсаторы стандартные по питанию, для борьбы с помехами типо фильтрующие.
А есть схема в читаемом виде?
А это чем не понятна? Разжеванная до безобразия.
А это чем не понятна? Разжеванная до безобразия.
Тем что не понятно что и где написано
Так питание правильное? Я к тому что аккумуляторы и блок питания на одной линии питания это нормально?
Нужно ли еще что то добавлять в эту схему?
А включается вся система только энкодером или еще должна быть кнопка включения гдето встроена или наливания?
Энкодером
Я правильно понял, поворотом ручки включается, даоее поворотом устанавливается скока милилитров а нажатием запускается налив?
Добавил эти две строчки, но светодиоды так же светятся при включении устройства, даже без датчиков стаканов((
Какие датчики используете? Почитайте пост 115. автор скетча использует датчики с инвертором, отсюда и работает всё на оборот.(скорее всего).вечером попробую перевернуть сигнал
Перевернул, всё работает как надо.дерзайте или покупайте другие датчики
Вот такие датчики подойдут ?
https://ru.aliexpress.com/item/32946364138.html?spm=a2g0o.productlist.0.0.7d555f0fHpTYt3&algo_pvid=5f009b90-6f2f-4a13-8497-60a3f82aca6b&algo_expid=5f009b90-6f2f-4a13-8497-60a3f82aca6b-30&btsid=79d5e50e-df50-403c-832a-9a33558667cb&ws_ab_test=searchweb0_0,searchweb201602_4,searchweb201603_55
Вот такие датчики подойдут ?
https://ru.aliexpress.com/item/32946364138.html?spm=a2g0o.productlist.0.0.7d555f0fHpTYt3&algo_pvid=5f009b90-6f2f-4a13-8497-60a3f82aca6b&algo_expid=5f009b90-6f2f-4a13-8497-60a3f82aca6b-30&btsid=79d5e50e-df50-403c-832a-9a33558667cb&ws_ab_test=searchweb0_0,searchweb201602_4,searchweb201603_55
Да
А включение и запуск налива с энкодера?
вот на Сплане схема https://yadi.sk/d/T--oV4uPcJEDgA
Не понял , что перевернули?
Не понял , что перевернули?
Сигнал с датчиков
схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит
https://yadi.sk/i/MYHSrXxUFCXWeA
схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит
Это схема уже устарела.в этой теме новых схем полно.а что касается автора, скорее всего он решил поставить этот проект на коммерческий поток и это его право. Вы видели комментарии к его видео?народ в очередь выстраивается чтобы купить такую штуку. Я лично писал ему и он без вопросов дал схему и скетч.точно такую схему я выкладывал выше,а скетч к ЭТОЙ схеме на первой странице темы
https://yadi.sk/i/MYHSrXxUFCXWeA
Не надо ничего потрашить,просто добавьте инвертор на выход каждого датчика и будет вам счастье!
Можете нарисовать как это сделать ?
Могу,но позже.там ничего сложного.возьмите даташит на микросхему 74hc14 на её входы это выводы 1,3,5,9,11,13 подайте сигналы с ваших датчиков.а с выходов микросхемы 2,4,6,8,10,12 сигналы подайте на ардуину. Один инвертор микросхемы останется лишним. Вот и всё
Если я понял правильно,то сигнал с моих 5ти датчиков я подаю на , 1,3,5,9 и 11. а выходы 2,4,6,8 и 10 уже подключаю на ардуину ? Ну и питание на микросхему.
Если я понял правильно,то сигнал с моих 5ти датчиков я подаю на , 1,3,5,9 и 11. а выходы 2,4,6,8 и 10 уже подключаю на ардуину ? Ну и питание на микросхему.
Совершенно верно!
Спасибо!
со схемой всё нормально,но она немного не под скетч из этой темы. у вас 6 рюмок,скетч под 5 и мп3 плеер у вас отсутствует.нужен скетч именно под вашу схему.
Поправил код из 181 сообщения, с МП3 плейером, все работает!
#include <OLED_I2C.h> #include <Servo.h> #include "Adafruit_NeoPixel.h" #include <SoftwareSerial.h>//добавляем библиотеки #include <DFPlayer_Mini_Mp3.h>//добавляем библиотеку МП3 плейера 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[] = {50,50,100,100,50}; //Серво const int PIN_SERVO = 9; Servo servo; //Позиция каждой рюмки const byte Rumka_pos[] = {0,50,98,145,179}; //12 - 48 - 90 - 135 - 174 (7,6-48,8-90,0-132,0-173,00 или 165/4=41) const byte servo_speed=15; // Скорость поворота серво, 10 - норм, 20 медленно, 30 очень медленно byte Menu = 0; byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в Главном меню. 1 Вошли в меню Авто, 2 вошли в Ручное управление byte Drink = 25; // По умолчанию в рюмку наливаем 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 = 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); //------- 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("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("YE!"), CENTER, 20); //НУ! // Рандом - 1 switch (random(18)) { // 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 (4); // Проигрываем "mp3/0004.mp3" delay(100); 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("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(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(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 (25);// устанвливаем громкость 25 delay (100); mp3_play (1); // Проигрываем "mp3/0001.mp3"(0001_get started!.mp3) delay (100); // Volume=EEPROM.read(0); myOLED.begin(); // Инициализация дисплея // выводим привествие после включения перед наливом myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print(F("Ye? yfxfkb!"), CENTER, 50);// Ну, начали! myOLED.update(); 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("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]) > 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 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 < 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; } }запятую вместо ? не получилось победить (по раскладке рус - "," англ - "?"), заменил на !
Коллеги, нужна помощь в корректировке скетча под дисплей LCD1602 I2C. Ни в какую не хотят переменные отображаться на дисплее, в мониторе все прописывается.
Не понял про какие переменные идет речь
void DrinkInfo(byte pos) { lcd.setCursor(0, 0); // устанавливаем курсор в 1-ю ячейку верхней строки lcd.print(F("HАЛИТЬ ПО")); // пишем "HАЛИТЬ ПО" (с 1 по 9 ячейку) lcd.setCursor(10, 0); // устанавливаем курсор в 11-ю ячейку верхней строки lcd.print(Drink); // пишем переменную "Drink" в 11 и 12 ячейку (2 знака) Serial.println(Drink); // выводим переменную ""Drink" в монитор порт lcd.setCursor(13, 0);// устанавливаем курсор в 14-ю ячейку верхней строки lcd.print(F("мЛ?")); // пишем "мЛ?" (с 14 по 16 ячейку)Вот Drink и не выводиться на LCD.
Фразы "Ни о чем", "по чуть- чуть", "в самый раз" и др. - при прокручивании энкодера изменяются на дисплее в зависимости от количества Drink. Аналогично и с DrinkCount и Drink в ручном режиме.
При подключении дисплея вот такое
. Это может быть из-за того что дисплей 1.3 ? Как с этим боротся?
При подключении дисплея вот такое
. Это может быть из-за того что дисплей 1.3 ? Как с этим боротся?
Такой дисплей так просто не подключается, надо скетч под него переделывать. У него даже один из выводов с другим обозначением
схема от молчаливого создателя))) меня всегда удивляла в людях алчность. ребят вот все что у создателя который молчит успел скачать не думал что он всё удалит
Добрый день всем! собрал по данной схеме. теперь нужно подобрать порог срабатывания датчиков TCRT и откорректировать их в скетче. в программировании не силен. если не трудно, может кто объяснит в подробностях, как это сделать?
Смотрите скетч из поста 7на первой странице.срочки 027-031 выставляем порог датчиков. В последнем скетче 25 строчка
сори, почему-то продублировалось.....
Как узнать порог срабатывания моих датчиков? Как конкретно происходит процесс отладки? Что и куда подключаем? Где снимаем показания?
Выставляешь порог, ставишь стопку, под ней должен засветиться адресный диод, если диод не горит, значит маленький порог, или наоборот, если если диод горит без стопки, значит порог большой.
Да я без мп3 хочу собрать, а скеч который тут потом модернизировать.
Сообщение 116, короткий скетч для проверки и калибровки датчиков. Подключаешь датчики, заливаешь скетч, открываешь монитор порта. Смотришь значения без рюмок, ставишь рюмки , снова смотришь значения, вот эти значения и будут порогом срабатывания.