Меню для вода параметров в программу при помощи 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);
чётко сформулируйте свою задачу и идите в раздел ищу исполнителя
здесь вас просто закидают....
Да ладно - "закидают". Человек нормально интересуется. Даже написал сам что-то. И код правильно вставил. Пусть и с третьего раза ;).
Посмотрите такое решение. Код я не проверял но должен работать
Для создания меню нужно посмотреть на прграмму под несколько другим углом:
Забудьте пока о рабочем процессе и делеях к коде. Пока не танем писать все включения, а только подумает о меню.
1. раз нужно всегда и сразу реагировать на кнопки, то нужно чтобы один проход loop() не занимал много времени, несколько миллисекунд - не больше.
2. если нужно поменять изображение - то экран надо перерисовать, иначе не нужно его трогать, чтобы не мигал.
------
итак - вы заводите массив из структур такого вида:
- значение параметра (все эти ваши числа) только обращаться к ним будете теперь как-то типа paramList[nfmt].value;
-изображение названия на экране;
-----
заводите переменную с количеством параметров, номером текущего редактируемого и статусом программы (работа или редактирование).
войдя в loop(), считывете кнопку.
При необходимости (изменение номера, значения или статуса) - перерисовываете экран;
Обрабатываете кнопку - (пусть из 5: вверх, вниз, лево, право и режим)
пусть лево и право - листают номер редактируемого параметра, верх низ - меняют его значение, а режим меняет статус с работы на редактирование и обратно.
----------------------
вот и все - это очень просто. Есть мелкие подводные камни, я намекну на один из них - обработав нажатие нужно о нем забыть, иначе при следующем входе в loop() Вы снова его обработаете. Сами придумайте как этот камень обойти... хотел написать решение, но подумал, что это не педагогично.
-----
дальше приклейте режим работы:
если работа - то запускаем Ваш процесс, пусть даже, на первом этапе, с делеями. Опять же не забудьте про флаг, иначе по окончании цикла работы, войдя в loop() вы снова запустите цикл. Можно, например, после окончания последовательности роаботы снова установить режим "редактирование".
Всем Спасибо проверю, прислушаюсь к советам. Как Проверь и разберусь вылажу результаты.
Я б сначала порекомендовал разобратся с темой блинк без делея. Переписать код в таком подходе, это и будет фактически п.1 у wdrakula.
И про перерисовку экрана дополню, можно конечно очищать его весь и отрисовывать при редактировании заново, но порывшись в либе найдете как установить курсор в заданую координату екрана и сможете перерисовывать те несколько символов, которые собственно редактируются. Так быстрей работает и как правило (не всегда, однако) удобней.
Напесал меню для коректировки даных в начале программы.
Принцып работ меню меня устраивает но как только вставляю эту часть кода в програму то тот цыкл смешивается в кучу. Подкажить как разделить цыкл работы так называемого меню и цыкл программы.
вот что получисось.
Всем спасибо. Все получилось. Все Работает ОТЛИЧНО. Лично я доволен если кому поможет разобраться с работой Ардуины пользуйтесь на здоровье. можно конечьно уброть delay но и так все работает хорошо.