Arduino-Uhr auf LCD 1602 ohne RTC-Modul

Arduino-Uhr ohne RTC Echtzeituhrmodul mit LCD 1602 i2c Display – dieses Projekt bietet die Zeiteinstellung (Stunden und Minuten) und die Alarmzeit. Zwei Tasten werden zum Umschalten der Betriebsmodi und zum Einstellen der Uhr verwendet, und ein Piezo-Lautsprecher (Buzzer) wird zur Aktivierung des Tonsignals verwendet. Das Projekt enthält einen Schaltplan des Geräts sowie ein Programm für den Arduino-Mikrocontroller.




Bestandteile:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • 1602 LCD-Display mit I2C
  • Tasten
  • Piezo Buzzer
  • Breadboard
  • Dupont-Kabel
  • Bibliothek LiquidCrystal_I2C.h

Dieses Projekt erfordert nur wenige Teile: ein 1602-Display mit i2c-Modul (Sie können auch ein Display ohne i2c anschließen), zwei Tasten und einen Piezo-Buzzer. Die Tasten werden an die Pins des Arduino-Mikrocontrollers angeschlossen, der im Modus INPUT PULLUP konfiguriert ist – mit dieser Anschlussmethode können Sie die Anzahl der Tastendrücke ablesen, und die Baugruppe benötigt keine Widerstände und kein RTC ds1302-Modul.

Arduino-Uhr mit LCD-Display 1602 ohne RTC-Modul

Arduino-Uhr ohne RTC-Modul auf LCD 1602

LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

Wenn Sie einen Arduino Mega verwenden, befinden sich auf diesem Board die SDA- und SCL-Pins für den Anschluss des Displays an den Pins 20 und 21. Bei den Boards Arduino Nano und Uno wird das LCD 1602 Display mit i2c an die Pins A4 (SDA) und A5 (SCL) angeschlossen. Der Wecker piept 1 Minute lang und kann durch Drücken der Taste an Pin 8 ausgeschaltet werden. Nach dem Zusammenbau der Schaltung, laden Sie das Programm.

Programm für Uhr ohne RTC-Modul mit LCD-Display 1602




#include "Wire.h" 
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 20, 2);

byte SEC = 0;
byte MIN = 34;
byte HOUR = 12;
byte MIN_A = 35;
byte HOUR_A = 12;
unsigned long timer;

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button1IsUp;
boolean button2IsUp;

boolean alarm = true;
byte c1, c2, c3, w, i;

// Alarm-Symbol
byte bell [8] = {
  0b11000,
  0b11110,
  0b01100,
  0b01000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

void setup() {
  pinMode(10, INPUT_PULLUP);  // Tasten
  pinMode(11, INPUT_PULLUP);
  pinMode(3, OUTPUT);  // Buzzer
  LCD.init();
  LCD.backlight();
  LCD.createChar(1, bell);
  timer = millis();
}

void loop() {
  // den Status der Schaltflächen herausfinden
  button1IsUp = digitalRead(10);
  button2IsUp = digitalRead(11);

  if (button1WasUp && !button1IsUp) {
    delay(10);
    button1IsUp = digitalRead(10);
    if (!button1IsUp) {
      SEC = 0; w = 1;
    }
  }
  button1WasUp = button1IsUp;

  if (button2WasUp && !button2IsUp) {
    delay(10);
    button2IsUp = digitalRead(11);
    if (!button2IsUp) {
      alarm = false;
    }
  }
  button2WasUp = button2IsUp;

  // wenn 1000 ms verstrichen sind - eine Sekunde hinzufügen
  if (millis() - timer > 1000) {
    timer = millis();
    SEC++;
    // wenn 59 Sekunden verstrichen sind, 1 Minute hinzufügen
    if (SEC > 59) { SEC = 0; MIN++; }
    // wenn 59 Minuten verstrichen sind, 1 Stunde hinzufügen
    if (MIN > 59) { MIN = 0; HOUR++; }
    if (HOUR > 23) { HOUR = 0; }
    // Alarm geht innerhalb von 1 Minute los
    if (alarm == true && HOUR == HOUR_A && MIN == MIN_A && i < 60) { tone(3, 50); i++; }
    if (i >= 60) { noTone(3); alarm == false; i = 0; }

    if (HOUR < 10) { c1 = 5; }
    if (HOUR >= 10) { c1 = 4; }
    if (MIN < 10) { c2 = 8; }
    if (MIN >= 10) { c2 = 7; }
    if (SEC < 10) { c3 = 11; }
    if (SEC >= 10) { c3 = 10; }

    // die Uhrzeit anzeigen
    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("0");
    LCD.setCursor(c3, 0);
    LCD.print(SEC);
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }
    noTone(5);
  }

  while (w == 1) {

    if (HOUR > 23) { HOUR = 0; }
    if (HOUR < 10) { c1 = 5; }
    if (HOUR >= 10) { c1 = 4; }
    if (MIN < 10) { c2 = 8; }
    if (MIN >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(2, 1);
    LCD.print("HOUR SETTING");

    button1IsUp = digitalRead(10);
    button2IsUp = digitalRead(11);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(10);
      if (!button1IsUp) {
        LCD.clear(); w = 2;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(11);
      if (!button2IsUp) {
        HOUR++;
      }
    }
    button2WasUp = button2IsUp;

  }

  while (w == 2) {

    if (MIN > 59) { MIN = 0;}
    if (HOUR < 10) { c1 = 5; }
    if (HOUR >= 10) { c1 = 4; }
    if (MIN < 10) { c2 = 8; }
    if (MIN >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(1, 1);
    LCD.print("MINUTE SETTING");

    button1IsUp = digitalRead(10);
    button2IsUp = digitalRead(11);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(10);
      if (!button1IsUp) {
        LCD.clear(); w = 3;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(11);
      if (!button2IsUp) {
        MIN++;
      }
    }
    button2WasUp = button2IsUp;

  }

  while (w == 3) {

    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { c1 = 5; }
    if (HOUR_A >= 10) { c1 = 4; }
    if (MIN_A < 10) { c2 = 8; }
    if (MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) {
      LCD.print(char(1));
      LCD.setCursor(4, 1);
      LCD.print("ALARM ON ");
    }
    if (alarm == false) {
      LCD.print(" ");
      LCD.setCursor(4, 1);
      LCD.print("ALARM OFF");
    }
 
    button1IsUp = digitalRead(10);
    button2IsUp = digitalRead(11);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(10);
      if (!button1IsUp) {
        LCD.clear(); w = 4;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(11);
      if (!button2IsUp) {
        alarm = !alarm;
      }
    }
    button2WasUp = button2IsUp;

  }

  while (w == 4) {

    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { c1 = 5; }
    if (HOUR_A >= 10) { c1 = 4; }
    if (MIN_A < 10) { c2 = 8; }
    if (MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(1, 1);
    LCD.print("ALARM SET HOUR");

    button1IsUp = digitalRead(10);
    button2IsUp = digitalRead(11);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(10);
      if (!button1IsUp) {
        LCD.clear(); w = 5;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(11);
      if (!button2IsUp) {
        HOUR_A++;
      }
    }
    button2WasUp = button2IsUp;
  }

  while (w == 5) {

    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { c1 = 5; }
    if (HOUR_A >= 10) { c1 = 4; }
    if (MIN_A < 10) { c2 = 8; }
    if (MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(0, 1);
    LCD.print("ALARM SET MINUTE");

    button1IsUp = digitalRead(10);
    button2IsUp = digitalRead(11);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(10);
      if (!button1IsUp) {
        LCD.clear(); w = 0;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(11);
      if (!button2IsUp) {
        MIN_A++;
      }
    }
    button2WasUp = button2IsUp;

  }

}
  1. Die Variablen c1 und c2 sind für die Position des Cursors bei der Anzeige der Uhrzeit und der Minuten zuständig, je nachdem, ob eine zweistellige oder eine einstellige Zahl in der Variable gespeichert ist (dies geschieht, um die Ausgabe zu erleichtern);
  2. Während der Einstellung der Uhr und des Weckers wird der Timer angehalten.

Schlussfolgerung. Da eine Uhr ohne das RTC-Modul ds1302 beim Ausschalten die Zeit auf die Anfangswerte zurücksetzt, wurden dem Projekt Tasten hinzugefügt. Mit diesen kann man die Uhr stellen, ohne den Sketch neu laden zu müssen – ein einfaches Arduino-Projekt für Programmieranfänger ist entstanden. Sie können auch einen BMP180– oder DHT11-Sensor hinzufügen, um die Temperatur auf dem Bildschirm anzuzeigen.

5/5 - (1 vote)


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert