Доработать скетч
- Войдите на сайт для отправки комментариев
Пнд, 28/12/2020 - 11:04
Как-то в прошлой теме писать не хочется http://arduino.ru/forum/ishchu-ispolnitelya/dorabotka-sketcha :((
Суть: надо чуть-чуть для внуков мелких доработать скетч:
001 | #include <LCD_1602_RUS.h> |
002 | #include <Servo.h> |
003 | #include "Adafruit_NeoPixel.h" |
004 | //#include "GyverEncoder.h" |
005 | #include <EEPROM.h> |
006 | #include "DFRobotDFPlayerMini.h" |
007 | #include "SoftwareSerial.h" |
008 | #define RX_MP3_PIN 10 // подключаем к TX плеера (третий пин) |
009 | #define TX_MP3_PIN 11 // подключаем к RX плеера (второй пин) |
010 | SoftwareSerial mySoftwareSerial(RX_MP3_PIN, TX_MP3_PIN); |
011 | DFRobotDFPlayerMini myDFPlayer; |
012 |
013 | LCD_1602_RUS lcd(0x27, 16, 2); //Подключение экрана А4-SDA, А5-SCL, 0x27 или 0x3F |
014 |
015 | unsigned long currentTime; |
016 | unsigned long loopTime; |
017 | unsigned long ledTime; |
018 |
019 | int j = 1; |
020 | int files = 0; |
021 | int files_tost = 0; |
022 |
023 | // Переменные для энкодера ----------- |
024 | const int pin_A = 2; |
025 | const int pin_B = 3; |
026 | const int pin_SW = 4; |
027 | unsigned char encoder_A; |
028 | unsigned char encoder_B; |
029 | unsigned char encoder_A_prev = 0; |
030 | unsigned char encoder_sw_prew = 1; |
031 |
032 | const byte Optics[] = {0, 1, 2, 3, 6}; |
033 | const unsigned int Optics_porog[] = {1000, 1000, 1000, 1000, 1000}; |
034 | const int PIN_SERVO = 9; |
035 | Servo servo; |
036 |
037 | //Позиция каждой рюмки |
038 | const byte Rumka_pos[] = {30, 60, 90, 120, 150}; |
039 |
040 | byte Menu = 0; // Главное меню |
041 | byte Nastr = 0; // Меню режимов |
042 | byte Rezim = 0; // Меню настроек |
043 | byte MenuFlag = 0; // Здесь храниться уровень меню. 0 находимся в Главном меню. 1 Вошли в меню Режимы и т.д. |
044 | byte Drink = 10; // По умолчанию в рюмку наливаем 10 мл. |
045 |
046 | const byte min_Drink = 5; // Минимум в рюмку - 5 мл. |
047 | const byte max_Drink = 50; // Максимум в рюмку - 50 мл. |
048 |
049 | const unsigned int min_Drink_delay = 300; |
050 | const unsigned int max_Drink_delay = 5000; |
051 |
052 | byte DrinkCount = 1; //По умолчанию, для ручного режима - 1 рюмка |
053 | const byte max_DrinkCount = 5; //Максимальное кол-во рюмок - 5 |
054 |
055 | const byte PIN_PUMP = 12; |
056 |
057 | const int PIN_LED = 5; // Сюда подключаются светодиоды |
058 | const int LED_COUNT = max_DrinkCount; |
059 | Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800); |
060 |
061 | int16_t address = 0; // Переменная для хранения адреса памяти |
062 | int16_t bright = 0; // Яркость led, считается из памяти |
063 | int16_t servo_speed = 0; // Скорость серво |
064 | int16_t vol_tost = 0; // Громкость общая |
065 | int16_t vol_muz = 0; // Громкость музыки |
066 |
067 | // Функции |
068 |
069 | void pump_enable() { |
070 | digitalWrite(PIN_PUMP, 1); //вкл реле |
071 | } |
072 |
073 | void pump_disable() { |
074 | digitalWrite(PIN_PUMP, 0); //выкл реле |
075 | } |
076 |
077 | void pump_timer( byte Drink) { |
078 | digitalWrite(PIN_PUMP, 1); //вкл реле |
079 | delay(map(Drink, min_Drink, max_Drink, min_Drink_delay, max_Drink_delay)); |
080 | digitalWrite(PIN_PUMP, 0); //выкл реле |
081 | } |
082 |
083 | void oled_menu( byte Menu) { |
084 | lcd.clear(); |
085 | lcd.setCursor(0, 0); |
086 | lcd.print(F( " СОКОНАЛИВАТОР+ " )); |
087 | lcd.setCursor(0, 1); |
088 | lcd.print(F( ">" )); |
089 | lcd.setCursor(15, 1); |
090 | lcd.print(F( "<" )); |
091 | switch (Menu) { |
092 | case 0: |
093 | lcd.setCursor(1, 1); |
094 | lcd.print(F( "РЕЖИМЫ РАЗЛИВА" )); |
095 | break ; |
096 | case 1: |
097 | lcd.setCursor(3, 1); |
098 | lcd.print(F( "НАСТРОЙКИ+" )); |
099 | break ; |
100 | case 2: |
101 | lcd.setCursor(5, 1); |
102 | lcd.print(F( "МУЗЫКА" )); |
103 | break ; |
104 | } |
105 | } |
106 |
107 | void oled_nastr( byte Nastr) { |
108 | lcd.clear(); |
109 | lcd.setCursor(0, 0); |
110 | lcd.print(F( " СОКОНАЛИВАТОР+ " )); |
111 | lcd.setCursor(0, 1); |
112 | lcd.print(F( ">" )); |
113 | lcd.setCursor(15, 1); |
114 | lcd.print(F( "<" )); |
115 | switch (Nastr) { |
116 | case 0: |
117 | lcd.setCursor(4, 1); |
118 | lcd.print(F( "ПРОМЫВКА" )); |
119 | break ; |
120 | case 1: |
121 | lcd.setCursor(2, 1); |
122 | lcd.print(F( "ЯРКОСТЬ LEDS" )); |
123 | break ; |
124 | case 2: |
125 | lcd.setCursor(1, 1); |
126 | lcd.print(F( "СКОРОСТЬ СЕРВО" )); |
127 | break ; |
128 | case 3: |
129 | lcd.setCursor(1, 1); |
130 | lcd.print(F( "ОБЩ. ГРОМКОСТЬ" )); |
131 | break ; |
132 | case 4: |
133 | lcd.setCursor(2, 1); |
134 | lcd.print(F( "ГРОМК. АУДИО" )); |
135 | break ; |
136 | } |
137 | } |
138 |
139 | void oled_rezim( byte Rezim) { |
140 | lcd.clear(); |
141 | lcd.setCursor(0, 0); |
142 | lcd.print(F( " СОКОНАЛИВАТОР+ " )); |
143 | lcd.setCursor(0, 1); |
144 | lcd.print(F( ">" )); |
145 | lcd.setCursor(15, 1); |
146 | lcd.print(F( "<" )); |
147 | switch (Rezim) { |
148 | case 0: |
149 | lcd.setCursor(6, 1); |
150 | lcd.print(F( "АВТО" )); |
151 | break ; |
152 | case 1: |
153 | lcd.setCursor(2, 1); |
154 | lcd.print(F( "РУЧНОЙ РЕЖИМ" )); |
155 | break ; |
156 | case 2: |
157 | lcd.setCursor(0, 1); |
158 | lcd.print(F( " МИНУС ОДИН " )); |
159 | break ; |
160 | case 3: |
161 | lcd.setCursor(5, 1); |
162 | lcd.print(F( "ГОРКИ" )); |
163 | break ; |
164 | case 4: |
165 | lcd.setCursor(2, 1); |
166 | lcd.print(F( " ОДИН ИЗ ПЯТИ " )); |
167 | break ; |
168 | } |
169 | } |
170 |
171 | // выводит строчку по чуть чуть, в самый раз и тд. Передается номер строки, на которой выводить сообщение |
172 | void DrinkInfo( byte pos) { |
173 | Serial .println(F( "INFO_DRINK" )); |
174 |
175 | lcd.setCursor(0, 1); |
176 | if (Drink < 15) { |
177 | lcd.print(F( " НЕ МАЛО? " )); |
178 | } else if (Drink < 28) { |
179 | lcd.print(F( " ПО ЧУТЬ - ЧУТЬ " )); |
180 | } else if (Drink < 38) { |
181 | lcd.print(F( " В САМЫЙ РАЗ " )); |
182 | } else if (Drink < 48) { |
183 | lcd.print(F( " ПО ПОЛНОЙ " )); |
184 | } else { |
185 | lcd.print(F( " ДО КРАЕВ " )); |
186 | } |
187 | } |
188 |
189 | // Меню Авто режим |
190 | void oled_auto( int Drink) { |
191 | Serial .println(F( "MENU_AUTO" )); |
192 | lcd.clear(); |
193 | lcd.setCursor(0, 0); |
194 | lcd.print(F( " HАЛИТЬ:" )); |
195 | lcd.setCursor(9, 0); |
196 | lcd.print(Drink); |
197 | Serial .println(Drink); |
198 | lcd.setCursor(12, 0); |
199 | lcd.print(F( "МЛ?" )); |
200 | DrinkInfo(57); |
201 | } |
202 |
203 | // Меню Ручной режим |
204 | void oled_manual( int DrinkCount, int Drink) { |
205 | Serial .println(F( "MENU_RUCHN" )); |
206 | lcd.clear(); |
207 | lcd.setCursor(0, 0); |
208 | lcd.print(F( " HАЛИТЬ:" )); |
209 | lcd.setCursor(9, 0); |
210 | lcd.print(Drink); |
211 | lcd.setCursor(12, 0); |
212 | lcd.print(F( "МЛ?" )); |
213 | Serial .println(Drink); |
214 | lcd.setCursor(0, 1); |
215 | lcd.print(F( " В СТ." )); |
216 | lcd.setCursor(5, 1); |
217 | lcd.print(DrinkCount); |
218 | //Serial.println(DrinkCount); |
219 | //if (DrinkCount == 1) { |
220 | // lcd.setCursor(10, 1); |
221 | // lcd.print(F("КУ ")); |
222 | //} else if (DrinkCount <= 4 ) { |
223 | // lcd.setCursor(10, 1); |
224 | // lcd.print(F("КИ ")); |
225 | //} else { |
226 | // lcd.setCursor(10, 1); |
227 | // lcd.print(F("ОК ")); |
228 | //} |
229 | } |
230 |
231 | // Подсветка рюмок в ручном режимме |
232 | /* void podsvetka () { |
233 | if (DrinkCount == 1) { |
234 | strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку |
235 | } else if (DrinkCount == 2 ) { |
236 | strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку |
237 | strip.setPixelColor(1, strip.Color(0, 0, 255)); // Подствечиваем синим 2-ю рюмку |
238 | } else if (DrinkCount == 3 ) { |
239 | strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку |
240 | strip.setPixelColor(1, strip.Color(0, 0, 255)); // Подствечиваем синим 2-ю рюмку |
241 | strip.setPixelColor(2, strip.Color(0, 0, 255)); // Подствечиваем синим 3-ю рюмку |
242 | } else if (DrinkCount == 4 ) { |
243 | strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку |
244 | strip.setPixelColor(1, strip.Color(0, 0, 255)); // Подствечиваем синим 2-ю рюмку |
245 | strip.setPixelColor(2, strip.Color(0, 0, 255)); // Подствечиваем синим 3-ю рюмку |
246 | strip.setPixelColor(3, strip.Color(0, 0, 255)); // Подствечиваем синим 4-ю рюмку |
247 | } else { |
248 | strip.setPixelColor(0, strip.Color(0, 0, 255)); // Подствечиваем синим 1-ю рюмку |
249 | strip.setPixelColor(1, strip.Color(0, 0, 255)); // Подствечиваем синим 2-ю рюмку |
250 | strip.setPixelColor(2, strip.Color(0, 0, 255)); // Подствечиваем синим 3-ю рюмку |
251 | strip.setPixelColor(3, strip.Color(0, 0, 255)); // Подствечиваем синим 4-ю рюмку |
252 | strip.setPixelColor(4, strip.Color(0, 0, 255)); // Подствечиваем синим 5-ю рюмку |
253 | } |
254 | strip.show(); |
255 | delay(500); |
256 | } */ |
257 |
258 | // Меню яркость |
259 | void oled_led( int bright) { |
260 | lcd.clear(); |
261 | lcd.setCursor(0, 0); |
262 | lcd.print(F( "ВЫБЕРИ ЯРКОСТЬ" )); |
263 | lcd.setCursor(0, 1); |
264 | lcd.print(F( "ЗНАЧЕНИЕ:" )); |
265 | lcd.setCursor(11, 1); |
266 | lcd.print(bright); |
267 | } |
268 |
269 | // Меню серво |
270 | void oled_servo( int servo_speed) { |
271 | lcd.clear(); |
272 | lcd.setCursor(0, 0); |
273 | lcd.print(F( "ВЫБЕРИ СКОРОСТЬ" )); |
274 | lcd.setCursor(0, 1); |
275 | lcd.print(F( "ЗНАЧЕНИЕ:" )); |
276 | lcd.setCursor(11, 1); |
277 | lcd.print(servo_speed); |
278 | } |
279 |
280 | // Меню громкости |
281 | void oled_voltost( int vol_tost) { |
282 | lcd.clear(); |
283 | lcd.setCursor(0, 0); |
284 | lcd.print(F( "ВЫБЕРИ ГРОМКОСТЬ" )); |
285 | lcd.setCursor(0, 1); |
286 | lcd.print(F( "ЗНАЧЕНИЕ:" )); |
287 | lcd.setCursor(11, 1); |
288 | lcd.print(vol_tost); |
289 | } |
290 |
291 | // Меню громкости музыки |
292 | void oled_volmuz( int vol_muz) { |
293 | lcd.clear(); |
294 | lcd.setCursor(0, 0); |
295 | lcd.print(F( "ВЫБЕРИ ГРОМКОСТЬ" )); |
296 | lcd.setCursor(0, 1); |
297 | lcd.print(F( "ЗНАЧЕНИЕ:" )); |
298 | lcd.setCursor(11, 1); |
299 | lcd.print(vol_muz); |
300 | } |
301 |
302 | // Меню Казино |
303 | void oled_cazino( int DrinkCount, int Drink) { |
304 | lcd.clear(); |
305 | lcd.setCursor(0, 0); |
306 | lcd.print(F( "СТАВЬ СТАКАНЧИКИ" )); |
307 | lcd.setCursor(0, 1); |
308 | lcd.print(F( " И НАЖМИ <ОК> " )); |
309 | } |
310 |
311 | // Меню Музыка |
312 | void oled_muzon( int DrinkCount, int Drink) { |
313 | lcd.clear(); |
314 | lcd.setCursor(4, 0); |
315 | lcd.print(F( "СЛУШАЕМ" )); |
316 | lcd.setCursor(4, 1); |
317 | lcd.print(F( "МУЗЫКУ!" )); |
318 | } |
319 |
320 | // Меню налива |
321 | void oled_naliv( int MenuFlag, int Drink, int DrinkCount) { |
322 | lcd.clear(); |
323 | lcd.setCursor(0, 0); |
324 | lcd.print(F( " НАЛИВАЮ" )); |
325 | lcd.setCursor(10, 0); |
326 | lcd.print(Drink); |
327 | lcd.setCursor(13, 0); |
328 | lcd.print(F( "МЛ" )); |
329 | DrinkInfo(57); |
330 | } |
331 |
332 | // Меню налито |
333 | void oled_nalito2( int MenuFlag, int Nalito, int Drink) { |
334 | Serial .println(F( "NALITO" )); |
335 | lcd.clear(); |
336 | lcd.setCursor(0, 0); |
337 | lcd.print(F( " HАЛИТО" )); |
338 | lcd.setCursor(9, 0); |
339 | lcd.print(Drink); |
340 | Serial .println(Drink); |
341 | lcd.setCursor(12 , 0); |
342 | lcd.print(F( "МЛ" )); |
343 | lcd.setCursor(0, 1); |
344 | lcd.print(F( " В" )); |
345 | lcd.setCursor(5, 1); |
346 | lcd.print(Nalito); |
347 | lcd.setCursor(7, 1); |
348 | lcd.print(F( "СТ." )); |
349 | //Serial.println(Nalito); |
350 | //if (Nalito == 1) { |
351 | // lcd.setCursor(10, 1); |
352 | // lcd.print(F("КУ ")); |
353 | //} else if (Nalito <= 4 ) { |
354 | // lcd.setCursor(10, 1); |
355 | // lcd.print(F("КИ ")); |
356 | //} else { |
357 | // lcd.setCursor(10, 1); |
358 | // lcd.print(F("ОК ")); |
359 | //} |
360 | } |
361 |
362 | // Тосты |
363 | void Tost() { |
364 | randomSeed(analogRead(7)); |
365 | lcd.clear(); |
366 | lcd.setCursor(0, 1); |
367 | lcd.print(F( "ЗАБЕРИ СТАКАНЧИК" )); |
368 | delay (2000); |
369 | myDFPlayer.volume(vol_tost); //Громкость |
370 | delay (100); |
371 | myDFPlayer.playFolder (2, random (files_tost + 1)); //воспроизводить определенный mp3 в папке 02 |
372 | } |
373 |
374 |
375 | void ServoNaliv( byte rumka) { |
376 | servo.attach(PIN_SERVO); |
377 | for ( int pos = servo.read(); pos <= Rumka_pos[rumka]; pos += 1) { |
378 | // с шагом в 1 градус |
379 | servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos' |
380 | delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию |
381 | } |
382 | servo.detach(); |
383 | } |
384 |
385 |
386 | void ServoParking () { |
387 | //Serial.println(servo.read()); |
388 | servo.attach(PIN_SERVO); |
389 | for ( int pos = servo.read(); pos >= 0; pos -= 1) { |
390 | // с шагом в 1 градус |
391 | servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos' |
392 | delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию |
393 | } |
394 | servo.detach(); |
395 | } |
396 |
397 |
398 | void CvetoMuzik() { |
399 | for ( long firstPixelHue = 0; firstPixelHue < 5 * 65536; firstPixelHue += 768) { |
400 | for ( int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip... |
401 | int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels()); |
402 | strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue))); |
403 | } |
404 | strip.show(); |
405 | delay(10); |
406 | } |
407 | } |
408 |
409 |
410 | void setup () { |
411 | randomSeed(analogRead(7)); //инициализация функции рандом по пину А7 для исключения повторения последовательности значений при включении |
412 |
413 | mySoftwareSerial.begin(9600); |
414 | Serial .begin(9600); |
415 | delay(1000); |
416 | if (!myDFPlayer.begin(mySoftwareSerial)) { |
417 | Serial .println( "Unable to begin:" ); |
418 | Serial .println( "1.Please recheck the connection!" ); |
419 | Serial .println( "2.Please insert the SD card!" ); |
420 | while ( true ); |
421 | } |
422 | myDFPlayer.setTimeOut(300); |
423 | myDFPlayer.EQ(DFPLAYER_EQ_NORMAL); |
424 | files = myDFPlayer.readFileCountsInFolder(3); // Считаем сколько треков в папке с музыкой 03 |
425 | files_tost = myDFPlayer.readFileCountsInFolder(2); // Считаем сколько треков в папке с тостами 02 |
426 |
427 | address = 30; |
428 | EEPROM. get (address, bright); |
429 | if ( bright < 0 || bright > 255) { |
430 | bright = 100; |
431 | } |
432 |
433 | address = 20; //ячейка памяти |
434 | EEPROM. get (address, servo_speed); // считываем из памяти скорость серво |
435 | if ( servo_speed < 5 || servo_speed > 30) { |
436 | servo_speed = 10; |
437 | } |
438 |
439 | address = 40; //ячейка памяти |
440 | EEPROM. get (address, vol_tost); // считываем из памяти громкость |
441 | if ( vol_tost < 2 || vol_tost > 30) { |
442 | vol_tost = 10; |
443 | } |
444 |
445 | address = 50; //ячейка памяти |
446 | EEPROM. get (address, vol_muz); // считываем из памяти громкость музыки |
447 | if ( vol_muz < 2 || vol_muz > 30) { |
448 | vol_muz = 10; |
449 | } |
450 |
451 | myDFPlayer.volume(vol_tost); //Громкость |
452 | delay (100); |
453 | myDFPlayer.playFolder(1, 1); //Воспроизведение первого mp3 |
454 |
455 | lcd.init(); // инициализация дисплея |
456 | lcd.backlight(); |
457 | lcd.clear(); |
458 | lcd.setCursor(0, 0); |
459 | lcd.print(F( " НУ ЧТО " )); |
460 | lcd.setCursor(0, 1); |
461 | lcd.print(F( "НА-ЧАА-ЛИИ-ИИИИИ" )); |
462 | delay (2000); |
463 |
464 | pinMode(pin_SW, INPUT); // устанавливаем pin pin_SW как вход |
465 | digitalWrite(pin_SW, HIGH); // Поддяжка вывода к 1 |
466 | pinMode(pin_A, INPUT); |
467 | pinMode(pin_B, INPUT); |
468 | pinMode(PIN_PUMP, OUTPUT); |
469 | digitalWrite(PIN_PUMP, 0); |
470 | currentTime = millis(); |
471 | loopTime = currentTime; |
472 |
473 |
474 |
475 | strip.begin(); |
476 | strip.setBrightness(bright); |
477 | CvetoMuzik(); |
478 |
479 | oled_menu(0); |
480 | for ( int i = 0; i < 5; i++) { |
481 | pinMode(Optics[i], INPUT); |
482 | } |
483 | ServoParking(); |
484 | } |
485 |
486 | void loop () { |
487 | currentTime = millis(); |
488 | if (currentTime >= (loopTime + 5)) { // проверяем каждые 5мс |
489 | encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера |
490 | encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера |
491 | if ((!encoder_A) && (encoder_A_prev)) { // если состояние изменилось с положительного к нулю |
492 |
493 | //Вращение влево |
494 | if (encoder_B) { |
495 | if (MenuFlag == 0) { |
496 | (Menu <= 0 ) ? Menu = 2 : Menu--; |
497 | oled_menu(Menu); |
498 | } else if (MenuFlag == 1) { |
499 | (Rezim <= 0 ) ? Rezim = 4 : Rezim--; |
500 | oled_rezim(Rezim); |
501 | } else if (MenuFlag == 2) { |
502 | (Nastr <= 0 ) ? Nastr = 4 : Nastr--; |
503 | oled_nastr(Nastr); |
504 | } else if (MenuFlag == 4) { |
505 | (Drink <= min_Drink ) ? Drink = max_Drink : Drink -= 5; |
506 | oled_auto(Drink); |
507 | } else if (MenuFlag == 5) { |
508 | (DrinkCount >= max_DrinkCount ) ? DrinkCount = 1 : DrinkCount++; |
509 | oled_manual(DrinkCount, Drink); |
510 | //podsvetka(); |
511 | } else if (MenuFlag == 9) { |
512 | bright -= 5; |
513 | bright = constrain(bright, 0, 254); |
514 | oled_led(bright); |
515 | strip.setBrightness(bright); |
516 | strip.show(); |
517 | delay (100); |
518 | } else if (MenuFlag == 10) { |
519 | servo_speed -= 5; |
520 | servo_speed = constrain(servo_speed, 5, 30); |
521 | oled_servo(servo_speed); |
522 | delay (100); |
523 |
524 | } else if (MenuFlag == 11) { |
525 | vol_tost -= 2; |
526 | vol_tost = constrain(vol_tost, 2, 30); |
527 | oled_voltost(vol_tost); |
528 | delay (100); |
529 | } else if (MenuFlag == 12) { |
530 | vol_muz -= 2; |
531 | vol_muz = constrain(vol_muz, 2, 30); |
532 | oled_volmuz(vol_muz); |
533 | delay (100); |
534 |
535 | } else if (MenuFlag == 3) { |
536 | j++; |
537 | if (j > files) |
538 | j = 1; |
539 | myDFPlayer.playFolder (3, j); |
540 | oled_muzon(DrinkCount, Drink); |
541 | } |
542 |
543 | //Вращение вправо |
544 | } else { |
545 | if (MenuFlag == 0) { |
546 | (Menu >= 2 ) ? Menu = 0 : Menu++; |
547 | oled_menu(Menu); |
548 | } else if (MenuFlag == 1) { |
549 | (Rezim >= 4 ) ? Rezim = 0 : Rezim++; // |
550 | oled_rezim(Rezim); |
551 | } else if (MenuFlag == 2) { |
552 | (Nastr >= 4 ) ? Nastr = 0 : Nastr++; // |
553 | oled_nastr(Nastr); |
554 | } else if (MenuFlag == 4) { |
555 | (Drink >= max_Drink ) ? Drink = min_Drink : Drink += 5; // Увеличиваем кол-во милилитров в рюмку |
556 | oled_auto(Drink); |
557 | } else if (MenuFlag == 5) { |
558 | (Drink >= max_Drink ) ? Drink = min_Drink : Drink += 5; |
559 | oled_manual(DrinkCount, Drink); |
560 | } else if (MenuFlag == 9) { |
561 | bright += 5; |
562 | bright = constrain(bright, 0, 254); |
563 | oled_led(bright); |
564 | strip.setBrightness(bright); |
565 | strip.show(); |
566 | delay (100); |
567 | } else if (MenuFlag == 10) { |
568 | servo_speed += 5; |
569 | servo_speed = constrain(servo_speed, 5, 30); |
570 | oled_servo(servo_speed); |
571 | delay (100); |
572 |
573 | } else if (MenuFlag == 11) { |
574 | vol_tost += 2; |
575 | vol_tost = constrain(vol_tost, 2, 30); |
576 | oled_voltost(vol_tost); |
577 | delay (100); |
578 | } else if (MenuFlag == 12) { |
579 | vol_muz += 2; |
580 | vol_muz = constrain(vol_muz, 2, 30); |
581 | oled_volmuz(vol_muz); |
582 | delay (100); |
583 |
584 | } else if (MenuFlag == 3) { |
585 | j++; |
586 | if (j > files) |
587 | j = 1; |
588 | myDFPlayer.playFolder (3, j); |
589 | oled_muzon(DrinkCount, Drink); |
590 | } |
591 | } |
592 | } |
593 |
594 | // Режим промывки |
595 | encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла |
596 | int encoder_sw = digitalRead(pin_SW); |
597 | if (encoder_sw == 0 && encoder_sw != encoder_sw_prew) { |
598 | int pause_sw = 0; |
599 | boolean promivka = false ; |
600 | while (digitalRead(pin_SW) == 0) { |
601 | delay(100); |
602 | pause_sw++; |
603 | if (pause_sw > 20 && Nastr != 0 ) break ; |
604 | if (pause_sw > 20 && MenuFlag == 2 && Nastr == 0 && promivka == false ) { |
605 | promivka = true ; |
606 | pump_enable(); // Включаем насос |
607 | delay (100); |
608 | myDFPlayer.volume(vol_tost); |
609 | delay (100); |
610 | myDFPlayer.playFolder (1, 100); |
611 | delay (100); |
612 | lcd.clear(); |
613 | lcd.setCursor(0, 0); |
614 | lcd.print(F( "П Р О М Ы В К А" )); |
615 | lcd.setCursor(2, 1); |
616 | lcd.print( "<><><><><><>" ); |
617 | } |
618 | } |
619 | //После отпускания кнопки, обрабатываем |
620 | if (promivka == true ) { //Отпустили кнопку. |
621 | promivka = false ; |
622 | pump_disable() ; //Выключаем насос |
623 | oled_nastr(0); |
624 | } else { |
625 |
626 | //Обработка всех нажатий кнопки |
627 | if (Menu == 0 && MenuFlag == 0 && pause_sw < 10) { |
628 | MenuFlag = 1; |
629 | oled_rezim(Rezim); |
630 | } else if (Rezim == 0 && MenuFlag == 1 && pause_sw < 10) { |
631 | MenuFlag = 4; |
632 | oled_auto(Drink); |
633 | } else if (MenuFlag == 4 && pause_sw > 20) { |
634 | MenuFlag = 1; |
635 | oled_rezim(0); |
636 | } else if (MenuFlag == 1 && pause_sw > 20) { |
637 | MenuFlag = 0; |
638 | oled_menu(0); |
639 | } |
640 |
641 | //Начинается автоматический разлив |
642 | else if (MenuFlag == 4 ) { |
643 | Serial .println( "AUTO" ); //Начало автоматического разлива |
644 | oled_naliv(MenuFlag, Drink, DrinkCount); |
645 | byte drink_count = 0; |
646 | for ( int y = 0; y < max_DrinkCount; y++) { |
647 | if (analogRead(Optics[y]) > Optics_porog[y] ) { |
648 | strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом |
649 | strip.show(); |
650 | ServoNaliv(y); |
651 | delay (300); |
652 | pump_timer(Drink); // Налив. |
653 | delay(1000); |
654 | strip.setPixelColor(y, strip.Color(0, 255, 0)); |
655 | strip.show(); |
656 | drink_count++; |
657 | delay(1000); |
658 | } |
659 | } |
660 | if (drink_count > 0) { |
661 | oled_nalito(MenuFlag, drink_count, Drink ); |
662 | delay(2000); |
663 | ServoParking(); |
664 | Tost(); |
665 | CvetoMuzik(); |
666 | oled_auto(Drink); |
667 | } else { |
668 | lcd.clear(); |
669 | lcd.setCursor(0, 1); |
670 | lcd.print(F( "НЕТ СТАКАНЧИКОВ!" )); |
671 | myDFPlayer.volume(vol_tost); |
672 | delay (100); |
673 | myDFPlayer.playFolder (1, 88); |
674 | delay(2000); |
675 | oled_auto(Drink); |
676 | } |
677 | // Нажатие меню ручное |
678 | } else if (Rezim == 1 && MenuFlag == 1 && pause_sw < 10) { |
679 | MenuFlag = 5; |
680 | oled_manual(DrinkCount, Drink); |
681 | } else if (MenuFlag == 5 && pause_sw > 20) { |
682 | MenuFlag = 1; |
683 | oled_rezim(1); |
684 | } |
685 |
686 | //Начинается ручной разлив |
687 | else if (MenuFlag == 5 ) { |
688 | Serial .println( "RUCHNOY" + String(DrinkCount)); |
689 | oled_naliv(MenuFlag, Drink, DrinkCount); // Выводим на экран наливаем ... |
690 | for ( int y = 0; y < DrinkCount; y++) { |
691 | strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом |
692 | strip.show(); |
693 | ServoNaliv(y); |
694 | delay (300); |
695 | pump_timer(Drink); // Налив. |
696 | delay(1000); |
697 | strip.setPixelColor(y, strip.Color(0, 255, 0)); |
698 | strip.show(); |
699 | delay(1000); |
700 | } |
701 | oled_nalito(MenuFlag, DrinkCount, Drink ); |
702 | delay(2000); |
703 | ServoParking(); |
704 | Tost(); |
705 | CvetoMuzik(); |
706 | oled_manual(DrinkCount, Drink); |
707 | } |
708 |
709 | //нажатие меню яркости |
710 | else if (Menu == 1 && MenuFlag == 0 && pause_sw < 10) { |
711 | MenuFlag = 2; |
712 | oled_nastr(Nastr); |
713 | } else if (Nastr == 1 && MenuFlag == 2 && pause_sw < 10) { |
714 | MenuFlag = 9; |
715 | oled_led(bright); |
716 | } else if (MenuFlag == 9 && pause_sw > 20) { |
717 | MenuFlag = 2; |
718 | oled_nastr(1); |
719 | address = 30; |
720 | EEPROM.put(address, bright); |
721 | } else if (MenuFlag == 2 && pause_sw > 20) { |
722 | MenuFlag = 0; |
723 | oled_menu(1); |
724 |
725 | } else if (MenuFlag == 9 ) { |
726 | CvetoMuzik(); |
727 | } |
728 |
729 | // нажатие меню скорости серво |
730 | else if (Menu == 1 && MenuFlag == 0 && pause_sw < 10) { |
731 | MenuFlag = 2; |
732 | oled_nastr(Nastr); |
733 | } else if (Nastr == 2 && MenuFlag == 2 && pause_sw < 10) { |
734 | MenuFlag = 10; |
735 | oled_servo(servo_speed); |
736 | } else if (MenuFlag == 10 && pause_sw > 20) { |
737 | MenuFlag = 2; |
738 | oled_nastr(2); |
739 | address = 20; |
740 | EEPROM.put(address, servo_speed); |
741 | } else if (MenuFlag == 10) { |
742 |
743 | // после нажатия энкодера запускаем серву для проверки скорости |
744 | servo.attach(PIN_SERVO); |
745 | for ( int pos = servo.read(); pos <= 180; pos += 1) { |
746 | servo.write(pos); |
747 | delay(servo_speed); |
748 | } |
749 | for ( int pos = servo.read(); pos >= 0; pos -= 1) { |
750 |
751 | servo.write(pos); |
752 | delay(servo_speed); |
753 | } |
754 | } |
755 |
756 | // нажатие меню громкости |
757 | else if (Menu == 1 && MenuFlag == 0 && pause_sw < 10) { |
758 | MenuFlag = 2; |
759 | oled_nastr(Nastr); |
760 | } else if (Nastr == 3 && MenuFlag == 2 && pause_sw < 10) { |
761 | MenuFlag = 11; |
762 | oled_voltost(vol_tost); |
763 | } else if (MenuFlag == 11 && pause_sw > 20) { |
764 | MenuFlag = 2; |
765 | oled_nastr(3); |
766 | address = 40; |
767 | EEPROM.put(address, vol_tost); |
768 | } else if (MenuFlag == 11) { |
769 | |
770 | myDFPlayer.volume(vol_tost); |
771 | delay (100); |
772 | myDFPlayer.playFolder(1, 1); |
773 | } |
774 |
775 |
776 | // нажатие меню громкости музыки |
777 | else if (Menu == 1 && MenuFlag == 0 && pause_sw < 10) { |
778 | MenuFlag = 2; |
779 | oled_nastr(Nastr); |
780 | } else if (Nastr == 4 && MenuFlag == 2 && pause_sw < 10) { |
781 | MenuFlag = 12; |
782 | oled_volmuz(vol_muz); |
783 | } else if (MenuFlag == 12 && pause_sw > 20) { |
784 | MenuFlag = 2; |
785 | oled_nastr(4); |
786 | address = 50; |
787 | EEPROM.put(address, vol_muz); |
788 | } else if (MenuFlag == 12) { |
789 |
790 | // после нажатия энкодера запускаем музыку |
791 | myDFPlayer.volume(vol_muz); |
792 | delay (100); |
793 | myDFPlayer.playFolder(1, 1); |
794 | } |
795 |
796 | // Нажатие меню СИНИЙ БАРМЕН наливатет в рюмки случайный объем |
797 | else if (Rezim == 3 && MenuFlag == 1 && pause_sw < 10) { |
798 | MenuFlag = 7; |
799 | oled_cazino(DrinkCount, Drink); |
800 | } else if (MenuFlag == 7 && pause_sw > 20) { |
801 | MenuFlag = 1; |
802 | oled_rezim(3); |
803 | } else if (MenuFlag == 7 ) { //Начинается рулетка |
804 | myDFPlayer.volume(vol_tost); //Громкость |
805 | delay (100); |
806 | myDFPlayer.playFolder (1, 105); // Мелоди рулетки |
807 | delay (1000); |
808 | CvetoMuzik(); |
809 | delay (2000); |
810 | for ( int y = 0; y <= 4; y++) { |
811 | strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом |
812 | strip.show(); |
813 | ServoNaliv(y); |
814 | delay (300); |
815 | pump_timer(random(min_Drink, max_Drink)); // Налив |
816 | delay(1000); |
817 | strip.setPixelColor(y, strip.Color(0, 255, 0)); |
818 | strip.show(); |
819 | } |
820 | ServoParking(); |
821 | myDFPlayer.playFolder (1, 102); |
822 | delay (400); |
823 | CvetoMuzik(); |
824 | Tost(); |
825 | oled_cazino(DrinkCount, Drink); |
826 | } |
827 |
828 |
829 | // Нажатие меню музыка |
830 | else if (Menu == 2 && MenuFlag == 0 && pause_sw < 10) { // Вошли в музыку |
831 | MenuFlag = 3; |
832 | myDFPlayer.volume(vol_muz); |
833 | delay (100); |
834 | myDFPlayer.loopFolder(3); |
835 | oled_muzon(DrinkCount, Drink); |
836 | } else if (MenuFlag == 3 && pause_sw > 20) { |
837 | MenuFlag = 0; |
838 | oled_menu(2); |
839 | } else if (MenuFlag == 3 && pause_sw < 10) { |
840 | myDFPlayer.pause(); |
841 | MenuFlag = 0; |
842 | oled_menu(2); |
843 | } |
844 |
845 |
846 | // Нажатие меню КАЗИНО наливает только в одну рюмку случайно |
847 | else if (Rezim == 4 && MenuFlag == 1 && pause_sw < 10) { |
848 | MenuFlag = 8; |
849 | oled_cazino(DrinkCount, Drink); |
850 | } else if (MenuFlag == 8 && pause_sw > 20) { |
851 | MenuFlag = 1; |
852 | oled_rezim(4); |
853 | } else if (MenuFlag == 8 ) { |
854 |
855 | randomSeed(analogRead(7)); |
856 | myDFPlayer.volume(vol_tost); |
857 | delay (100); |
858 | myDFPlayer.playFolder (1, 105); |
859 | delay (1000); |
860 | CvetoMuzik(); |
861 | delay (2000); |
862 | for ( int y = 0; y <= 4; y++) { |
863 | strip.setPixelColor(y, strip.Color(255, 0, 0)); |
864 | strip.show(); |
865 | } |
866 | servo.attach(PIN_SERVO); // имитация рулетки сервой |
867 | for ( int pos = servo.read(); pos <= 180; pos += 1) { |
868 | // с шагом в 1 градус |
869 | servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos' |
870 | delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию |
871 | } |
872 | for ( int pos = servo.read(); pos >= 0; pos -= 1) { |
873 | // с шагом в 1 градус |
874 | servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos' |
875 | delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию |
876 | } |
877 | int r = random(0, 5); //выбор одной рюмки в которую нальёт |
878 | ServoNaliv(r); // Перемещяемся к рюмке |
879 | strip.setPixelColor(r, strip.Color(0, 255, 0)); // Подствечиваем зеленым, налито, остальные красные |
880 | delay(1000); |
881 | strip.show(); |
882 | pump_timer(Drink); // Налив |
883 | servo.detach(); |
884 | ServoParking(); |
885 | myDFPlayer.volume(vol_tost); //Громкость |
886 | delay (100); |
887 | myDFPlayer.playFolder (1, 102); // Фанфары |
888 | delay (400); |
889 | CvetoMuzik(); |
890 | Tost(); |
891 | oled_cazino(DrinkCount, Drink); |
892 | } |
893 |
894 | // Нажатие меню НАША РУЛЕТКА, не наливаем в одну рюмку случайно |
895 | else if (Rezim == 2 && MenuFlag == 1 && pause_sw < 10) { |
896 | MenuFlag = 6; |
897 | oled_cazino(DrinkCount, Drink); |
898 | } else if (MenuFlag == 6 && pause_sw > 20) { |
899 | MenuFlag = 1; |
900 | oled_rezim(2); |
901 | } else if (MenuFlag == 6 ) { |
902 |
903 | randomSeed(analogRead(7)); |
904 | myDFPlayer.volume(vol_tost); //Громкость |
905 | delay (100); |
906 | myDFPlayer.playFolder (1, 105); //Мелодия рулетки |
907 | delay (1000); |
908 | CvetoMuzik(); |
909 | delay (2000); |
910 | for ( int y = 0; y <= 4; y++) { |
911 | strip.setPixelColor(y, strip.Color(255, 0, 0)); |
912 | strip.show(); |
913 | } |
914 | servo.attach(PIN_SERVO); // имитация рулетки сервой |
915 | for ( int pos = servo.read(); pos <= 180; pos += 1) { |
916 | // с шагом в 1 градус |
917 | servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos' |
918 | delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию |
919 | } |
920 | for ( int pos = servo.read(); pos >= 0; pos -= 1) { |
921 | // с шагом в 1 градус |
922 | servo.write(pos); // даем серве команду повернуться в положение, которое задается в переменной 'pos' |
923 | delay(servo_speed); // ждем , пока ротор сервы выйдет в заданную позицию |
924 | } |
925 | int r = random(0, 5); //выбор одной рюмки в которую НЕ нальёт |
926 | for ( int y = 0; y < 5; y++) { |
927 | if (y != r) { |
928 | strip.setPixelColor(y, strip.Color(255, 0, 0)); // Подствечиваем красным цветом |
929 | strip.show(); |
930 | ServoNaliv(y); // Перемещяемся к рюмке |
931 | delay (300); //Задержка перед налитием после поворота к рюмке |
932 | pump_timer(Drink); // Налив. |
933 | delay(1000); |
934 | strip.setPixelColor(y, strip.Color(0, 255, 0)); // Подствечиваем зеленым , налито. |
935 | strip.show(); |
936 | delay(500); |
937 | } |
938 | else { |
939 | (y = r); |
940 | } |
941 | } |
942 | servo.detach(); |
943 | ServoParking(); |
944 | myDFPlayer.volume(vol_tost); //Громкость |
945 | delay (100); |
946 | myDFPlayer.playFolder (1, 102); //Фанфары |
947 | delay (400); |
948 | CvetoMuzik(); |
949 | Tost(); |
950 | oled_cazino(DrinkCount, Drink); |
951 | } |
952 | } |
953 | } |
954 |
955 | // Работа оптодатчиков |
956 | if (currentTime >= (ledTime + 300)) { |
957 | for ( int i = 0; i < max_DrinkCount; i++) { |
958 | int val = analogRead(Optics[i]); |
959 | if (val > Optics_porog[i]) { |
960 | strip.setPixelColor(i, strip.Color(0, 0, 255)); |
961 | } else { |
962 | strip.setPixelColor(i, strip.Color(0, 0, 0)); |
963 | } |
964 | } |
965 | strip.show(); |
966 | ledTime = currentTime; |
967 | } |
968 | encoder_sw_prew = encoder_sw; |
969 | loopTime = currentTime; |
970 | } |
971 | } |
Вместо ручного режима сделать режим, когда можно будет выбирать разный объем сока в разный стаканчик (686 строка). Соответственно переделать меню (204 строка). И прицепом, что-то не получилось в режиме один из пяти сделать зависимость налива от количества поставленных стаканчиков (846 строка).
Все-таки решил дособрать агрегат для ребятишек. Если сейчас не получится, можно в праздники не торопясь.
всех с наступающим!
Ворота не успел сделать? Жаль мужика.
500 рублей
Ворота не успел сделать? Жаль мужика.
:((
500 рублей
Праздники... Уехал с внуками на дачу. Моя почта ded_1961СОБАКАлист.ру Не срочно, как будет свободное время. У меня +4 к времени МСК.
Все еще актуально. Спасибо.
Деда, а что, Бармалей не справился ?
Взял бабосы и слилсо? ;)
Все еще актуально. Спасибо.
5т.р. и схему. Без неё не возьмусь. Или нормальное ТЗ.
Взял бабосы и слилсо? ;)
Нет конечно. Просто не отписался. Видимо не интересно стало после НГ :))
Все еще актуально. Спасибо.
5т.р. и схему. Без неё не возьмусь. Или нормальное ТЗ.
Как-то для детской игрушки многовато, как мне кажется. Хотя я не знаю расценок на такого рода исполнения. За предложение спасибо, подумаю.
Вы оцениваете с точки зрения назначения, а исполнитель с точки зрения затраченного времени.
Может быть имеет смысл просто выбрать один из готовых скетчей наливаторов, коих в инете море ?
Может быть имеет смысл просто выбрать один из готовых скетчей наливаторов, коих в инете море ?
Насколько я понял ТС - готовый скетч у него есть, и даже запущен и работает. Теперь ему хочется индивидуальной подстройки под себя.
При всем уважении, такие доработки обычно требуют кучи времени для вникания с исходный код. 5 тыр в этом случае - скорее нижняя граница...
Он же просит переделать 2 строки в коде. Даже пишет какие.
550р
Он же просит переделать 2 строки в коде. Даже пишет какие.
550р
А чё, со времён #2 уже подорожало?
А вы давно в магазинах были?
Не хотите отвечать - не отвечайте, я Вас не заставляю, но вопросом на вопрос отвечать не надо, если Вам не трудно, конечно.
Так у меня вопрос чисто риторический. То есть, вопрос-ответ.
У нас доширак подорожал на 10 процентов, если вам так понятнее будет.
Вопрос снимаю. Спасибо за предложения. Вроде как сам разобрался. Даже работает, что странно :))
Удачи всем.