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

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

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

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

Похожие вопросы