Как заставить ардуино читать клавиатуру 1X4 несколько раз?
Я хочу использовать мембранную клавиатуру 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);
}
@alex 001, 👍-1
Обсуждение1 ответ
Сделайте что-нибудь, чтобы подождать, пока ключ не будет отпущен, прежде чем перейти к следующему разделу. Было бы разумно структурировать вашу программу так, чтобы она имела только одну функцию, обрабатывающую нажатия клавиш, а затем вызывала ее для каждой клавиши. (Передайте идентификацию ключа, PIN, в функцию.)
- Использование CD74HC4067 16-канальный аналоговый мультиплексор Демультиплексор работает не так, как ожидалось
- Контакт клавиатуры как прерывание (проводка или программирование)
- Нет функции сопоставления для вызова 'DS3231 (const uint8_t &, const uint8_t &)
- Моя программа использует слишком много памяти
- Почему на моем ЖК-дисплее 16x2 отображаются странные буквы и не удается вставить клавишу с клавиатуры?
- Не удается заставить клавиатуру использовать Keyboard.write на Arduino Uno
- LCD экран печатает одни и те же символы дважды
- Как выйти из цикла while с помощью клавиатуры?
- Я хочу использовать “пока”... почему? ... что делать, если нет смысла использовать "while"?, @jsotola
В чем смысл?, @alex 001
было бы более разумно обнаружить нажатие кнопки в начале
loop()
и установить переменную в 0, 1, 2, 3 или 4 ... 0 = кнопки нет ... используйте переменную состояния, чтобы отслеживать, какой параметр вы изменяете, @jsotola