Вопрос......... я сделал файл приветствия длиннее, (добавил тарелки, перезвон)- нужно другу на юбилей. Но он перестал совпадать с иллюминацией светодиодов по времени, то есть файл еще звучит а светодиоды уже не светят. Ну и раньше переключается на вкладку "налить поровну" , хотя последнее не критично. Как поправить, или это с чем то завязано, и поправить нельзя.
173 строка сетапа, после этой паузы начинается иллюминация, но трек уже звучит, ничего нельзя будет сделать во время этой паузы. Будет так, старт трека-пауза(во время паузы только трек играет)-старт иллюминации.
Подскажите что сделать? Подаю питание, горят все светодиоды, подношу руку к датчику, тухнет светодиод, убираю опять горит, должно же наоборот. Ничего не гореть, руку подносишь к датчику - загорается светодиод.
Подскажите что сделать? Подаю питание, горят все светодиоды, подношу руку к датчику, тухнет светодиод, убираю опять горит, должно же наоборот. Ничего не гореть, руку подносишь к датчику - загорается светодиод.
В прошивке на главной вкладке в самом начале есть про концевики. Смените с 0 на 1 или наборот.
за время существования этой ветки тут с десяток прошивок разных и разных людей. 9 из этих 10 написаны под себя и всего одна, которой пользуются остальные
за время существования этой ветки тут с десяток прошивок разных и разных людей. 9 из этих 10 написаны под себя и всего одна, которой пользуются остальные
Подскажите, экран олэд маленький, как поменять и где значения-подаю питание горят все светодиоды, нажимаю концевик-тухнет. Должно наоборот, ничего не гореть, концевик нажал-загорелся светодиод.
Привет ребят! Полтора года... переезд выбил из колеи совсем, средства закончились. Взял заказ на аппарат, собрал. Дурит что-то не по-детски... Заключается это в том, что при громком звуке, или при быстром перемещении сервы (маленькой - с большой вообще никак не заработало) начинается, простите, "пердёж" в динамике, дисплей мигает и потом либо перезагружается, либо звук пропадает, всё сбрасывается... Ёмкости дополнительные ставил - безуспешно... Такое ощущение, что это преобразователь 5100 дурит - на нем тоже светодиод мигает в момент звука тостов... Что за беда... Может с этими 5100 что-то нужно делать для стабильной работы? К серве же там тоже что-то цепляли для стабильности - напомните, плз... Вообще из темы выпал...
В основном дурит на громких звуках. Скорее всего МР3 модуль... Ему пришлось ноги на другую сторону перепаивать - расположение в корпусе неудачное оказалось...
Роман, приветствую! Скажи, пожалуйста - можно ли так организовать функцию в настройках напряжения АКБ, чтобы можно было измерить вольтметром, а потом в настройках указать сколько точно, а остальное уже пересчиталось автоматически?
P.S. И ещё вдогонку - можно из скетча выставить верхний лимит громкости для тостов и для плеера, чтобы не до максимума выставлялось, а до 25ти например? У меня так и не получилось победить - на громкости выше 27 срывается и тарахтит с перезагрузкой шайтан-машина...
value = ((value * 4) + analogRead(BAT_PIN) ) / 5; – эта строка уже есть
float v_akky=value * coeff_bat;
заменить строки
// if (value < 650) { // 3 вольта 635
if ( v_akky < 3 ) { // 3 вольта
//else if (value < 690) { // 3.2 вольта 677
else if (v_akky < 3.2) { // 3.2 вольта
//else if (value < 740) { // 3,4 вольта 720
else if (v_akky < 3.4) { // 3,4 вольта
//} else if (value < 780) { // 3,6 вольта 762
} else if (v_akky < 3.6) { // 3,6 вольта 762
//} else if (value < 840) { // 3,8 вольта 805
} else if (v_akky < 3.8) { // 3,8 вольта
//} else if (value < 900) { // 4,2 вольта 889
} else if (v_akky < 4.2) { // 4,2 вольта
//} else if (value < 1023) { // 5 вольт от сети
} else if (v_akky < 5) { // 5 вольт от сети
Ну и наконец добавить строки в файл d_control.ino
#ifdef BAT_MONITOR_ON
case 18: // меню настройки аккумулятора
if(drift>0)coeff_bat=coeff_bat+0.00001;
else coeff_bat=coeff_bat-0.00001;
break;
#endif
case 19: // меню настройки времени таймера сна – эта строка уже есть
В другом месте
#ifdef BAT_MONITOR_ON – эта строка уже есть
} else if (MenuFlag == 18) { // выход из меню просмотра напряжения батареи в меню настроек – эта строка уже есть
MenuFlag = 4; – эта строка уже есть
menu_nastr();– эта строка уже есть
#ifdef MEMORY_ON
address = 160;
EEPROM.put(address, coeff_bat); // обновляем в памяти коэффициент калибровки акку
#endif
Куда добавлять можно ориентироваться по существующим строкам.
В результате добавления строк в режиме просмотра напряжения аккумулятора появляется возможность его калибровки вращением енкодера. Просто подгоняем его значение под реальное измеренное.
Я надеюсь автор прошивки благосклонно отнесется к моим исправлениям и может даже добавит подобный код в свои новые версии.
Ну и наконец добавить строки в файл d_control.ino
#ifdef BAT_MONITOR_ON //Нашёл эту строку в файле и после неё вставил следующие строки кода - правильно?
case 18: // меню настройки аккумулятора
if(drift>0)coeff_bat=coeff_bat+0.00001;
else coeff_bat=coeff_bat-0.00001;
break;
#endif
case 19: // меню настройки времени таймера сна – эта строка уже есть //(это пропустил)
В другом месте
#ifdef BAT_MONITOR_ON – эта строка уже есть //вот опять та же строка, что была выше - что тут делать?
} else if (MenuFlag == 18) { // выход из меню просмотра напряжения батареи в меню настроек – эта строка уже есть
MenuFlag = 4; – эта строка уже есть
menu_nastr();– эта строка уже есть
#ifdef MEMORY_ON
address = 160;
EEPROM.put(address, coeff_bat); // обновляем в памяти коэффициент калибровки акку
#endif
//В итоге тут получилось следующее:
#ifdef BAT_MONITOR_ON
//ACU------------------------------------------------------------------------------------------------
case 18: // меню настройки аккумулятора
if(drift>0)coeff_bat=coeff_bat+0.00001;
else coeff_bat=coeff_bat-0.00001;
break;
#endif
//ACU------------------------------------------------------------------------------------------------
} else if (MenuFlag == 18) { // выход из меню просмотра напряжения батареи в меню настроек
MenuFlag = 4;
menu_nastr();
#ifdef MEMORY_ON
address = 160;
EEPROM.put(address, coeff_bat); // обновляем в памяти коэффициент калибровки акку
#endif
//Что-то напутано?
Вот это непонятно немного - там комменты в сносках
'ADC_U_COEFF' was not declared in this scope такая ошибка сейчас
Я сейчас 55 версию прошивки ковыряю, до этого у меня последняя 39-я была - много поменялось... Вот в плеер зашёл не могу выбор галочки напротив рандома поставить - мимо проскакивает... Может там не двойным кликом, а иначе меняется?
СПАСИБО! Быстрее пошло.
Добрый день!!! С ПРАЗДНИКОМ ВСЕХ!
Вопрос......... я сделал файл приветствия длиннее, (добавил тарелки, перезвон)- нужно другу на юбилей. Но он перестал совпадать с иллюминацией светодиодов по времени, то есть файл еще звучит а светодиоды уже не светят. Ну и раньше переключается на вкладку "налить поровну" , хотя последнее не критично. Как поправить, или это с чем то завязано, и поправить нельзя.
СПАСИБО!
173 строка сетапа, после этой паузы начинается иллюминация, но трек уже звучит, ничего нельзя будет сделать во время этой паузы. Будет так, старт трека-пауза(во время паузы только трек играет)-старт иллюминации.
Подскажите, как настраивать углы для сервы, где рюмки стоят?
Подскажите что сделать? Подаю питание, горят все светодиоды, подношу руку к датчику, тухнет светодиод, убираю опять горит, должно же наоборот. Ничего не гореть, руку подносишь к датчику - загорается светодиод.
Подскажите, как настраивать углы для сервы, где рюмки стоят?
Настройки-настройка сервы-калибровка
Подскажите что сделать? Подаю питание, горят все светодиоды, подношу руку к датчику, тухнет светодиод, убираю опять горит, должно же наоборот. Ничего не гореть, руку подносишь к датчику - загорается светодиод.
В прошивке на главной вкладке в самом начале есть про концевики. Смените с 0 на 1 или наборот.
Можно пальцем тыкнуть, где именно в прошивке.
Или как вообще убрать инфракрасные датчики, поставить микровыключатели?
а что у вас за прошивка?
а что у вас за прошивка?
Сверху код
Есть другая прошивка?
а что у вас за прошивка?
Сверху код
Есть другая прошивка?
чей код и откуда?
а что у вас за прошивка?
Сверху код
Есть другая прошивка?
чей код и откуда?
Здесь нашёл
а что у вас за прошивка?
Сверху код
Есть другая прошивка?
чей код и откуда?
Здесь нашёл
за время существования этой ветки тут с десяток прошивок разных и разных людей. 9 из этих 10 написаны под себя и всего одна, которой пользуются остальные
Для наливатора без допкнопки добавлен быстрый вызов промывки тройным кликом из главного меню.
ЯД55 ГИТ55
Вот та одна от автора
а что у вас за прошивка?
Сверху код
Есть другая прошивка?
чей код и откуда?
Здесь нашёл
за время существования этой ветки тут с десяток прошивок разных и разных людей. 9 из этих 10 написаны под себя и всего одна, которой пользуются остальные
Благодарю
Ссылка на яд https://disk.yandex.ru/d/_YwP9zybnqOSJA Толи форум ломает ссылки то ли яндекс косячит, ссылки из сообщений не доступны вдруг стали.
PS: Возможно косяк форума, если скопировать ссылку как текст и вставить в строку браузера, то открывается, если клацкнуть по ссылки, то ошибка
Как вообще убрать инфракрасные датчики, поставить микровыключатели?
Как вообще убрать инфракрасные датчики, поставить микровыключатели?
Откройте ссылку которые Вам выше сбросили, и посмотрите там схему, либо тему с самого начала откройте, есть схема с концевиками
У кого проблема с корпусами есть готовые.
https://aliexpress.ru/item/1005003398288994.html
Как раз для подарка на 23е.
Там еще есть несколько.
https://aliexpress.ru/item/1005002357323722.html
Подскажите, экран олэд маленький, как поменять и где значения-подаю питание горят все светодиоды, нажимаю концевик-тухнет. Должно наоборот, ничего не гореть, концевик нажал-загорелся светодиод.
САМ КОД
Смотри строки
if (analogRead(SW_pins[y]) > Optics_porog[y] ) {и
if (val > Optics_porog[i]) {Поменяй > на <
Это в самом начале темы было http://arduino.ru/forum/proekty/nalivator-avtomatizirovannaya-mashina-kotoraya-budet-razlivat-alkogol-po-stopkam?page=5#comment-478986
Есть у кого готовый скетч и схема на микровыключателях и олэд экране?
Поменял скобки, теперь нажимаю микрик 5 и загораются и 5 и 6 светодиод
Есть у кого готовый скетч и схема на микровыключателях и олэд экране?
https://community.alexgyver.ru/threads/der-nalivator-modificirovannaja-v...
#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,А7 const uint8_t SW_pins[] = {0, 1, 2, 3, 6, 7}; // Значения порога срабатывания датчика для каждой рюмки const unsigned int Optics_porog[] = {50,50,100,100,50,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 = 6; //Максимальное кол-во рюмок - 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(SW_pins[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(SW_pins[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(SW_pins[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 и микриках с мп3 все ссылки На Яндекс до 20 страницы неактивные
Пост 4815 выше маленько...
Привет ребят! Полтора года... переезд выбил из колеи совсем, средства закончились. Взял заказ на аппарат, собрал. Дурит что-то не по-детски... Заключается это в том, что при громком звуке, или при быстром перемещении сервы (маленькой - с большой вообще никак не заработало) начинается, простите, "пердёж" в динамике, дисплей мигает и потом либо перезагружается, либо звук пропадает, всё сбрасывается... Ёмкости дополнительные ставил - безуспешно... Такое ощущение, что это преобразователь 5100 дурит - на нем тоже светодиод мигает в момент звука тостов... Что за беда... Может с этими 5100 что-то нужно делать для стабильной работы? К серве же там тоже что-то цепляли для стабильности - напомните, плз... Вообще из темы выпал...
5100 это модуль зарядки он не влияет на раболу. у тебя питание просаживает
Меряю во время работы - не проседает. Во время сбоя до 4х вольт скидывает...
Меряй отдельно ток у потребителей
Ток потребителей
В основном дурит на громких звуках. Скорее всего МР3 модуль... Ему пришлось ноги на другую сторону перепаивать - расположение в корпусе неудачное оказалось...
Роман, приветствую! Скажи, пожалуйста - можно ли так организовать функцию в настройках напряжения АКБ, чтобы можно было измерить вольтметром, а потом в настройках указать сколько точно, а остальное уже пересчиталось автоматически?
P.S. И ещё вдогонку - можно из скетча выставить верхний лимит громкости для тостов и для плеера, чтобы не до максимума выставлялось, а до 25ти например? У меня так и не получилось победить - на громкости выше 27 срывается и тарахтит с перезагрузкой шайтан-машина...
Роман, приветствую! Скажи, пожалуйста - можно ли так организовать функцию в настройках напряжения АКБ
Доброго. Думаю, что нет.
можно из скетча выставить верхний лимит громкости для тостов и для плеера
55 скетч, 43 строка во вкладке d_control, громкость плеера
111 строка , громкость тостов
Думаю тут понятно, заменить циферку 30 на нужную.
Благодарю!
На самом деле добавить калибровку аккумулятора можно, но нужно добавить строки в несколько файлов.
Я постарался максимально сохранить исходный код автора.
И так поехали:
сначала нужно файле Nalivator54.ino в разделе #ifdef BAT_MONITOR_ON задать переменную
float coeff_bat=ADC_U_COEFF;
затем в фале a_setup.ino добавить строки
address = 160;
EEPROM.get(address, coeff_bat); // считываем из памяти коэфициент калибровки акку
if((coeff_bat < 1 )||( coeff_bat>0) );//норма
else { coeff_bat=ADC_U_COEFF; EEPROM.put(address, coeff_bat); } //NaN
Procent = 0; ----- эта строка уже есть
Потом в файле e_menu.ino заменить сроку
//lcd.print((value * ADC_U_COEFF), 2);
на
lcd.print((value * coeff_bat), 2);
Тоже самое проделать в файле func.ino
Там же добавить строку
value = ((value * 4) + analogRead(BAT_PIN) ) / 5; – эта строка уже есть
float v_akky=value * coeff_bat;
заменить строки
// if (value < 650) { // 3 вольта 635
if ( v_akky < 3 ) { // 3 вольта
//else if (value < 690) { // 3.2 вольта 677
else if (v_akky < 3.2) { // 3.2 вольта
//else if (value < 740) { // 3,4 вольта 720
else if (v_akky < 3.4) { // 3,4 вольта
//} else if (value < 780) { // 3,6 вольта 762
} else if (v_akky < 3.6) { // 3,6 вольта 762
//} else if (value < 840) { // 3,8 вольта 805
} else if (v_akky < 3.8) { // 3,8 вольта
//} else if (value < 900) { // 4,2 вольта 889
} else if (v_akky < 4.2) { // 4,2 вольта
//} else if (value < 1023) { // 5 вольт от сети
} else if (v_akky < 5) { // 5 вольт от сети
Ну и наконец добавить строки в файл d_control.ino
#ifdef BAT_MONITOR_ON
case 18: // меню настройки аккумулятора
if(drift>0)coeff_bat=coeff_bat+0.00001;
else coeff_bat=coeff_bat-0.00001;
break;
#endif
case 19: // меню настройки времени таймера сна – эта строка уже есть
В другом месте
#ifdef BAT_MONITOR_ON – эта строка уже есть
} else if (MenuFlag == 18) { // выход из меню просмотра напряжения батареи в меню настроек – эта строка уже есть
MenuFlag = 4; – эта строка уже есть
menu_nastr();– эта строка уже есть
#ifdef MEMORY_ON
address = 160;
EEPROM.put(address, coeff_bat); // обновляем в памяти коэффициент калибровки акку
#endif
Куда добавлять можно ориентироваться по существующим строкам.
В результате добавления строк в режиме просмотра напряжения аккумулятора появляется возможность его калибровки вращением енкодера. Просто подгоняем его значение под реальное измеренное.
Я надеюсь автор прошивки благосклонно отнесется к моим исправлениям и может даже добавит подобный код в свои новые версии.
Супер! Это классное дополнение! Спасибо за Ваше участие!!!
Не совсем понял с последними внесениями:
Ну и наконец добавить строки в файл d_control.ino #ifdef BAT_MONITOR_ON //Нашёл эту строку в файле и после неё вставил следующие строки кода - правильно? case 18: // меню настройки аккумулятора if(drift>0)coeff_bat=coeff_bat+0.00001; else coeff_bat=coeff_bat-0.00001; break; #endif case 19: // меню настройки времени таймера сна – эта строка уже есть //(это пропустил) В другом месте #ifdef BAT_MONITOR_ON – эта строка уже есть //вот опять та же строка, что была выше - что тут делать? } else if (MenuFlag == 18) { // выход из меню просмотра напряжения батареи в меню настроек – эта строка уже есть MenuFlag = 4; – эта строка уже есть menu_nastr();– эта строка уже есть #ifdef MEMORY_ON address = 160; EEPROM.put(address, coeff_bat); // обновляем в памяти коэффициент калибровки акку #endif //В итоге тут получилось следующее: #ifdef BAT_MONITOR_ON //ACU------------------------------------------------------------------------------------------------ case 18: // меню настройки аккумулятора if(drift>0)coeff_bat=coeff_bat+0.00001; else coeff_bat=coeff_bat-0.00001; break; #endif //ACU------------------------------------------------------------------------------------------------ } else if (MenuFlag == 18) { // выход из меню просмотра напряжения батареи в меню настроек MenuFlag = 4; menu_nastr(); #ifdef MEMORY_ON address = 160; EEPROM.put(address, coeff_bat); // обновляем в памяти коэффициент калибровки акку #endif //Что-то напутано?Вот это непонятно немного - там комменты в сносках
Какие строки не понятно?
вставку
#ifdef BAT_MONITOR_ON
case 18: // меню настройки аккумулятора
if(drift>0)coeff_bat=coeff_bat+0.00001;
else coeff_bat=coeff_bat-0.00001;
break;
#endif
нужно делать перед сушествующей строкой
case19:// меню настройки времени таймера сна – эта строка уже есть //(это пропустил)//ACU----------------------------------------------------------------------------------------- #ifdef BAT_MONITOR_ON float coeff_bat=ADC_U_COEFF; //#define ADC_U_COEFF 0.00507 // 0.00472 (0.00494) коэффициент перевода кода АЦП в напряжение. 1.1 / 1023 / R4 * (R4 + R5). Условие должно выполняться - R4 / ( R4 + R5 ) = 0.22 #define LOW_BAT_SLEEP_ON // контроль низкого заряда акб. Закомментировать - выключить для отладки кода, если не подключен пин A7 к мониторингу АКБ, иначе сон #endif //ACU----------------------------------------------------------------------------------------- это в nalivator55.ino //ACU----------------------------------------------------------------------------------------- address = 160; EEPROM.get(address, coeff_bat); // считываем из памяти коэфициент калибровки акку if((coeff_bat < 1 )||( coeff_bat>0) );//норма else { coeff_bat=ADC_U_COEFF; EEPROM.put(address, coeff_bat); } //NaN //ACU----------------------------------------------------------------------------------------- Procent = 0; Это в a_setup и ошибка exit status 1 'ADC_U_COEFF' was not declared in this scopeЯ float как то не так вставил, видимо - как правильно? ЗЫ вроде прошло, теперь ошибка exit status 1
case label '18' не туда вставил
Обратите внимание я привел код для версии nalivator54, а не для nalivator55
А... всё ок, прокомпилилось... Попробую сейчас на макетке :)
чтобы работало нормально, при работе от акку, измеряемое напряжение на А7 пине не должно быть больше 1.1V
Да, похоже всё работает! Супер!
Я сейчас 55 версию прошивки ковыряю, до этого у меня последняя 39-я была - много поменялось... Вот в плеер зашёл не могу выбор галочки напротив рандома поставить - мимо проскакивает... Может там не двойным кликом, а иначе меняется?