Как управлять кнопками на ЖК-клавиатуре Arduino?
Я только что купил ЖК-дисплей 16x2 с кнопками. Я могу заставить дисплей работать и делать различные базовые наброски, включенные в среду разработки Arduino IDE. Однако я не могу понять, как управлять кнопками.
Кнопки работают с использованием аналогового контакта 0, и, насколько я понял из того, что я прочитал в Интернете, это как-то связано со значениями, которые вы получаете при нажатии кнопок . Я не могу понять, какие значения дает мой, я нашел скетч, который должен отображать кнопки, но я не могу заставить его работать, так как я действительно не понимаю, что он делает, я очень новичок к этому.
Я использую следующий код:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
int read_LCD_buttons() {
adc_key_in = analogRead(0);
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 600) return btnLEFT;
if (adc_key_in < 920) return btnSELECT;
return btnNONE;
}
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Push the buttons");
}
void loop() {
lcd.setCursor(9, 1);
lcd.print(millis()/1000);
lcd.setCursor(0, 1);
lcd_key = read_LCD_buttons();
switch (lcd_key) {
case btnRIGHT: {
lcd.print("RIGHT ");
break;
}
case btnLEFT: {
lcd.print("LEFT ");
break;
}
case btnUP: {
lcd.print("UP ");
break;
}
case btnDOWN: {
lcd.print("DOWN ");
break;
}
case btnSELECT: {
lcd.print("SELECT");
break;
}
case btnNONE: {
lcd.print("NONE ");
break;
}
}
}
Если кто-нибудь может подсказать, буду очень признателен.
Лиам
@Liam, 👍3
Обсуждение2 ответа
Лучший ответ:
Я нашел простой способ сделать это, я нашел учебник на инструкциях, в которых подробно объяснялось, что делать, я затем применил это к экрану клавиатуры с ЖК-дисплеем, а не к внешним кнопкам на макетной плате.
Все, что вам нужно сделать, чтобы увидеть, каковы результаты для ваших конкретных кнопок, это загрузить приведенный ниже скетч на вашу плату, затем открыть последовательный преобразователь на arduino ide, просто нажать кнопки, и вы должны увидеть результаты.
/*
Debounce
Каждый раз, когда входной контакт переходит из LOW в HIGH (например, из-за нажатия кнопки
нажмите), выходной контакт переключается с LOW на HIGH или HIGH на LOW. Есть
минимальная задержка между переключениями для устранения дребезга цепи (т. е. для игнорирования
шум).
создано 28 октября 2009 г.
Риан Корнелиус
*/
// константы не изменятся. Здесь привыкли
// устанавливаем номера выводов:
const int buttonPin = 0; // номер вывода кнопки
const int ledPin = 53; // номер вывода светодиода для тестирования
const int BUTTON1 = 1;
const int BUTTON2 = 2;
const int BUTTON3 = 3;
const int BUTTON4 = 4;
const int BUTTON5 = 5;
const int BUTTON1LOW = 970;
const int BUTTON1HIGH = 1024;
const int BUTTON2LOW = 850;
const int BUTTON2HIGH = 950;
const int BUTTON3LOW = 700;
const int BUTTON3HIGH = 800;
const int BUTTON4LOW = 400;
const int BUTTON4HIGH = 650;
const int BUTTON5LOW = 250;
const int BUTTON5HIGH = 350;
// Переменные изменятся:
int ledState = HIGH; // текущее состояние выходного вывода
int buttonState; // текущее чтение с входного вывода
int lastButtonState = LOW; // предыдущее чтение с входного вывода
// следующие переменные длинные, потому что время, измеряемое в миллисекундах,
// быстро станет большим числом, чем может быть сохранено в int.
long lastDebounceTime = 0; // последний раз, когда выходной пин был переключен
long debounceDelay = 50; // время устранения дребезга; увеличить, если выход мерцает
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// прочитать состояние переключателя в локальную переменную:
int reading = analogRead(buttonPin);
Serial.println(reading);
/*
Not needed while getting the values.
int tmpButtonState = LOW; // текущее чтение с входного вывода
if(reading>BUTTON5LOW && reading<BUTTON5HIGH){
//Чтение переключателя 5
tmpButtonState = BUTTON5;
}else if(reading>BUTTON4LOW && reading<BUTTON4HIGH){
//Чтение переключателя 4
tmpButtonState = BUTTON4;
}else if(reading>BUTTON3LOW && reading<BUTTON3HIGH){
//Чтение переключателя 3
tmpButtonState = BUTTON3;
}else if(reading>BUTTON2LOW && reading<BUTTON2HIGH){
//Чтение переключателя 2
tmpButtonState = BUTTON2;
}else if(reading>BUTTON1LOW && reading<BUTTON1HIGH){
//Чтение переключателя 1
tmpButtonState = BUTTON1;
}else{
//Кнопка не нажата;
tmpButtonState = LOW;
}
// проверяем, не нажали ли вы кнопку только что
// (т.е. ввод перешел из LOW в состояние кнопки), и вы ждали
// достаточно долго с момента последнего нажатия, чтобы игнорировать любой шум:
// Если переключатель изменился из-за шума или нажатия:
if (tmpButtonState != lastButtonState) {
// сброс таймера устранения дребезга
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// каким бы ни было чтение, оно было там дольше
// чем задержка устранения дребезга, так что примите ее за фактическое текущее состояние:
buttonState = tmpButtonState;
Serial.println(buttonState);
}
// сохранить чтение. В следующий раз через цикл,
// это будет lastButtonState:
lastButtonState = tmpButtonState;
// устанавливаем светодиод, используя состояние кнопки для тестирования:
switch(buttonState){
case BUTTON1:
digitalWrite(ledPin, buttonState>0);
break;
case BUTTON2:
digitalWrite(ledPin, buttonState>0);
break;
case BUTTON3:
digitalWrite(ledPin, buttonState>0);
break;
case BUTTON4:
digitalWrite(ledPin, buttonState>0);
break;
case BUTTON5:
digitalWrite(ledPin, buttonState>0);
break;
}
*/
}
Лиам
Загрузите это, и оно покажет сопротивление ваших кнопок на ЖК-экране
/* /* Кнопки обнаружения ЖК-дисплея Arduino 2x16 сопротивление */ #include <LiquidCrystal.h> //Пин ЖК-дисплея к Arduino const int pin_RS = 8; const int pin_EN = 9; const int pin_d4 = 4; const int pin_d5 = 5; const int pin_d6 = 6; const int pin_d7 = 7; const int pin_BL = 10; LCD LiquidCrystal( pin_RS, pin_EN, pin_d4, pin_d5, pin_d6, pin_d7); void setup() { lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("Нажмите любую клавишу"); lcd.setCursor(0,1); lcd.print("Сопротивление:"); } недействительный цикл () { интервал х; х = аналоговое чтение (0); lcd.setCursor(12,1); lcd.print(analogRead(0)); lcd.print(" "); задержка (500); }
Как сейчас написано, ваш ответ неясен. Пожалуйста, [изменить], чтобы добавить дополнительные сведения, которые помогут другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти [в справочном центре](/help/how-to-answer)., @VE7JRO
- Печать string and integer LCD
- Как отобразить символ º на ЖК-дисплее?
- Отправка значения с одного Arduino на другой
- Черные квадраты дисплея Arduino 16x2
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
Добавьте Serial.begin(9600) в setup и Serial.print(adc_key_in) после того, как вы прочитаете ключ, чтобы увидеть, какие значения вы получите. Если они не меняются, это аппаратная проблема (неисправный элемент или неправильная схема), иначе вы знаете, какие значения вы получаете для каждого ключа., @Michel Keijzers
Спасибо за помощь, мне даже в голову не пришло это сделать., @Liam
Нет проблем, для Arduino это обычный способ отладки (использование последовательного порта для операторов печати), для других AVR можно использовать отладку., @Michel Keijzers