Импровизированное меню выбора режима

NikitaHack
Offline
Зарегистрирован: 16.12.2021

Добрый день. Прошу помощи, стоит задача после приветствия выдать импровизированное меню выбора режима(всего 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);
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

вы бы по нормальному сформулировали что хотите получить от программы.

 

 

 

 

 

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, поставьте там вторую if или else...

NikitaHack
Offline
Зарегистрирован: 16.12.2021

Там это где?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:
Ну, поставьте там вторую if или else...
или void, на худой конец!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

1. http://arduino.ru/Reference/If

2. (Операторные скобки) http://arduino.ru/Reference/Braces

sadman41
Offline
Зарегистрирован: 19.10.2016

NikitaHack пишет:

Там это где?


Там, где фигурную скобку закрываете.

NikitaHack
Offline
Зарегистрирован: 16.12.2021

Извините за глупую просьбу, но не могли бы Вы поподробнее объяснить как исправить. Это мой первый более-менее сложный проект, поэтому не совсем понимаю как надо сделать

nik182
Offline
Зарегистрирован: 04.05.2015

Сначала надо простым русским языком расписать все шаги, даже самые элементарные, типа прочитать пин, используя слова если то пока и прочие для полного описания алгоритма программы. Затем используя это описание попробовать запустить программу в голове и пройти по всем веткам в зависимости от виртуальных нажатий и помнить про задержки. Когда в результате такого моделирования получиться то что задумывалось изначально, можно слова перевести в операторы си.
Сейчас то что написано не очень соответствует объяснениям алгоритма работы. Например, где ожидание нажатия кнопки после предложения выбора? Зачем перерисовывать раз в милисекунду дисплей, если на нём ничего не меняется?

sadman41
Offline
Зарегистрирован: 19.10.2016

NikitaHack пишет:

Извините за глупую просьбу, но не могли бы Вы поподробнее объяснить как исправить. Это мой первый более-менее сложный проект, поэтому не совсем понимаю как надо сделать

После того, как вы объясните, где реализован выбор режимов, которые "налезают друг на друга". Я его не наблюдаю в приведенном коде.

NikitaHack
Offline
Зарегистрирован: 16.12.2021

Вот я и не понимаю как сделать ожидание нажатия кнопки. В этом вся проблема

 

NikitaHack
Offline
Зарегистрирован: 16.12.2021

31-34 строка выводит на экран "меню" , а дальше в Mode описывается что если нажато 2, то очисти экран и через секунду перейди к LCD.

sadman41
Offline
Зарегистрирован: 19.10.2016

NikitaHack пишет:

31-34 строка выводит на экран "меню" , а дальше в Mode описывается что если нажато 2, то очисти экран и через секунду перейди к LCD.

Например - http://arduino.ru/Reference/While

Ставьте себя на место контроллера. Вот скажу я вам: жди от меня письма. Какие Ваши пошаговые действия?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

NikitaHack пишет:

Вот я и не понимаю как сделать ожидание нажатия кнопки. В этом вся проблема

 

А Вы пытались?

В большинстве случаев контроллер должен делать в точности то же самое, что сделал бы человек на его месте. Что бы Вы стали делать, если бы перед Вами стояла задача ожидания нажатия кнопки?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

NikitaHack пишет:
Вот я и не понимаю как сделать ожидание нажатия кнопки. В этом вся проблема

Написание меню так или иначе сводится к написанию автоматов. Но жевать тему написания автоматов долго и у каждого он свой. Так что забей на меню.

AsNik
Offline
Зарегистрирован: 24.10.2020

функция ПокажиМеню() {

  Вывести на экран все необходимые надписи

  переменной выбора меню приравнять например 0 (СелектМеню = 0)

  пока (!СелектМеню) {

  Если нажали нужную кнопку СелектМеню = 1 или 2 или 3....

  }

}

В зависимости от выбранного СелектМеню дальше строить алгоритм....

NikitaHack
Offline
Зарегистрирован: 16.12.2021

andriano пишет:

NikitaHack пишет:

Вот я и не понимаю как сделать ожидание нажатия кнопки. В этом вся проблема

 

А Вы пытались?

В большинстве случаев контроллер должен делать в точности то же самое, что сделал бы человек на его месте. Что бы Вы стали делать, если бы перед Вами стояла задача ожидания нажатия кнопки?

Я же написал сверху что я новичок. если бы я знал как это сделать, я бы тут не спрашивал.

NikitaHack
Offline
Зарегистрирован: 16.12.2021

sadman41 пишет:

NikitaHack пишет:

31-34 строка выводит на экран "меню" , а дальше в Mode описывается что если нажато 2, то очисти экран и через секунду перейди к LCD.

Например - http://arduino.ru/Reference/While

Ставьте себя на место контроллера. Вот скажу я вам: жди от меня письма. Какие Ваши пошаговые действия?

Спасибо всем большое за помощь. Получилось сделать через While. Всем удачи в ваших проектах.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

NikitaHack пишет:

Цитата:

Что бы Вы стали делать, если бы перед Вами стояла задача ожидания нажатия кнопки?

Я же написал сверху что я новичок. если бы я знал как это сделать, я бы тут не спрашивал.

Т.е. Вы не в состоянии представить себя на месте контроллера, и придумать, что нужно сделать для ожидания нажатия?

Тогда у меня для Вас плохая новость: программирование не для Вас. От слова "совсем". Попытайтесь реализовать себя на каком-нибудь другом поприще.

NikitaHack
Offline
Зарегистрирован: 16.12.2021

andriano пишет:

NikitaHack пишет:

Цитата:

Что бы Вы стали делать, если бы перед Вами стояла задача ожидания нажатия кнопки?

Я же написал сверху что я новичок. если бы я знал как это сделать, я бы тут не спрашивал.

Т.е. Вы не в состоянии представить себя на месте контроллера, и придумать, что нужно сделать для ожидания нажатия?

Тогда у меня для Вас плохая новость: программирование не для Вас. От слова "совсем". Попытайтесь реализовать себя на каком-нибудь другом поприще.

Спасибо за Ваш совет, но я не помню что бы я спрашивал у Вас чем мне заняться по жизни