Nihhilistum
@Nihhilistum

Как управлять питанием и выводом информации на экран lcd 1602 через I2C?

Для одного из проектов на 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"); экран более-менее работает, но, если попытаться что-нибудь вывести через него, перестаёт включаться.
Прошу вашего совета относительно аппаратной и программной частей
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
@lonelymyp
Живу
У некоторых экранов есть команда программного отключения подсветки, посмотри в документации.
Стираем экран, отключаем подсветку, выглядит как будто он выключен и не надо потом заново инициализировать после включения.
И подключать питание экрана на выход ардуины напрямую плохая идея.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Psychosynthesis
@Psychosynthesis
Fullstack developer and radio engineer
А зачем у тебя тут buttonValue и исключение дребезга, если оно нигде не используется?

Алсо, если я ничего не перепутал, для этих дисплеев надо при каждом отключении питания отправлять lcd.init();

И да, ещё момент - некоторые экземпляры таких дисплеев жрут почти 90 мА при включении подсветки, поэтому лучше вешать питание через полевик.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
21 авг. 2019, в 00:43
500 руб./за проект
21 авг. 2019, в 00:14
1000 руб./за проект