Как заставить ардуино читать клавиатуру 1X4 несколько раз?

keypad

Я хочу использовать мембранную клавиатуру 1X4 для ввода 3 рабочих параметров светодиодной ленты, управляемой Arduino mini. Клавиатура прикреплена к контактам D2-D5, а светодиод-к контакту 12. Моя цель - установить следующие параметры: частота (4 значения), рабочий цикл (4 значения), время выполнения 4 (значения). Мне нужно, чтобы Arduino прочитал клавиатуру 3 раза, чтобы я мог ввести 3 параметра. "Время выполнения" В приведенном ниже скетче не задано. Я хочу использовать “while”, чтобы заставить Arduino прочитать ключи, но arduino читает их один раз. В коде работает только первое “while”, и я могу установить период цикла. Второе “пока” не работает, потому что клавиша уже нажата, и Arduino не читает клавиатуру во второй раз. Есть ли какие-либо способы использовать более 1 "while" в коде или использовать один while для чтения клавиатуры 3 раза?

Спасибо.

   #define Key1 3 // key 1 attached to pin 3
    #define Key2 2 // key 2 attached to pin 2
    #define Key3 5 // key 3 attached to pin 5
    #define Key4 4 // key 4 attached to pin 4
    float period; // cycle time
    float power; // duty cycle
    float ontime; // ontime  time LED is on
    float rest;  // rest time LED is off
    const int ledPin =  12;      // the number of the LED pin
    
    void setup()
    {
      pinMode(Key1, INPUT_PULLUP);
      pinMode(Key2, INPUT_PULLUP);
      pinMode(Key3, INPUT_PULLUP);
      pinMode(Key4, INPUT_PULLUP);
      pinMode(ledPin, OUTPUT);
    }
    void loop() {
      digitalWrite(ledPin, LOW);
      while (digitalRead(Key1) == HIGH && digitalRead(Key2) == HIGH && digitalRead(Key3) == HIGH && digitalRead(Key4) == HIGH) {};
    
      int key1a = digitalRead(Key1);
      int key2a = digitalRead(Key2);
      int key3a = digitalRead(Key3);
      int key4a = digitalRead(Key4);
    
      if (!key1a) {
        period = 1000;
      }
      if (!key2a) {
        period = 2000;
      }
      if (!key3a) {
        period = 3000;
      }
      if (!key4a) {
        period = 4000;
      }
    
      while (digitalRead(Key1) == HIGH && digitalRead(Key2) == HIGH && digitalRead(Key3) == HIGH && digitalRead(Key4) == HIGH) {};
    
      int key1b = digitalRead(Key1);
      int key2b = digitalRead(Key2);
      int key3b = digitalRead(Key3);
      int key4b = digitalRead(Key4  );
    
      if (!key1b) {
        power = 10;
      }
      if (!key2b) {
        power = 20;
      }
      if (!key3b) {
        power = 50;
      }
      if (!key4b) {
        power = 80;
      }
    
      ontime = period * power / 100;
      rest = period - ontime;
    
      digitalWrite(ledPin, HIGH);
      delay(ontime);
      digitalWrite(ledPin, LOW);
      delay(rest);
    }

, 👍-1

Обсуждение

- Я хочу использовать “пока”... почему? ... что делать, если нет смысла использовать "while"?, @jsotola

В чем смысл?, @alex 001

было бы более разумно обнаружить нажатие кнопки в начале loop() и установить переменную в 0, 1, 2, 3 или 4 ... 0 = кнопки нет ... используйте переменную состояния, чтобы отслеживать, какой параметр вы изменяете, @jsotola


1 ответ


0

Сделайте что-нибудь, чтобы подождать, пока ключ не будет отпущен, прежде чем перейти к следующему разделу. Было бы разумно структурировать вашу программу так, чтобы она имела только одну функцию, обрабатывающую нажатия клавиш, а затем вызывала ее для каждой клавиши. (Передайте идентификацию ключа, PIN, в функцию.)

,