Импровизированное меню выбора режима
- Войдите на сайт для отправки комментариев
Чт, 16/12/2021 - 18:38
Добрый день. Прошу помощи, стоит задача после приветствия выдать импровизированное меню выбора режима(всего 2 варианта). Я в ардуино новичок, сразу скажу. В общем, я задаю экран выбора меню через if, но если сразу после if ввести lcd.clean(); и после него закрыть фигурную скобку, то при включении происходит загрузка и после нее сразу же 2 экрана налазит друг на друга( то есть одновременно показывает и экран выбора меню и экран ан котором выводит длину. Если после lcd.clean(); не закрывать фигурную скобку, а закрыть ее в самом конце, то меню выбора режима ждет нажатия на клавишу 2 и тогда переходит в режим счёта. Но тогда не идет счёт. Что делать?
#include <Keypad.h> #include <LCD_1602_RUS.h> LCD_1602_RUS lcd(0x27, 20, 4);// адрес и размер екрана #define sensor A1 // с пина оптопары на пин 2 ардуино(!!!! вместо А2 выбрать нужный) #define denominacija 1 // расстояние между отверстиями в см. unsigned short int dlina = 0; // общая длинна const byte ROWS = 4;//кол-во строк клавиатура const byte COLS = 4;//кол-во столбцов клавиатуры char hexaKeys [COLS][ROWS] = { //название клавиш {'1','4','7','*'}, {'2','5','8','0'}, {'3','6','9','#'}, {'A','B','C','D'} }; byte rowPins[ROWS] = {5,4,3,2}; //описываем контакты строк byte colPins[COLS] = {9,8,7,6}; //описываем контакты столбцов Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //передаем данные библиотеке bool prev_sensor_state = LOW; // предыдущее состояние датчика unsigned long time; void setup() { pinMode(sensor, INPUT); //режим ввода информации time = millis(); // запускаем отсчет времени lcd.init(); // инициализация екрана lcd.backlight(); //включаем подсветку lcd.setCursor(2, 0); // поставить курсор на 0 строку, 3 оступить lcd.print("Вас приветствует"); // вывести на екран lcd.setCursor(2, 2); // поставить курсор на 2 строку, 3 оступить lcd.print("ТОВ Юпитер Груп"); // вывести на екран delay(2000); // задержка 7секунд lcd.clear(); // очистить екран lcd.setCursor(8, 0); // поставить курсор на 0 строку, 8 оступить lcd.print("Режим"); // вывести на екран lcd.setCursor(2, 2); // поставить курсор на 2 строку, 2 оступить lcd.print("1-Авто 2-Ручной"); // вывести на екран } void loop() { Sensor(); Mode(); LCD(); } void Mode() { char customKey = customKeypad.getKey(); if (customKey == '2') { lcd.clear(); delay(1000); LCD(); } } void Sensor() { if (digitalRead(sensor) == HIGH && prev_sensor_state == LOW) { // если сенсор сработал и до этого был выключен prev_sensor_state = HIGH; // запомнить статус (датчик включен) } if (digitalRead(sensor) == LOW && prev_sensor_state == HIGH) { dlina = dlina + denominacija; // засчитать импульс prev_sensor_state = LOW; // обнуляю статус сенсора } } void LCD() { unsigned short int metru; // тип переменных диапазоном 0 / 65 535 unsigned short int sm; metru = dlina / 100; // пересчитываю всю длинну в метры sm = dlina % 100; // и сантиметры byte kursor_M = 0; // переменная координат M курсора byte kursor_cm = 0; // переменная координат CM курсора if (metru < 10) kursor_M = 9; if (metru >= 10 && metru <= 99) // выбор координат для надписи метров kursor_M = 8; if (metru > 99) kursor_M = 7; if (sm >= 0 && sm <= 9) { // выбор координат для надписи сантиметров kursor_cm = 13; lcd.setCursor(12, 0); lcd.print("0 "); } else { kursor_cm = 12; } lcd.setCursor(0, 0); lcd.print(L"длинна"); lcd.setCursor(kursor_M, 0); lcd.print(metru); lcd.setCursor(10, 0); lcd.print(L"м"); lcd.setCursor(kursor_cm, 0); lcd.print(sm); lcd.setCursor(14, 0); lcd.print(L"см"); // Serial.println(sm); }
вы бы по нормальному сформулировали что хотите получить от программы.
Ну, поставьте там вторую if или else...
Там это где?
1. http://arduino.ru/Reference/If
2. (Операторные скобки) http://arduino.ru/Reference/Braces
Там это где?
Там, где фигурную скобку закрываете.
Извините за глупую просьбу, но не могли бы Вы поподробнее объяснить как исправить. Это мой первый более-менее сложный проект, поэтому не совсем понимаю как надо сделать
Сначала надо простым русским языком расписать все шаги, даже самые элементарные, типа прочитать пин, используя слова если то пока и прочие для полного описания алгоритма программы. Затем используя это описание попробовать запустить программу в голове и пройти по всем веткам в зависимости от виртуальных нажатий и помнить про задержки. Когда в результате такого моделирования получиться то что задумывалось изначально, можно слова перевести в операторы си.
Сейчас то что написано не очень соответствует объяснениям алгоритма работы. Например, где ожидание нажатия кнопки после предложения выбора? Зачем перерисовывать раз в милисекунду дисплей, если на нём ничего не меняется?
Извините за глупую просьбу, но не могли бы Вы поподробнее объяснить как исправить. Это мой первый более-менее сложный проект, поэтому не совсем понимаю как надо сделать
После того, как вы объясните, где реализован выбор режимов, которые "налезают друг на друга". Я его не наблюдаю в приведенном коде.
Вот я и не понимаю как сделать ожидание нажатия кнопки. В этом вся проблема
31-34 строка выводит на экран "меню" , а дальше в Mode описывается что если нажато 2, то очисти экран и через секунду перейди к LCD.
31-34 строка выводит на экран "меню" , а дальше в Mode описывается что если нажато 2, то очисти экран и через секунду перейди к LCD.
Например - http://arduino.ru/Reference/While
Ставьте себя на место контроллера. Вот скажу я вам: жди от меня письма. Какие Ваши пошаговые действия?
Вот я и не понимаю как сделать ожидание нажатия кнопки. В этом вся проблема
А Вы пытались?
В большинстве случаев контроллер должен делать в точности то же самое, что сделал бы человек на его месте. Что бы Вы стали делать, если бы перед Вами стояла задача ожидания нажатия кнопки?
Написание меню так или иначе сводится к написанию автоматов. Но жевать тему написания автоматов долго и у каждого он свой. Так что забей на меню.
функция ПокажиМеню() {
Вывести на экран все необходимые надписи
переменной выбора меню приравнять например 0 (СелектМеню = 0)
пока (!СелектМеню) {
Если нажали нужную кнопку СелектМеню = 1 или 2 или 3....
}
}
В зависимости от выбранного СелектМеню дальше строить алгоритм....
Вот я и не понимаю как сделать ожидание нажатия кнопки. В этом вся проблема
А Вы пытались?
В большинстве случаев контроллер должен делать в точности то же самое, что сделал бы человек на его месте. Что бы Вы стали делать, если бы перед Вами стояла задача ожидания нажатия кнопки?
31-34 строка выводит на экран "меню" , а дальше в Mode описывается что если нажато 2, то очисти экран и через секунду перейди к LCD.
Например - http://arduino.ru/Reference/While
Ставьте себя на место контроллера. Вот скажу я вам: жди от меня письма. Какие Ваши пошаговые действия?
Что бы Вы стали делать, если бы перед Вами стояла задача ожидания нажатия кнопки?
Тогда у меня для Вас плохая новость: программирование не для Вас. От слова "совсем". Попытайтесь реализовать себя на каком-нибудь другом поприще.
Что бы Вы стали делать, если бы перед Вами стояла задача ожидания нажатия кнопки?
Тогда у меня для Вас плохая новость: программирование не для Вас. От слова "совсем". Попытайтесь реализовать себя на каком-нибудь другом поприще.