ЖК-дисплей мигает после ввода кода: система напоминания о приеме лекарств с использованием Arduino Uno
RTC DS3231, Arduino Uno и 4 кнопки, потенциометр 10K, 4 резистора 10K и зуммер. Я решил следовать из онлайн-источника и столкнулся с несколькими проблемами, которые уже исправлены, но эта меня озадачивает. Был бы очень признателен за вашу помощь. Библиотека RTClib.h уже установлена. ЖК-дисплей мигает после вставки кода и показывает блоки вместо символов.
По этой ссылке есть и другая картинка.
https://drive.google.com/open?id=1OzHqZlS7mnkngMx-EIiqIgzdHZaTsHr8
#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>
#include <EEPROM.h>
RTC_DS3231 rtc;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // ЖК-контакты
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int buzz = 13;
int addr=17;
const int buttonPin2 = 9;
const int buttonPin3 = 8;
const int buttonPin1 = A0;
const int buttonPin4 = 7; // контакт, к которому прикреплена кнопка
int val2 = 0;
int val3=0;
int pushVal;
int bS1 = 0; // текущее состояние кнопки
int lBS1 = 0; // предыдущее состояние кнопки
int bS2 = 0; // текущее состояние кнопки
int lBS2 = 0;
int bS3 = 0; // текущее состояние кнопки
int lBS3 = 0;
int bS4 = 0; // текущее состояние кнопки
int lBS4 = 0;
// настроить пины на правильный режим
int buzz8amHH = 8; // HH - часы ##Установить время напоминания в 24-часовом формате
int buzz8amMM = 00; // ММ - Минута
int buzz8amSS = 00; // СС - Секунды
int buzz2pmHH = 8; // ЧЧ - часы
int buzz2pmMM = 1; // ММ - Минута
int buzz2pmSS = 00; // СС - Секунды
int buzz8pmHH = 8; // ЧЧ - часы
int buzz8pmMM = 2; // ММ - Минута
int buzz8pmSS = 00; // СС - Секунды
int nowHr, nowMin, nowSec;
void gwsMessege(){ // вывести сообщение "Выздоравливай скорее"
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Stay Healthy :)"); // Поздравляем
lcd.setCursor(0, 1);
lcd.print("Get Well Soon :)");// пожелание
}
void helpScreen() { // функция для отображения 1-го экрана на ЖК-дисплее
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Press Buttons");
lcd.setCursor(0, 1);
lcd.print("for Reminder...!");
}
void timeScreen() { // функция для отображения даты и времени на ЖК-экране
DateTime now = rtc.now(); // взять время rtc и вывести на дисплей
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time:");
lcd.setCursor(6, 0);
lcd.print(nowHr = now.hour(), DEC);
lcd.print(":");
lcd.print(nowMin = now.minute(), DEC);
lcd.print(":");
lcd.print(nowSec = now.second(), DEC);
lcd.setCursor(0, 1);
lcd.print("Date: ");
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
delay(500);
}
void setup()
{
Wire.begin();
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // раскомментируйте это, чтобы установить текущее время, а затем прокомментируйте при следующей загрузке, когда вы установите время
//rtc.adjust(DateTime(2019, 1, 10, 7, 59, 30)); // установка времени вручную
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Welcome To Our"); // вывести сообщение при запуске
lcd.setCursor(0, 1);
lcd.print("Medicine Reminder");
delay(1000);
gwsMessege();
delay(3000);
helpScreen();
delay(2000);
timeScreen();
delay(3000);
lcd.clear();
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
pinMode(buttonPin4, INPUT);
pinMode(buzz, OUTPUT);
Serial.begin(9600);
}
void ValSet(){
Serial.println(EEPROM.read(addr));
val2 = EEPROM.read(addr); // прочитать ранее сохраненное значение кнопки, чтобы начать с того места, где оно было оставлено ранее
switch (val2) {
case 1:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reminder set ");
lcd.setCursor(0, 1);
lcd.print("for Once/day !");
pushVal = 1;
delay(500);
break;
case 2:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reminder set ");
lcd.setCursor(0, 1);
lcd.print("for Twice/day !");
pushVal = 2;
delay(500);
break;
case 3:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reminder set ");
lcd.setCursor(0, 1);
lcd.print("for Thrice/day !");
pushVal = 3;
delay(500);
break;
}
}
// основной цикл будет постоянно проверять, была ли нажата кнопка
// если да, счетчик увеличивается, и тогда можно предпринять какие-то действия
void loop()
{ // вызов установки трижды в день
if (pushVal == 1) { // если нажата кнопка 1, то напомнить в 8 утра
at8am(); //функция для начала зззинга в 8 утра
}
else if (pushVal == 2) { // если нажата кнопка 2, напомнить в 8:00 и 20:00
at8am();
at8pm(); //функция для начала зззинга на 8мм
}
else if (pushVal == 3) { // если нажата кнопка 3, напомнить в 8:00 и 20:00
at8am();
at2pm(); //функция для начала зззинга на 8мм
at8pm();
}
// читаем состояние кнопки
bS1 = digitalRead(buttonPin1);
bS2 = digitalRead(buttonPin2);
bS3 = digitalRead(buttonPin3);
bS4 = digitalRead(buttonPin4);
// проверяем, отличается ли оно от последнего раза, когда мы проверяли
if (bS2 != lBS2) {
// либо кнопку только что нажали, либо только что отпустили
if (bS2 == HIGH) {
// она только что была нажата
Serial.println("n02");
EEPROM.write(17,1);
push1();
delay(1000);
}
}
lBS2 = bS2;
if (bS3 != lBS3) {
// либо кнопку только что нажали, либо только что отпустили
if (bS3 == HIGH) {
// она только что была нажата
Serial.println("no3");
EEPROM.write(17,2);
push2();
delay(1000);
}
}
lBS3 = bS3;
if (bS4 != lBS4) {
// либо кнопку только что нажали, либо только что отпустили
if (bS4 == HIGH) {
// она только что была нажата
Serial.println("no4");
EEPROM.write(17,3);
push3();
delay(1000);
}
}
lBS4 = bS4;
if (bS1 != lBS1) {
// либо кнопку только что нажали, либо только что отпустили
if (bS1 == HIGH) {
val3=EEPROM.read(addr);
EEPROM.write(17,0);
digitalWrite(buzz, LOW);
pinstop();
EEPROM.write(17,val3);
}
}
lBS1 = bS1;
timeScreen();
ValSet();
}
void push1() { // функция для установки напоминания один раз в день // сохранение состояния кнопки-1
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reminder set ");
lcd.setCursor(0, 1);
lcd.print("for Once/day !");
delay(1200);
lcd.clear();
}
void push2() { //функция для установки напоминания два раза в день
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reminder set ");
lcd.setCursor(0, 1);
lcd.print("for Twice/day !");
delay(1200);
lcd.clear();
}
void push3() { //функция для установки напоминания три раза в день
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reminder set ");
lcd.setCursor(0, 1);
lcd.print("for Thrice/day !");
delay(1200);
lcd.clear();
}
void pinstop(){ //функция для прекращения гудения, когда пользователь нажимает кнопку остановки
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Take Medicine ");
lcd.setCursor(0, 1);
lcd.print("with Warm Water");
delay(5000);
lcd.clear();
}
void at8am() { // функция, которая начинает гудеть в 8 утра
DateTime t = rtc.now();
if (int(t.hour()) == buzz8amHH && int(t.minute()) == buzz8amMM && (int(t.second()) == buzz8amSS || int(t.second()) < buzz8amSS+10)) {
////////////////////////////////////////////////// ///
digitalWrite(buzz,HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time to take ");
lcd.setCursor(0, 1);
lcd.print("Morning medicines.");
delay(5000);
////////////////////////////////////////////////// ///
}
}
void at2pm() { // функция, чтобы начать гудение в 14:00
DateTime t = rtc.now();
if (int(t.hour()) == buzz2pmHH && int(t.minute()) == buzz2pmMM && (int(t.second()) == buzz2pmSS || int(t.second()) < buzz2pmSS+10)) {
////////////////////////////////////////////////// ///
digitalWrite(buzz,HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time to take ");
lcd.setCursor(0, 1);
lcd.print("Afternoon medicines.");
delay(5000);
////////////////////////////////////////////////// ///
}
}
void at8pm() { // функция, которая начинает гудеть в 8 вечера
DateTime t = rtc.now();
if (int(t.hour()) == buzz8pmHH && int(t.minute()) == buzz8pmMM && (int(t.second()) == buzz8pmSS || int(t.second()) < buzz8pmSS+10)) {
////////////////////////////////////////////////// ///
digitalWrite(buzz,HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time to take ");
lcd.setCursor(0, 1);
lcd.print("Night medicines.");
delay(5000);
////////////////////////////////////////////////// ///
}
}
@Iman, 👍0
Обсуждение2 ответа
Ваше изображение проводки плохо видно. Я рекомендую проверять по одному.
Во-первых, вы подключаете Arduino только к ЖК-дисплею, сначала заставьте его работать. Затем попробуйте следующее.
Я взглянул на ваш код. Есть некоторые моменты, которые вы должны проверить или изменить:
НЕ используйте функцию задержки(). Если вы используете функцию задержки(), многие события нажатия будут пропущены. Вместо этого вы должны использовать временные метки. Я рекомендую использовать библиотеку ezButton, чтобы избежать блокировки или установить отметку времени самостоятельно (см. пример BlinkWithoutDelay).
Похоже, вы используете внешние вытягивающие/вытягивающие кнопки для кнопок. Я рекомендую использовать внутреннюю подтяжку, чтобы упростить проводку.
Информацию о ЖК-дисплее см. в этом руководстве
.Некоторые идеи по устранению неполадок:
1. меняет ли поворот потенциометра яркость ЖК-дисплея?
А. Если нет, то это (1) проблема с питанием (2) проблема с проводкой.
2. Вы когда-нибудь видели странные символы на ЖК-дисплее или просто «показывает блоки вместо символов»?
А. Если только блоки. Данные, вероятно, не попадают на ЖК-дисплей. ЖК-дисплей будет отображать блоки по умолчанию.
Б. Если вы также получаете странные символьные данные, возможно, строки данных подключены неправильно.
3. Загрузите программу, которая делает только следующее:
А. Инициализирует ЖК-дисплей
Б. печатает одну строку вывода каждый раз в цикле () Это самый простой способ определить, является ли это вашей проводкой. Если вы ничего не видите на ЖК-дисплее, велика вероятность, что у вас проблема с проводкой. Это также очень легко попробовать, потому что вы просто открываете новый скетч, создаете его и загружаете на свое устройство.
Пример ЖК-дисплея
Попробуйте этот официальный пример ЖК-дисплея Arduino (только убедитесь, что ваши строки данных совпадают - - вы можете изменить значения в примере кода, чтобы они соответствовали вашей ситуации.
Если это проблема с проводкой, я бы начал искать
если вы получаете необходимое количество тока / напряжения на ЖК-дисплей
каждая линия данных подключена правильно. Отключите питание и используйте мультиметр, чтобы проверить непрерывность соединения Arduino и контактов ЖК-дисплея.
- Есть ли в Sparkfun Redboard Arduino Uno встроенный RTC?
- Новичок в Arduino и ищет направление для исследования идеи проекта
- Печать string and integer LCD
- Разница между «time_t» и «DateTime»
- Отправка значения с одного Arduino на другой
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
«обнаружил несколько проблем, которые уже исправлены, но эта меня озадачивает», так какая именно проблема? Этот скетч и сложность проекта огромны. Вы должны предоставить минимальный пример того, что именно сломано с каким компонентом, тогда люди могут помочь вам лучше., @Maximilian Gerhardt
ЖК-дисплей и подключение к 4 кнопкам, и правильно ли моя проводка?, @Iman