ЖК-дисплей мигает после ввода кода: система напоминания о приеме лекарств с использованием 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);

        ////////////////////////////////////////////////// ///
      }
}

, 👍0

Обсуждение

«обнаружил несколько проблем, которые уже исправлены, но эта меня озадачивает», так какая именно проблема? Этот скетч и сложность проекта огромны. Вы должны предоставить минимальный пример того, что именно сломано с каким компонентом, тогда люди могут помочь вам лучше., @Maximilian Gerhardt

ЖК-дисплей и подключение к 4 кнопкам, и правильно ли моя проводка?, @Iman


2 ответа


0

Ваше изображение проводки плохо видно. Я рекомендую проверять по одному.

Во-первых, вы подключаете Arduino только к ЖК-дисплею, сначала заставьте его работать. Затем попробуйте следующее.

Я взглянул на ваш код. Есть некоторые моменты, которые вы должны проверить или изменить:

  1. НЕ используйте функцию задержки(). Если вы используете функцию задержки(), многие события нажатия будут пропущены. Вместо этого вы должны использовать временные метки. Я рекомендую использовать библиотеку ezButton, чтобы избежать блокировки или установить отметку времени самостоятельно (см. пример BlinkWithoutDelay).

  2. Похоже, вы используете внешние вытягивающие/вытягивающие кнопки для кнопок. Я рекомендую использовать внутреннюю подтяжку, чтобы упростить проводку.

Информацию о ЖК-дисплее см. в этом руководстве

.
,

1

Некоторые идеи по устранению неполадок:

1. меняет ли поворот потенциометра яркость ЖК-дисплея?

А. Если нет, то это (1) проблема с питанием (2) проблема с проводкой.

2. Вы когда-нибудь видели странные символы на ЖК-дисплее или просто «показывает блоки вместо символов»?

А. Если только блоки. Данные, вероятно, не попадают на ЖК-дисплей. ЖК-дисплей будет отображать блоки по умолчанию.

Б. Если вы также получаете странные символьные данные, возможно, строки данных подключены неправильно.

3. Загрузите программу, которая делает только следующее:

А. Инициализирует ЖК-дисплей

Б. печатает одну строку вывода каждый раз в цикле () Это самый простой способ определить, является ли это вашей проводкой. Если вы ничего не видите на ЖК-дисплее, велика вероятность, что у вас проблема с проводкой. Это также очень легко попробовать, потому что вы просто открываете новый скетч, создаете его и загружаете на свое устройство.

Пример ЖК-дисплея

Попробуйте этот официальный пример ЖК-дисплея Arduino (только убедитесь, что ваши строки данных совпадают - - вы можете изменить значения в примере кода, чтобы они соответствовали вашей ситуации.

Если это проблема с проводкой, я бы начал искать

  1. если вы получаете необходимое количество тока / напряжения на ЖК-дисплей

  2. каждая линия данных подключена правильно. Отключите питание и используйте мультиметр, чтобы проверить непрерывность соединения Arduino и контактов ЖК-дисплея.

,