raven78, Можно еще маленькое предложение? Настройки мультиразлива внести в ту же директорию, где и сам мультиразлив? А то как-то получается, чтобы поменять количнство надо идти в настройки, а потом обратно. Это сильно трудоёмко?
Кстати да, было бы логичнее так сделать.
Бармалей пишет:
Немного программу подкорректировать.
Учитывая, например, мои старческие знания, то это превратиться в многочасовое сидение перед кодом ))) Хотя и подозреваю, что все просто, ибо скетч похожий у внуков сейчас в их соконаливаторе. Там добавлял менюшки. Но тут лучше уж автор сделает, если ему не сложно. Может еще добавит реализацию настройки времени налива как у меня в скетче, чтобы вручную не прописывать миллисекунды.
int32_t startTime ; // время начала работы секундомера для калибровки помпы
int32_t elapsedTime ; // истекшее время для секундомера
bool calibrPump = false; // калибровка помпы
// калибровка помпы
else if (Nastr == 6 && MenuFlag == 2 && pause_sw < 10) { //входим в настройку помпы
MenuFlag = 14;
oled_kalibr_pump();
} else if (MenuFlag == 14 && pause_sw > 20) { //Выход из меню помпы в главное
SAVEtimer.reset();
myDFPlayer.volume(vol_tost); //Громкость
delay (100);
myDFPlayer.playFolder (1, 104); // и так сойдет
MenuFlag = 2;
oled_nastr(6);
address = 10;
EEPROM.put(address, max_Drink_delay); // обновляем в памяти время налива
} else if (MenuFlag == 14) { //вошли в меню помпы. Один раз нажали - запустили таймер и помпу. Второе нажатие останавливает таймер и помпу
if (pause_sw < 10 && calibrPump == false) {
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);
delay (300); // задержка перед наливом
startTime = millis();
calibrPump = true;
delay(5);
pump_enable(); // Включаем насос
drink_count += 1;
}
}
if (drink_count == 0) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(F(" ПОСТАВЬТЕ ТАРУ "));
myDFPlayer.volume(vol_tost); //Громкость
delay (100);
myDFPlayer.playFolder (1, 89);
delay(3000);
oled_kalibr_pump();
}
}
else if (pause_sw < 10 && calibrPump == true) {
elapsedTime = millis() - startTime;
calibrPump = false;
pump_disable(); // pump OFF
ServoParking();
max_Drink_delay = (int)(elapsedTime);
//Serial.println(max_Drink_delay);
oled_kalibr_pump();
}
}
А площадки под рюмками у вас я смотрю сделаны из ленты габаритами 40х40, почему такой размер а ни меньше например? И еще вопрос, толщина у вас 0,05мм это как то влияет на работу?
такой размер, потому что именно в моём случае если площадь меньше, то чувствительность уже слабая и для моих рюмок этого недостаточно (может не заметить рюмку). Толщина, насколько я понимаю, роли не играет. Это конденсатор в принципе, так что чувствительность зависит от площади пластин (пропорционально) и расстояния между ними (антипропорционально). Если плохо реагирует, значит нужно либо увеличивать площадь пластины либо уменьшать расстояние между пластиной и объектом. Также держите подальше от площадок провода, дающие наводки (серво, лед, помпа). И один важный пункт: в момент подачи питания на модуль, вблизи площадок не должно быть никаких лишних предметов (руки, рюмки).
А площадки под рюмками у вас я смотрю сделаны из ленты габаритами 40х40, почему такой размер а ни меньше например? И еще вопрос, толщина у вас 0,05мм это как то влияет на работу?
такой размер, потому что именно в моём случае если площадь меньше, то чувствительность уже слабая и для моих рюмок этого недостаточно (может не заметить рюмку). Толщина, насколько я понимаю, роли не играет. Это конденсатор в принципе, так что чувствительность зависит от площади пластин (пропорционально) и расстояния между ними (антипропорционально). Если плохо реагирует, значит нужно либо увеличивать площадь пластины либо уменьшать расстояние между пластиной и объектом. Также держите подальше от площадок провода, дающие наводки (серво, лед, помпа). И один важный пункт: в момент подачи питания на модуль, вблизи площадок не должно быть никаких лишних предметов (руки, рюмки).
raven78, Можно еще маленькое предложение? Настройки мультиразлива внести в ту же директорию, где и сам мультиразлив? А то как-то получается, чтобы поменять количнство надо идти в настройки, а потом обратно. Это сильно трудоёмко?
Пробуйте 48. Тройной клик в самом мультиразливе переводит в настройки мультиразлива . Делал в спешке)))
ДедСергей пишет:
raven78,
Попользовался твоей прошивкой еще до НГ. Что-то немного не понял с калибровкой помпы. Время работы вручную выставляем же? Как мне кажется так проще. Нажал, ждем пока льется, еще раз нажали и хо, вот тебе время работы помпы. Или я что-то не понял в твоем скетче?
Выставляем время, прибавляется-убавляется по 50 миллисекунд, жмём, идёт налив смотрим результат, не понравилось, добавляем-убавляем, снова жмём. Не знаю кому как, но это делается не часто
Выставляем время, прибавляется-убавляется по 50 миллисекунд, жмём, идёт налив смотрим результат, не понравилось, добавляем-убавляем, снова жмём. Не знаю кому как, но это делается не часто
Так-то да. Косвенно можно во время промывки подсмотреть время нужное. Кому как в общем. В любом случае спасибо!
raven78, почему в скетче написано, что коммерческое использование запрещено? Разрешено как бы. По хорошему Вам нужно добавить лицензию автора, иначе у Вас нет прав выкладывать эту прошивку в сети вообще.
Я так понимаю, что в код добавить работу драйвера это очень сложно для знающего человека. Что ж, нет так нет.
Несложно, предлагаю Вам скачать скетч GyverDrink_v1.0 и самостоятельно разобраться как работать с драйвером мотора.
Подсказка: сначала подается питание сервы, затем включается управление, зачем так сделано понять не могу, далее - действие, отключение и наконец снимаем питание. Вот кусок кода:
Очень мало вводных данных, по подробней бы. Похоже, что включена в компиляцию кнопка в башне, а её нет. С какими опциями скетч компилируете и заливаете?
Это в каком месте, когда мы бродим по настройкам общим, или когда выходим в настройки мультиразлива и самого мультиразлива? Теперь можно попасть в настройки мультиразлива из двух мест. Длинный клик для выхода не работает?
У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?
Это в каком месте, когда мы бродим по настройкам общим, или когда выходим в настройки мультиразлива и самого мультиразлива? Теперь можно попасть в настройки мультиразлива из двух мест. Длинный клик для выхода не работает?
Как сейчас: когда мы находимся в самом мультиразливе - тройной клик переводит в настройки мультиразлива. Все ОК.
- Из настроек мультиразлива выход только по долгому удержанию в сами настройки. И чтобы добраться до мультиразлива надо выйти из настроек и докрутить до него в главном меню.
Если же добавить тройной клик в настройках мультиразлива чтобы он переводил в сам мультиразлив, то будет отлично...
А если еще логичнее, то мультиразлив поместить в отдельный кейс, приблизительно так:
- Мультиразлив
--- Объем
--- Налив
чтобы все было в одном месте. Это так, хотелки мелкие.
У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?
- Из настроек мультиразлива выход только по долгому удержанию в сами настройки. И чтобы добраться до мультиразлива надо выйти из настроек и докрутить до него в главном меню.
Сейчас если зайти в настройки мультиразлива из самого мультиразлива, тройным кликом, то потом долгим удержанием попадаем опять в мультиразлив, а не в настройки. Разве это не так?
Rolo1 пишет:
Вопрос по схеме по питанию от АКБ.
У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает. Как решить проблему кто знает?
Вроде риторический вопрос, приобрести по мощнее зарядку. Я вообще взял бп на 5 вольт 3 ампера, китайский)))
У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?
всем привет,,,,,люди добрые помогите пожалуйста код поправить,,,,,,,что бы в режиме автоналива не нужно было бы нажимать кнопку,,,,,а рюмки убрал потом любую поставил и налив продолжается
можно ли вас попросить как сделать чтобы в режиме автоналива цикл продолжался бесконечно,,,,т.е. рюмки налиты ,убрали рюмки ,затем поставили и налив продолжается в поставленные рюмки
Повер банк отключается при низком потреблении, если кто решал такой вопрос подскажите, где может находиться резистор измерения тока на плате, хочу его удалить?
Добрый день, коллеги! Помогите решить проблемку. Прошивка GyverDrink_v1.3. После налива 5-й рюмки (всего 5), доставляю любую рюмку от 1 по 4-ю, то серво SG995 при наливе не доворачивает краник до центра рюмки на 3-4 градуса. Если запускаю разлив по порядку 1-5, то краник точно попадает в центры рюмок. Получается, что в одном направлении четкое попадание в рюмки, при обратном - недокручивает до центра рюмки 3-4градуса. Проблема в коде, или в серво?
Кстати да, было бы логичнее так сделать.
Немного программу подкорректировать.
int32_t startTime ; // время начала работы секундомера для калибровки помпы int32_t elapsedTime ; // истекшее время для секундомера bool calibrPump = false; // калибровка помпы // калибровка помпы else if (Nastr == 6 && MenuFlag == 2 && pause_sw < 10) { //входим в настройку помпы MenuFlag = 14; oled_kalibr_pump(); } else if (MenuFlag == 14 && pause_sw > 20) { //Выход из меню помпы в главное SAVEtimer.reset(); myDFPlayer.volume(vol_tost); //Громкость delay (100); myDFPlayer.playFolder (1, 104); // и так сойдет MenuFlag = 2; oled_nastr(6); address = 10; EEPROM.put(address, max_Drink_delay); // обновляем в памяти время налива } else if (MenuFlag == 14) { //вошли в меню помпы. Один раз нажали - запустили таймер и помпу. Второе нажатие останавливает таймер и помпу if (pause_sw < 10 && calibrPump == false) { 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); delay (300); // задержка перед наливом startTime = millis(); calibrPump = true; delay(5); pump_enable(); // Включаем насос drink_count += 1; } } if (drink_count == 0) { lcd.clear(); lcd.setCursor(0, 1); lcd.print(F(" ПОСТАВЬТЕ ТАРУ ")); myDFPlayer.volume(vol_tost); //Громкость delay (100); myDFPlayer.playFolder (1, 89); delay(3000); oled_kalibr_pump(); } } else if (pause_sw < 10 && calibrPump == true) { elapsedTime = millis() - startTime; calibrPump = false; pump_disable(); // pump OFF ServoParking(); max_Drink_delay = (int)(elapsedTime); //Serial.println(max_Drink_delay); oled_kalibr_pump(); } }Но это так, хотелки старика )))
А площадки под рюмками у вас я смотрю сделаны из ленты габаритами 40х40, почему такой размер а ни меньше например? И еще вопрос, толщина у вас 0,05мм это как то влияет на работу?
такой размер, потому что именно в моём случае если площадь меньше, то чувствительность уже слабая и для моих рюмок этого недостаточно (может не заметить рюмку). Толщина, насколько я понимаю, роли не играет. Это конденсатор в принципе, так что чувствительность зависит от площади пластин (пропорционально) и расстояния между ними (антипропорционально). Если плохо реагирует, значит нужно либо увеличивать площадь пластины либо уменьшать расстояние между пластиной и объектом. Также держите подальше от площадок провода, дающие наводки (серво, лед, помпа). И один важный пункт: в момент подачи питания на модуль, вблизи площадок не должно быть никаких лишних предметов (руки, рюмки).
А площадки под рюмками у вас я смотрю сделаны из ленты габаритами 40х40, почему такой размер а ни меньше например? И еще вопрос, толщина у вас 0,05мм это как то влияет на работу?
такой размер, потому что именно в моём случае если площадь меньше, то чувствительность уже слабая и для моих рюмок этого недостаточно (может не заметить рюмку). Толщина, насколько я понимаю, роли не играет. Это конденсатор в принципе, так что чувствительность зависит от площади пластин (пропорционально) и расстояния между ними (антипропорционально). Если плохо реагирует, значит нужно либо увеличивать площадь пластины либо уменьшать расстояние между пластиной и объектом. Также держите подальше от площадок провода, дающие наводки (серво, лед, помпа). И один важный пункт: в момент подачи питания на модуль, вблизи площадок не должно быть никаких лишних предметов (руки, рюмки).
Благодарю, буду экспериментировать.
Пробуйте 48. Тройной клик в самом мультиразливе переводит в настройки мультиразлива . Делал в спешке)))
raven78,
Попользовался твоей прошивкой еще до НГ. Что-то немного не понял с калибровкой помпы. Время работы вручную выставляем же? Как мне кажется так проще. Нажал, ждем пока льется, еще раз нажали и хо, вот тебе время работы помпы. Или я что-то не понял в твоем скетче?
Выставляем время, прибавляется-убавляется по 50 миллисекунд, жмём, идёт налив смотрим результат, не понравилось, добавляем-убавляем, снова жмём. Не знаю кому как, но это делается не часто
Выставляем время, прибавляется-убавляется по 50 миллисекунд, жмём, идёт налив смотрим результат, не понравилось, добавляем-убавляем, снова жмём. Не знаю кому как, но это делается не часто
Так-то да. Косвенно можно во время промывки подсмотреть время нужное. Кому как в общем. В любом случае спасибо!
raven78, почему в скетче написано, что коммерческое использование запрещено? Разрешено как бы. По хорошему Вам нужно добавить лицензию автора, иначе у Вас нет прав выкладывать эту прошивку в сети вообще.
добрый день рабочим скетчем поделитесь? prons@ya.ru
ну вот и я закончил свой аппарат. версия от Павла
будет тепло - покрашу по нормальному на даче
raven78,
Тройной клик для входа в настройки мультиразлива работает. Спасибо.
Я так понимаю, что в код добавить работу драйвера это очень сложно для знающего человека. Что ж, нет так нет.
Несложно, предлагаю Вам скачать скетч GyverDrink_v1.0 и самостоятельно разобраться как работать с драйвером мотора.
Подсказка: сначала подается питание сервы, затем включается управление, зачем так сделано понять не могу, далее - действие, отключение и наконец снимаем питание. Вот кусок кода:
servoON(); servo.attach(SERVO_PIN); servo.write(random(0, 4)); delay(200); servo.detach(); servoOFF();Признаюсь я не понимаю как изменить код, что бы драйвер работал. Быть может вы поможете в этом вопросе, если настроение будет.
Привет не подскажете в чем проблема на прошивке 46 при наливе на дисплее пишет промывка и после этого не говорит тосты
Привет не подскажете в чем проблема на прошивке 46 при наливе на дисплее пишет промывка и после этого не говорит тосты
Очень мало вводных данных, по подробней бы. Похоже, что включена в компиляцию кнопка в башне, а её нет. С какими опциями скетч компилируете и заливаете?
raven78,
А можно добавить тройной клик на возвращение из меню настроек мультиразлива в сам мультиразлив?
Это в каком месте, когда мы бродим по настройкам общим, или когда выходим в настройки мультиразлива и самого мультиразлива? Теперь можно попасть в настройки мультиразлива из двух мест. Длинный клик для выхода не работает?
raven78,
А можно добавить тройной клик на возвращение из меню настроек мультиразлива в сам мультиразлив?
Да, добавляйте.
Вопрос по схеме по питанию от АКБ.
У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?
Это в каком месте, когда мы бродим по настройкам общим, или когда выходим в настройки мультиразлива и самого мультиразлива? Теперь можно попасть в настройки мультиразлива из двух мест. Длинный клик для выхода не работает?
Как сейчас: когда мы находимся в самом мультиразливе - тройной клик переводит в настройки мультиразлива. Все ОК.
- Из настроек мультиразлива выход только по долгому удержанию в сами настройки. И чтобы добраться до мультиразлива надо выйти из настроек и докрутить до него в главном меню.
Если же добавить тройной клик в настройках мультиразлива чтобы он переводил в сам мультиразлив, то будет отлично...
А если еще логичнее, то мультиразлив поместить в отдельный кейс, приблизительно так:
- Мультиразлив
--- Объем
--- Налив
чтобы все было в одном месте. Это так, хотелки мелкие.
Вопрос по схеме по питанию от АКБ.
У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?
Какая мощность у вашего зарядного?
Заказал 5штк
Спасибо
Если можно, мне одну. salovat@yandex.ru
- Из настроек мультиразлива выход только по долгому удержанию в сами настройки. И чтобы добраться до мультиразлива надо выйти из настроек и докрутить до него в главном меню.
Сейчас если зайти в настройки мультиразлива из самого мультиразлива, тройным кликом, то потом долгим удержанием попадаем опять в мультиразлив, а не в настройки. Разве это не так?
Вопрос по схеме по питанию от АКБ.
У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает. Как решить проблему кто знает?
Вроде риторический вопрос, приобрести по мощнее зарядку. Я вообще взял бп на 5 вольт 3 ампера, китайский)))
Вопрос по схеме по питанию от АКБ.
У меня когда подключаю зарядное устройство, не работает нормально наливатор просадка идет не хватает напряжения и помпа не качает. Короче когда к АКБ зарядка подключена, наливатор нормально не работает, как решить проблему кто знает?
Какая мощность у вашего зарядного?
5v 2A
5v 2A
Мне кажется не совпадает с действительностью
Вообще убрал АКБ, напрямую с блока питания включил и помпа перестала качать. Что за хрень кто подскажет ибо голову сломал уже всю?
ОТ АКБ если включаю то все работает нормально.
ИЛИ это такая схема в которой тока от АКБ может работать?
ТЕПЕРЬ и от АКБ чего то перестала помпа крутить
Все заработало видимо контакт гдето отошол
Nikolaj666 здравствуй,хотел бы повторить ваш проект, не могли бы поделиться чертежами? Вот моя почта slstway@mail.ru
заранее спасибо)
Nikolaj666 здравствуй,хотел бы повторить ваш проект, не могли бы поделиться чертежами? Вот моя почта slstway@mail.ru
заранее спасибо)
#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, А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 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; //Позиция каждой рюмки ( mg995 max 250) const byte Rumka_pos[] = {0,50,80,120,175}; const byte servo_speed=10; // Скорость поворота серво, 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 = 300; const unsigned int max_Drink_delay = 4000; //-------- byte DrinkCount = 1; //По умолчанию, для ручного режима - 1 рюмка const byte max_DrinkCount = 5; //Максимальное кол-во рюмок - 5 // Насосик const byte PIN_PUMP = 13; // Светодиоды const int PIN_LED = 5;// Сюда подключаются светодиоды const int LED_COUNT = max_DrinkCount; Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800); //mp3 byte mp3_count=32; //Количество голосовых файлов на 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("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); mp3_play(random(mp3_count)+1); delay (5000); } // Меню Авто режим 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(500); 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); mp3_set_serial (Serial); delay(1000); //////////////////////////////////////////////////////// mp3_set_volume (30);// устанвливаем громкость 25 delay (100); mp3_play (1); // Проигрываем "mp3/0001.mp3"(0000_get started!.mp3) /////////////////////////////////////////////////////// // mp3_set_volume (25); delay(100); 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 <= 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("A"+String(Optics[i])+"="+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; } }всем привет,,,,,люди добрые помогите пожалуйста код поправить,,,,,,,что бы в режиме автоналива не нужно было бы нажимать кнопку,,,,,а рюмки убрал потом любую поставил и налив продолжается
Nikolaj666 здравствуй,хотел бы повторить ваш проект, не могли бы поделиться чертежами? Вот моя почта slstway@mail.ru
заранее спасибо)
привет. от какого корпуса чертёж ?
можно ли вас попросить как сделать чтобы в режиме автоналива цикл продолжался бесконечно,,,,т.е. рюмки налиты ,убрали рюмки ,затем поставили и налив продолжается в поставленные рюмки
Спасибо
Подскажите пожалуйста в директории плеер на паузе по двойному клику переходит на L и R, что это за регулировка?
Доброго всем, поделитесь пожалуйста скетчем и схемой если не сложно petr1374@mail.ru
выше скетч
Подскажите пожалуйста в директории плеер на паузе по двойному клику переходит на L и R, что это за регулировка?
скетч 46
Подскажите пожалуйста в директории плеер на паузе по двойному клику переходит на L и R, что это за регулировка?
L - linear - линейный, воспроизведение треков по порядку
R - random - случайный, воспроизведение треков в случайном порядке, так, что они не повторяются, не более 100 треков в папке.
Может у кого есть лишняя плата для сборки наливатора ?
salovat@yandex.ru заранее Спасибо !
Добрый день. А можно скинуть гербер файл на почту sakhprodsnab77@gmail.com
Nikolaj666 здравствуй,хотел бы повторить ваш проект, не могли бы поделиться чертежами? Вот моя почта slstway@mail.ru
заранее спасибо)
привет. от какого корпуса чертёж ?
Вот от этого корпуса.
http://arduino.ru/sites/default/files/u25815/img_20200321_175807.jpg
Повер банк отключается при низком потреблении, если кто решал такой вопрос подскажите, где может находиться резистор измерения тока на плате, хочу его удалить?
http://disk.yandex.ru/d/lGgNB7ZgD-wKew надеюсь разберётесь
http://disk.yandex.ru/d/lGgNB7ZgD-wKew надеюсь разберётесь
Спасибо Николай)
Вот вношу свою лепту в разнообразие видов так сказать. От емкостных концевиков отказался, не удалось добиться нормальной работы.
чума ! модельку не скинете побаловаться ?
nikolajyashkin@ya.ru
Добрый день, коллеги! Помогите решить проблемку. Прошивка GyverDrink_v1.3. После налива 5-й рюмки (всего 5), доставляю любую рюмку от 1 по 4-ю, то серво SG995 при наливе не доворачивает краник до центра рюмки на 3-4 градуса. Если запускаю разлив по порядку 1-5, то краник точно попадает в центры рюмок. Получается, что в одном направлении четкое попадание в рюмки, при обратном - недокручивает до центра рюмки 3-4градуса. Проблема в коде, или в серво?