Пошаговое отображение данных на 1604

Тема в разделе "Arduino & Shields", создана пользователем Sov, 18 янв 2020.

  1. Sov

    Sov Нерд

    Всем привет!

    У меня получилось:
    1. Вывести на дисплей какой-либо текст.
    2. Подключить к Ардуине клавиатуру 3х4 и при нажатии на ее клавишу выводить на дисплей нажатое.

    Теперь я пытаюсь после пятисекундного отображения на дисплее текста "Hello World" (не, ну а что еще?) гасить дисплей на неопределенное время и по нажатию клавиатуры выводить нажатое на дисплей. При этом я спотыкаюсь уже на первом этапе данной задачи. Т.е. код

    Код (C++):
    void loop()
    {
    lcd.setCursor(0, 1);
    lcd.print("Hello World!");
    delay(5000);
    lcd.clear();
    }
    выводит текст на дисплей, через 5 секунд гасит его и.... снова включает.
    Как сделать так, чтобы после первого погашения дисплея Ардуина ждала события (нажатие кнопки на клавиатуре), а не включала дисплей заново?
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Создать флаг для отображения.
    Если флаг поднят — отобразить, подождать 5 секунд, затем опустить флаг.
    Кнопка нажата? Поднимаем флаг. Не нажата — ничего не делаем.
     
  3. Sov

    Sov Нерд

    Нееее. Я немножко не о том. Я сейчас хочу дисплей очистить надолго, а уже потом при нажатии на клавиатуру что-то на него выводить.
     
  4. NikitOS

    NikitOS Король шутов Администратор

    Ну тогда «Hello World!» отображайте только один раз, т.е. в setup, а потом уже в основном коде делайте что хотите
     
    Sov нравится это.
  5. Daniil

    Daniil Гуру

    Или счетчик вывода Hello World ввести.
    Как только вывели, увеличиваем счетчик на 1.
    В следующий раз проверять счетчик. Если он больше 1, то не выводить.
     
  6. Sov

    Sov Нерд

    Всем спасибо!

    У меня уже новая проблема: case не срабатывает. Делаю так:
    Код (C++):

    char key = keypad.getKey();

    switch (key) {
        case 1: task_1();
          break;
        case 2: task_2();
          break;
        case 3: task_3();
          break;
      }
    }

    void task_1() {
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(111);
    }
    void task_2() {
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(222);
    }
    void task_3() {
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(333);
    }
     
    Пытался заменить на if, (т.е. если кей=1, то делает то, если кей=2, то делаем другое и т.д.), так программа всегда выполняет команду, как будто я нажал кей =4. Т.е. при

    Код (C++):
    if (key)
    {
      if (key=1){
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(111);

    }
    if (key=2){
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(222);
    }

    if (key=3){
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(333);
    }

    if (key=4){
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(444);
    }
    при нажатии любой клавиши срабатывает key=4 и на дисплее, соответственно, возникет "444"
     
  7. a1000

    a1000 Гуру

    Значит у вас key всегда равно 4.
    Выложите весь код.
     
  8. Sov

    Sov Нерд

    Код (C++):
    #include <LiquidCrystal.h>
    #include <Keypad.h>
    const byte ROWS = 4; // 4 строки
    const byte COLS = 3; // 3 столбца
    char keys[ROWS][COLS] = {
      {'1','2','3'},
      {'4','5','6'},
      {'7','8','9'},
      {'*','0','#'}
    };
    byte rowPins[ROWS] = {10, 9, 8, 7};
    byte colPins[COLS] = {6, 1, 0};
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

    void setup()
    {

    lcd.begin(16, 4);

    lcd.setCursor(0, 1);
    lcd.print("Hello World!");
    delay(3000);
    lcd.clear();
    }

    void loop()
    {
    char key = keypad.getKey();

    switch (key) {
        case 1: task_1();
          break;
        case 2: task_2();
          break;
        case 3: task_3();
          break;
        case 4: task_4();
          break;
      }
    }

    void task_1() {
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(111);
    }
    void task_2() {
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(222);
    }
    void task_3() {
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(333);
    }
    void task_4() {
    lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print(444);
    }
     
    Последнее редактирование: 18 янв 2020
  9. a1000

    a1000 Гуру

    Ну а если взять типовой скетч
    Код (C++):
    #include <Keypad.h>

    const byte ROWS = 4; //четыре строки
    const byte COLS = 3; //три столбца
    char keys[ROWS][COLS] = {
      {'1','2','3'},
      {'4','5','6'},
      {'7','8','9'},
      {'#','0','*'}
    };
    byte rowPins[ROWS] = {5, 4, 3, 2}; //подключить к выводам строк клавиатуры
    byte colPins[COLS] = {8, 7, 6};    //подключить к выводам столбцов клавиатуры

    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

    void setup(){
      Serial.begin(9600);
    }

    void loop(){
      char key = keypad.getKey();

      if (key != NO_KEY){
        Serial.println(key);
      }
    }
    Что будет выводить в монитор порта? Только подключите клавиатуру правильно.

    Да, это
    Код (C++):
    byte colPins[COLS] = {6, 1, 0};
    не самая лучшая идея. Не занимайте аппаратный Serial без крайней необходимости.
     
  10. Sov

    Sov Нерд

    А я взял типовой скетч и переделал под себя. Клавиатура работет и цифры на дисплей выводит. А вот функцию по нажатию на клавишу не запускает. Точнее - запускает, но постоянно одну и ту же.

    SerialPort мне не нужен.
     
  11. a1000

    a1000 Гуру

    А если подправить так
    Код (C++):
    switch (key) {
        case '1': task_1();
          break;
        case '2': task_2();
          break;
        case '3': task_3();
          break;
        case '4': task_4();
          break;
      }
     
    Daniil и Sov нравится это.
  12. Sov

    Sov Нерд

    Сработало! Спасибо!
     
  13. a1000

    a1000 Гуру

    Как-то после ассемблера начинаю забывать о типизации переменных.:)
     
  14. Sov

    Sov Нерд

    Я учился на электронщика в свое время и преподы тогда сделали всё, чтобы я ненавидел программирование и оно казалось мне запредельно сложным и непонятным. Кажется, у них получилось(((
     
  15. parovoZZ

    parovoZZ Гуру

    На зеркало проще всего пенять.
     
  16. Sov

    Sov Нерд

    Отнюдь. Если человеку 1000 раз сказать, что он свинья - то он захрюкает.
    Если студенту 1000 раз сказать, что программирование - это непостижимо сложно и оставить один на один с совершенно неперевариваемыми методичками без примеров и не отвечать предметно на вопросы студентов, то получится то, что получилось.
     
    issaom нравится это.
  17. parovoZZ

    parovoZZ Гуру

    Я так и не захрюкал.

    Оно либо дано, либо нет. Если нет, то нечего и голову напрягать.
     
  18. alp69

    alp69 Форумчанин

    Хорош троллить. Чел хочет учиться. Чего в этом плохого?
     
    DetSimen, NikitOS и issaom нравится это.
  19. DetSimen

    DetSimen Guest

    Чел, найди в сети Библию от Кернигана и Ритчи и прочти первоисточник.
     
    Daniil нравится это.
  20. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Постоянно подмывает сказать именно так "пытающиМся научиться электронике".