Для одного из проектов на Arduino купил lcd 1602 (16 x 2) с I2C. Для моего устройства необходимо, чтобы экран включался и выдавал текст при нажатии на кнопку. Кнопку подключил к земле и 2 пину, а экранчик к земле, 4 и 5 пинам (для I2C) и немного подумав, решил запитать lcd от 9 пина (ибо только через него получил возможность включать и выключать lcd без отключения Arduino) и написал такой код, предусмотрев программную защиту от дребезга:
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
#define button 2 //пин кнопки
#define screenPower 9 //пин экрана
boolean buttonBounce = 0;
boolean buttonDebounce;
boolean buttonValue;
boolean powerFlag = 0; //флаг переключения питания экрана
LiquidCrystal_PCF8574 lcd(0x27);
void setup(){
pinMode(screenPower, OUTPUT);
pinMode(button, INPUT_PULLUP);
}
boolean debounce(boolean buttonBounce){ //устранение дребезга кнопки
uint32_t buttonTimer = millis();
boolean buttonDebounce = digitalRead(button); //первичное счтывание значения
if (buttonBounce != buttonDebounce){ //если дребезг был зафиксирован
if (millis() - buttonTimer > 5){ //жди 50 миллисек
buttonDebounce = digitalRead(button); //значение без дребезга
}
}
return buttonDebounce; //возврат значения без дребезга
}
void screen_function(){ //вкл-выкл дисплея
if (digitalRead(button) == LOW){ //сигнал инвертирован из-за подтяжки
powerFlag = !powerFlag; //инвертирование флага
digitalWrite(screenPower, powerFlag); //флаг вкл-выкл питание экрана
}
}
void loop(){
buttonValue = debounce(buttonBounce); //присвоение "исправленного" значения кнопки
screen_function(); //вызов функции экрана
lcd.setCursor (0, 1);
lcd.print ("Hello");
}
Без команд
lcd.setCursor (0, 1); и
lcd.print ("Hello"); экран более-менее работает, но, если попытаться что-нибудь вывести через него, перестаёт включаться.
Прошу вашего совета относительно аппаратной и программной частей