Меню для вода параметров в программу при помощи LCD шилда 1602
- Войдите на сайт для отправки комментариев
Помогите разобраться с разработкой меню для вода параметров. int a = 5; // время загрузки в секундах int b = 2; // время задержки в секундах int c = 10; // время предварительный вакуум в секундах int d = 20; // время пропарки в секундах int e = 5; // время вакуумное охлаждение в секундах int f = 5; // время остывание в секундах шилд LCD с кнопками byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; // 0 else if (val < 110) return 3; // 98 else if (val < 300) return 4; // 257 else if (val < 450) return 2; // 409 else if (val < 650) return 1; // 639 else return 0; Программа работает но приходится изменять параметры в ручную и перезаливать в ардуину. программа выглядит так: // include the library code: #include
// initialize the library with the numbers of the interface pins LiquidCrystal lcd(8, 9, 4, 5, 6, 7); byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 110) return 3; else if (val < 300) return 4; else if (val < 450) return 2; else if (val < 650) return 1; else return 0; } int a = 5; // время загрузки в секундах int b = 2; // время задержки в секундах int c = 10; // время предварительный вакуум в секундах int d = 20; // время пропарки в секундах int e = 5; // время вакуумное охлаждение в секундах int f = 5; // время остывание в секундах void setup() { // put your setup code here, to run once: // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(3, OUTPUT); pinMode(2, OUTPUT); } void loop() { // put your main code here, to run repeatedly: lcd.clear(); lcd.print("* START *"); delay(3000); lcd.clear(); lcd.print("* ZAGRUZKA *"); digitalWrite(13, HIGH); // включен канал №13 delay(a*1000); digitalWrite(13, LOW); // выключен канал №13 delay(5000); lcd.clear(); lcd.print("* PRED VAKUUM *"); digitalWrite(12, HIGH); // включен канал №12 delay(b*1000); lcd.clear(); lcd.print("* VAKUUM + PAR *"); digitalWrite(11, HIGH); // включен канал №11 delay((c-b)*1000); digitalWrite(12, LOW); // выключен канал №12 lcd.clear(); lcd.print("* PAR *"); delay((d-b-c)*1000); digitalWrite(11, LOW); // выключен канал №11 //нужно условие выключения не по времени а от данным манометра lcd.clear(); lcd.print("*VAK.OXLAGDENIE*"); digitalWrite(3, HIGH); // включен канал №3 delay(e*1000); digitalWrite(3, LOW); // выключен канал №3 lcd.clear(); lcd.print("* STABILIZACIY *"); digitalWrite(2, HIGH); // включен канал №2 delay(f*1000); digitalWrite(2, LOW); // выключен канал №2 lcd.clear(); lcd.print("* BLOK GOTOV *"); // команда стоп перезапуск программы кнопка analogWrite(10,100); delay(1000); analogWrite(10,10); delay(1000); analogWrite(10,100); delay(1000); analogWrite(10,10); delay(1000); analogWrite(10,100); delay(1000); analogWrite(10,10); delay(1000); analogWrite(10,100); delay(1000); analogWrite(10,10); delay(1000); analogWrite(10,100); delay(10000); } Буду благодарен за любой совет. Просто не могу понять в какую сторону двигаться.
Афигеть!
Я даже не могу угадать, как такое сообщение получилось? Поделитесь секретом. Оно ж реально ВСЁ в одну строку!!!
Хочу так же научиться!
хаххха ржу не могу
Сам в шоке. Сейчас исправлю.
Афигеть!
Я даже не могу угадать, как такое сообщение получилось? Поделитесь секретом. Оно ж реально ВСЁ в одну строку!!!
Хочу так же научиться!
"кто не может сикать тот будет паскалить" ...правда я уже повторяюсь...вот и эталон языка си, всё строго в одной строке )))
Код не проверял так как вставлен не правильно но с таким количеством "delay" он будет просто ВИСЕТЬ.
delay(4294967295);
// include the library code: #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(8, 9, 4, 5, 6, 7); byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 110) return 3; else if (val < 300) return 4; else if (val < 450) return 2; else if (val < 650) return 1; else return 0; } int a = 5; // время загрузки в секундах int b = 2; // время задержки в секундах int c = 10; // время предварительный вакуум в секундах int d = 20; // время пропарки в секундах int e = 5; // время вакуумное охлаждение в секундах int f = 5; // время остывание в секундах void setup() { // put your setup code here, to run once: // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(3, OUTPUT); pinMode(2, OUTPUT); } void loop() { // put your main code here, to run repeatedly: lcd.clear(); lcd.print("* START *"); delay(3000); lcd.clear(); lcd.print("* ZAGRUZKA *"); digitalWrite(13, HIGH); // включен канал №13 delay(a*1000); digitalWrite(13, LOW); // выключен канал №13 delay(5000); lcd.clear(); lcd.print("* PRED VAKUUM *"); digitalWrite(12, HIGH); // включен канал №12 delay(b*1000); lcd.clear(); lcd.print("* VAKUUM + PAR *"); digitalWrite(11, HIGH); // включен канал №11 delay((c-b)*1000); digitalWrite(12, LOW); // выключен канал №12 lcd.clear(); lcd.print("* PAR *"); delay((d-b-c)*1000); digitalWrite(11, LOW); // выключен канал №11 //нужно условие выключения не по времени а от данных манометра lcd.clear(); lcd.print("*VAK.OXLAGDENIE*"); digitalWrite(3, HIGH); // включен канал №3 delay(e*1000); digitalWrite(3, LOW); // выключен канал №3 lcd.clear(); lcd.print("* STABILIZACIY *"); digitalWrite(2, HIGH); // включен канал №2 delay(f*1000); digitalWrite(2, LOW); // выключен канал №2 lcd.clear(); lcd.print("* BLOK GOTOV *"); // команда стоп перезапуск программы кнопка analogWrite(10,100); delay(1000); analogWrite(10,10); delay(1000); analogWrite(10,100); delay(1000); analogWrite(10,10); delay(1000); analogWrite(10,100); delay(1000); analogWrite(10,10); delay(10000); }чётко сформулируйте свою задачу и идите в раздел ищу исполнителя
здесь вас просто закидают....
Да ладно - "закидают". Человек нормально интересуется. Даже написал сам что-то. И код правильно вставил. Пусть и с третьего раза ;).
Посмотрите такое решение. Код я не проверял но должен работать
// include the library code: #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(8, 9, 4, 5, 6, 7); byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 110) return 3; else if (val < 300) return 4; else if (val < 450) return 2; else if (val < 650) return 1; else return 0; } int a = 5; // время загрузки в секундах int b = 2; // время задержки в секундах int c = 10; // время предварительный вакуум в секундах int d = 20; // время пропарки в секундах int e = 5; // время вакуумное охлаждение в секундах int f = 5; // время остывание в секундах bool fl_pause[1];//массив данных. Количество элементов - количеству таймеров int var = 1; int mig = 0; void setup() { // put your setup code here, to run once: // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(3, OUTPUT); pinMode(2, OUTPUT); } //Функция дребезга или паузы (time-время задержки, nomer-номер таймера) boolean my_pausa(unsigned long time, byte nomer) { bool x = 0; if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1; if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0; return x; } void blik(){ const bool f_blik; if(f_blik)analogWrite(10,100), f_blik != f_blik; else analogWrite(10,10), f_blik != f_blik; } void loop() { // Здесь можно проверять кнопки датчики и пр. без задержки //Для запуска или перезапуска процедуры делаем "var=1;" switch (var) { case 1: lcd.clear(); lcd.print("* START *"); if (my_pausa(3000, 0)) ++var; break; case 2: lcd.clear(); lcd.print("* ZAGRUZKA *"); digitalWrite(13, HIGH); // включен канал №13 if (my_pausa(5000, 0)) ++var; break; case 3: digitalWrite(13, LOW); // вывключен канал №13 if (my_pausa(5000, 0)) ++var; break; case 4: lcd.clear(); lcd.print("* PRED VAKUUM *"); digitalWrite(12, HIGH); // включен канал №12 if (my_pausa(2000, 0)) ++var; break; case 5: lcd.clear(); lcd.print("* VAKUUM + PAR *"); digitalWrite(11, HIGH); // включен канал №11 if (my_pausa(8000, 0)) ++var; break; case 6: digitalWrite(12, LOW); // вывключен канал №12 lcd.clear(); lcd.print("* PAR *"); if (my_pausa((d-b-c)*1000), 0)) ++var; //можно и так но лучше if (my_pausa(8000, 0) break; case 7: digitalWrite(11, LOW); // вывключен канал №11 lcd.clear(); lcd.print("*VAK.OXLAGDENIE*"); digitalWrite(3, HIGH); // включен канал №3 if (my_pausa(5000, 0)) ++var; break; case 8: digitalWrite(3, LOW); // вывключен канал №3 lcd.clear(); lcd.print("* STABILIZACIY *"); digitalWrite(2, HIGH); // включен канал №2 if (my_pausa(5000, 0)) ++var; break; case 9: digitalWrite(2, LOW); // вывключен канал №2 lcd.clear(); lcd.print("* BLOK GOTOV *"); if (mig < 29 && if (my_pausa(1000, 0))){ ++mig; blik(); } else{ if (my_pausa(10000, 0)){ mig =0; //Здесь не знаю - Если надо зациклить то "var=1;" // Если ждем команды то "var=0;" } } break; } }Для создания меню нужно посмотреть на прграмму под несколько другим углом:
Забудьте пока о рабочем процессе и делеях к коде. Пока не танем писать все включения, а только подумает о меню.
1. раз нужно всегда и сразу реагировать на кнопки, то нужно чтобы один проход loop() не занимал много времени, несколько миллисекунд - не больше.
2. если нужно поменять изображение - то экран надо перерисовать, иначе не нужно его трогать, чтобы не мигал.
------
итак - вы заводите массив из структур такого вида:
- значение параметра (все эти ваши числа) только обращаться к ним будете теперь как-то типа paramList[nfmt].value;
-изображение названия на экране;
-----
заводите переменную с количеством параметров, номером текущего редактируемого и статусом программы (работа или редактирование).
войдя в loop(), считывете кнопку.
При необходимости (изменение номера, значения или статуса) - перерисовываете экран;
Обрабатываете кнопку - (пусть из 5: вверх, вниз, лево, право и режим)
пусть лево и право - листают номер редактируемого параметра, верх низ - меняют его значение, а режим меняет статус с работы на редактирование и обратно.
----------------------
вот и все - это очень просто. Есть мелкие подводные камни, я намекну на один из них - обработав нажатие нужно о нем забыть, иначе при следующем входе в loop() Вы снова его обработаете. Сами придумайте как этот камень обойти... хотел написать решение, но подумал, что это не педагогично.
-----
дальше приклейте режим работы:
если работа - то запускаем Ваш процесс, пусть даже, на первом этапе, с делеями. Опять же не забудьте про флаг, иначе по окончании цикла работы, войдя в loop() вы снова запустите цикл. Можно, например, после окончания последовательности роаботы снова установить режим "редактирование".
Всем Спасибо проверю, прислушаюсь к советам. Как Проверь и разберусь вылажу результаты.
Я б сначала порекомендовал разобратся с темой блинк без делея. Переписать код в таком подходе, это и будет фактически п.1 у wdrakula.
И про перерисовку экрана дополню, можно конечно очищать его весь и отрисовывать при редактировании заново, но порывшись в либе найдете как установить курсор в заданую координату екрана и сможете перерисовывать те несколько символов, которые собственно редактируются. Так быстрей работает и как правило (не всегда, однако) удобней.
Напесал меню для коректировки даных в начале программы.
Принцып работ меню меня устраивает но как только вставляю эту часть кода в програму то тот цыкл смешивается в кучу. Подкажить как разделить цыкл работы так называемого меню и цыкл программы.
вот что получисось.
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int a = 5; // время загрузки в секундах int b = 2; // время задержки в секундах int c = 10; // время предварительный вакуум в секундах int d = 20; // время пропарки в секундах int e = 5; // время вакуумное охлаждение в секундах int f = 5; // время остывание в секундах int t = 0; void setup() { lcd.begin(16, 2); } byte key() { //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 110) return 3; else if (val < 300) return 4; else if (val < 450) return 2; else if (val < 650) return 1; else if (val <= 1023) return 0; } void loop() { lcd.clear(); if (key() == 1) { t = t + 1; } switch (t) { case 1: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#1 * ZAGRUZKA *"); lcd.setCursor(0, 1); if (key() == 3) { a = a + 1; } if (key() == 4) { a = a - 1; } lcd.print("Znah v c. < "); lcd.print(a); lcd.print(" >"); delay(100); break; case 2: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#2 *ZADERGHKA*"); lcd.setCursor(0, 1); if (key() == 3) { b = b + 1; } if (key() == 4) { b = b - 1; } lcd.print("Znah v c. < "); lcd.print(b); lcd.print(" >"); delay(100); break; case 3: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#3 Pred Vakuum"); lcd.setCursor(0, 1); if (key() == 3) { c = c + 1; } if (key() == 4) { c = c - 1; } lcd.print("Znah v c. < "); lcd.print(c); lcd.print(" >"); delay(100); break; case 4: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#4 * PAR *"); lcd.setCursor(0, 1); if (key() == 3) { d = d + 1; } if (key() == 4) { d = d - 1; } lcd.print("Znah v c. < "); lcd.print(d); lcd.print(" >"); delay(100); break; case 5: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#5 Vakuum OXL."); lcd.setCursor(0, 1); if (key() == 3) { e = e + 1; } if (key() == 4) { e = e - 1; } lcd.print("Znah v c. < "); lcd.print(e); lcd.print(" >"); delay(100); break; case 6: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#6 STABILIZACIY"); lcd.setCursor(0, 1); if (key() == 3) { f = f + 1; } if (key() == 4) { f = f - 1; } lcd.print("Znah v c. < "); lcd.print(f); lcd.print(" >"); delay(100); break; } if (t >= 7) { t = 0; } delay(100); }Всем спасибо. Все получилось. Все Работает ОТЛИЧНО. Лично я доволен если кому поможет разобраться с работой Ардуины пользуйтесь на здоровье. можно конечьно уброть delay но и так все работает хорошо.
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int a = 10; // время загрузки в секундах int b = 5; // время задержки в секундах int c = 10; // время предварительный вакуум в секундах int d = 10; // время пропарки в секундах int e = 20; // время вакуумное охлаждение в секундах int f = 30; // время остывание в секундах int t = 0; int k = 1; void setup() { lcd.begin(16, 2); pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(3, OUTPUT); pinMode(2, OUTPUT); } byte key() { //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 110) return 3; else if (val < 300) return 4; else if (val < 450) return 2; else if (val < 650) return 1; else if (val <= 1023) return 0; } void loop() { lcd.clear(); lcd.setCursor(0, 0); // Шапка меню lcd.print("MENU -> SELECT"); lcd.setCursor(0, 1); lcd.print("START -> START"); while (k == 1) { if (key() == 5) { // ловушка для цыкла k = k + 1; } if (key() == 1) { t = t + 1; } switch (t) { case 1: lcd.clear(); // время загрузки меню lcd.setCursor(0, 0); lcd.print("P#1 * ZAGRUZKA *"); lcd.setCursor(0, 1); if (key() == 3) { a = a + 1; // додавить 1 секунду } if (key() == 4) { a = a - 1; // убрать 1 секунду } lcd.print("Znah v c. <"); lcd.print(a); lcd.print(">"); delay(100); break; case 2: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#2 *ZADERGHKA*"); lcd.setCursor(0, 1); if (key() == 3) { b = b + 1; } if (key() == 4) { b = b - 1; } lcd.print("Znah v c. <"); lcd.print(b); lcd.print(">"); delay(100); break; case 3: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#3 Pred Vakuum"); lcd.setCursor(0, 1); if (key() == 3) { c = c + 1; } if (key() == 4) { c = c - 1; } lcd.print("Znah v c. <"); lcd.print(c); lcd.print(">"); delay(100); break; case 4: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#4 * PAR *"); lcd.setCursor(0, 1); if (key() == 3) { d = d + 1; } if (key() == 4) { d = d - 1; } lcd.print("Znah v c. <"); lcd.print(d); lcd.print(">"); delay(100); break; case 5: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#5 Vakuum OXL."); lcd.setCursor(0, 1); if (key() == 3) { e = e + 1; } if (key() == 4) { e = e - 1; } lcd.print("Znah v c. <"); lcd.print(e); lcd.print(">"); delay(100); break; case 6: lcd.clear(); lcd.setCursor(0, 0); lcd.print("P#6 STABILIZACIY"); lcd.setCursor(0, 1); if (key() == 3) { f = f + 1; } if (key() == 4) { f = f - 1; } lcd.print("Znah v c. <"); lcd.print(f); lcd.print(">"); delay(100); break; } if (t >= 7) { t = 0; } delay(100); } analogWrite(10, 200); lcd.clear(); lcd.print("* START *"); delay(3000); lcd.clear(); lcd.print("* ZAGRUZKA *"); digitalWrite(13, HIGH); // включен канал №13 for (int ab = 0; ab <= a; ab = ab + 1) { lcd.setCursor(0, 1); lcd.print(a); lcd.print(" <"); lcd.print(ab); lcd.print(">"); delay(1000); } digitalWrite(13, LOW); // выключен канал №13 delay(5000); lcd.clear(); lcd.print("* PRED VAKUUM *"); digitalWrite(12, HIGH); // включен канал №12 for (int ab = 0; ab <= b; ab = ab + 1) { lcd.setCursor(0, 1); lcd.print(b); lcd.print(" <"); lcd.print(ab); lcd.print(">"); delay(1000); } lcd.clear(); lcd.print("* VAKUUM + PAR *"); digitalWrite(11, HIGH); // включен канал №11 for (int ab = 0; ab <= (c - b); ab = ab + 1) { lcd.setCursor(0, 1); lcd.print((c - b)); lcd.print(" <"); lcd.print(ab); lcd.print(">"); delay(1000); } digitalWrite(12, LOW); // выключен канал №12 lcd.clear(); lcd.print("* PAR *"); for (int ab = 0; ab <= (d - b - c); ab = ab + 1) { lcd.setCursor(0, 1); lcd.print((d - b - c)); lcd.print(" <"); lcd.print(ab); lcd.print(">"); delay(1000); } digitalWrite(11, LOW); // выключен канал №11 //нужно условие выключения не по времени а от данных манометра lcd.clear(); lcd.print("*VAK.OXLAGDENIE*"); digitalWrite(3, HIGH); // включен канал №3 for (int ab = 0; ab <= e; ab = ab + 1) { lcd.setCursor(0, 1); lcd.print(e); lcd.print(" <"); lcd.print(ab); lcd.print(">"); delay(1000); } digitalWrite(3, LOW); // выключен канал №3 lcd.clear(); lcd.print("* STABILIZACIY *"); digitalWrite(2, HIGH); // включен канал №2 for (int ab = 0; ab <= f; ab = ab + 1) { lcd.setCursor(0, 1); lcd.print(f); lcd.print(" <"); lcd.print(ab); lcd.print(">"); delay(1000); } digitalWrite(2, LOW); // выключен канал №2 lcd.clear(); lcd.print("* BLOK GOTOV *"); // команда стоп перезапуск программы кнопка for (int x = 0; x <= 20; x = x + 1) { analogWrite(10, 10); delay(250); analogWrite(10, 100); delay(500); } analogWrite(10, 200); delay(10000); k = k - 1; t = 0; }