Inhaltsverzeichnis:

Echtzeituhr mit Arduino - Gunook
Echtzeituhr mit Arduino - Gunook

Video: Echtzeituhr mit Arduino - Gunook

Video: Echtzeituhr mit Arduino - Gunook
Video: Arduino Projekt: Echtzeituhr DS1307 am Arduino 2024, Juli
Anonim
Echtzeituhr mit Arduino
Echtzeituhr mit Arduino

In diesem Projekt werden wir mit Hilfe des Arduino- und RTC-Moduls eine Uhr erstellen. Da wir wissen, dass der Arduino die aktuelle Zeit nicht anzeigen kann, verwenden wir das RTC-Modul, um die richtige Zeit auf dem LCD anzuzeigen. Lesen Sie alle Schritte sorgfältig durch, es wird Ihnen sehr helfen, das Uhrwerk zu machen.

Der DS3231 Arduino-Code ist wie der DS1307-Code und funktioniert mit beiden RTC-Chips.

Der darunterliegende Arduino-Code verwendet keine Bibliothek für den DS3231 RTC, die Wire-Bibliothek dient der Korrespondenz zwischen dem Arduino und dem DS3231 unter Verwendung der I2C-Konvention.

Ja! Viele Elektronikingenieure verlassen sich bei ihren zeitbasierten Projekten darauf, aber RTC ist nicht absolut zuverlässig. Es ist batteriebetrieben und muss bald oder später ersetzt werden. Bei IoT-Projekten belegt es wertvolle SPI-Pins (Serial Peripheral Interface) und wird mit verhedderten Drähten unordentlich. Lösung…. Hier kommt unser Held NTP (Network Time Protocol). NTP ist so genau, da es die Zeit aus dem Internet bezieht. Wir werden dieses Protokoll im Client-Server-Modus betreiben. der Vorgang ist so einfach, dass unser Nodemcu als Client fungiert und per UDP ein NTP-Paket vom Server anfordert. Im Gegenzug sendet der Server ein Paket an den Client, der die Daten analysiert. NTP ist das universelle Zeitsynchronisationsprotokoll. Lassen Sie uns jetzt unseren Laborarbeitsplatz beleuchten

Schritt 1: Erforderliche Komponenten

  • Arduino-Board
  • DS3231 RTC-Karte
  • 16x2 LCD-Bildschirm
  • 2 x Taster
  • 10K Ohm variabler Widerstand (oder Potentiometer)
  • 330-Ohm-Widerstand
  • 3V Knopfzellenbatterie
  • Steckbrett
  • Überbrückungsdrähte

RTC-Modul DS3231

Zeit ist ein wesentlicher Sinn in dieser schnelllebigen Welt der Menschen. Im Echtzeit-Projekt

Wir verwenden RTC (A. K. A Echtzeituhr)

RTC Real-Time-Clock (RTC) ist ein integrierter Schaltkreis (IC), der die aktuelle Zeit verfolgt. RTC kümmert sich um die Zeit im Real-Modus. Die RTC ist normalerweise in Computer-Motherboards und eingebetteten Systemen zu finden, die einen rechtzeitigen Zugriff erfordern.

Schritt 2: Anschluss der Arduino Clock

Anschluss der Arduino-Uhr
Anschluss der Arduino-Uhr
  • Verbinden Sie den SCL-Pin mit dem RTC-Modul mit dem Arduino A5
  • Verbinden Sie den SDA-Pin mit dem RTC-Modul mit dem Arduino A4
  • Verbinden Sie VCC mit 5V und GND MIT GND
  • Schließen Sie einen Taster an den Pin 8. an
  • Verbinden Sie einen weiteren Taster mit dem Pin 9
  • Verbinden Sie RS des LCD mit Pin 2 von Arduino
  • Verbinden Sie E von LCD mit Pin 3 von Arduino
  • Verbinden Sie D7 von LCD mit Pin 7 von Arduino
  • Verbinden Sie D6 von LCD mit Pin 6 von Arduino
  • Verbinden Sie D5 von LCD mit Pin 5 von Arduino
  • Verbinden Sie D4 von LCD mit Pin 4 von Arduino
  • Verbinden Sie VSS & K mit GND
  • Verbinden Sie VDD & A mit dem 5V
  • Verbinden Sie vo mit dem Potentiometer-Ausgangspin

Schritt 3: Code für Arduino Clock mit RTC

Code für Arduino-Uhr mit RTC
Code für Arduino-Uhr mit RTC

Der DS3231 funktioniert nur mit BCD-Format und um den BCD in Dezimalzahlen umzuwandeln und umgekehrt habe ich die 2 Zeilen unten verwendet (Beispiel für Minute):// Convert BCD in Dezimalminute = (Minute >> 4) * 10 + (Minute & 0x0F);

// Dezimal in BCDminute umwandeln = ((Minute / 10) << 4) + (Minute % 10); void DS3231_display(): Zeigt Zeit und Kalender an, bevor Zeit und Kalenderdaten angezeigt werden, werden vom BCD- in das Dezimalformat konvertiert.void blink_parameter():

// Echtzeituhr und Kalender mit Set-Tasten mit DS3231 und Arduino // LCD-Bibliothekscode einschließen #include // Wire-Bibliothekscode einschließen (erforderlich für I2C-Protokollgeräte) #include // LCD-Modulanschlüsse (RS, E, D4, D5.), D6, D7) Flüssigkristall-LCD(2, 3, 4, 5, 6, 7); Void setup () { PinMode (8, INPUT_PULLUP); // button1 ist mit Pin 8 verbunden pinMode (9, INPUT_PULLUP); // button2 ist an Pin 9 angeschlossen // die Anzahl der Spalten und Zeilen des LCDs einstellen lcd.begin (16, 2); Wire.begin(); // i2c-Bus beitreten } char Time = "TIME::: "; char Kalender = "DATUM: / /20"; Byte i, Sekunde, Minute, Stunde, Datum, Monat, Jahr; void DS3231_display () {// BCD in Dezimalsekunde umwandeln = (Sekunde >> 4) * 10 + (Sekunde & 0x0F); Minute = (Minute >> 4) * 10 + (Minute & 0x0F); Stunde = (Stunde >> 4) * 10 + (Stunde & 0x0F); Datum = (Datum >> 4) * 10 + (Datum & 0x0F); Monat = (Monat >> 4) * 10 + (Monat & 0x0F); Jahr = (Jahr >> 4) * 10 + (Jahr & 0x0F); // Wandlungszeit beenden[12] = Sekunde % 10 + 48; Zeit[11] = Sekunde / 10 + 48; Zeit[9] = Minute % 10 + 48; Zeit[8] = Minute / 10 + 48; Zeit[6] = Stunde % 10 + 48; Zeit[5] = Stunde / 10 + 48; Kalender[14] = Jahr % 10 + 48; Kalender[13] = Jahr / 10 + 48; Kalender[9] = Monat % 10 + 48; Kalender[8] = Monat / 10 + 48; Kalender[6] = Datum % 10 + 48; Kalender[5] = Datum / 10 + 48; lcd.setCursor(0, 0); lcd.print (Zeit); // Anzeigezeit lcd.setCursor (0, 1); lcd.print (Kalender); // Kalender anzeigen aufrechtzuerhalten. Void blink_parameter () { Byte j = 0; while(j 23) // Wenn Stunden > 23 ==> Stunden = 0 Parameter = 0; if(i == 1 && Parameter > 59) // Wenn Minuten > 59 ==> Minuten = 0 Parameter = 0; if(i == 2 && Parameter > 31) // Wenn Datum > 31 ==> Datum = 1 Parameter = 1; if(i == 3 && Parameter > 12) // Wenn Monat > 12 ==> Monat = 1 Parameter = 1; if(i == 4 && Parameter > 99) // Wenn Jahr > 99 ==> Jahr = 0 Parameter = 0; sprintf(Text, "%02u", Parameter); lcd.setCursor(x, y); lcd.print (Text); Verzögerung (200); // 200ms warten } lcd.setCursor(x, y); lcd.print(" "); // Zwei Leerzeichen anzeigen blink_parameter(); sprintf(Text, "%02u", Parameter); lcd.setCursor(x, y); lcd.print (Text); blink_parameter(); if(!digitalRead(8)){// Wenn Taste (Pin #8) gedrückt wird i++; // 'i' für den nächsten Parameter erhöhen Rückgabeparameter; // Parameterwert zurückgeben und beenden}}} Void loop () { if (! digitalRead (8)) { // Wenn die Taste (Pin #8) gedrückt wird i = 0; Stunde = bearbeiten (5, 0, Stunde); Minute = Bearbeiten (8, 0, Minute); Datum = Bearbeiten (5, 1, Datum); Monat = Bearbeiten (8, 1, Monat); Jahr = Bearbeiten (13, 1, Jahr); // Dezimal in BCD-Minute umwandeln = ((Minute / 10) << 4) + (Minute % 10); Stunde = ((Stunde / 10) << 4) + (Stunde % 10); Datum = ((Datum / 10) << 4) + (Datum % 10); Monat = ((Monat / 10) << 4) + (Monat % 10); Jahr = ((Jahr / 10) << 4) + (Jahr % 10); // Konvertierung beenden // Daten in DS3231 RTC schreiben Wire.beginTransmission (0x68); // I2C-Protokoll mit DS3231-Adresse starten Wire.write(0); // Registeradresse senden Wire.write (0); // Sesonds zurücksetzen und Oszillator starten Wire.write (Minute); // Minute schreiben Wire.write (Stunde); // Stunde schreiben Wire.write(1); // Tag schreiben (nicht verwendet) Wire.write(date); // Datum schreiben Wire.write(Monat); // Monat schreiben Wire.write(Jahr); // Jahr schreiben Wire.endTransmission(); // Stoppen Sie die Übertragung und geben Sie die I2C-Busverzögerung frei (200); // 200ms warten } Wire.beginTransmission(0x68); // I2C-Protokoll mit DS3231-Adresse starten Wire.write(0); // Registeradresse senden Wire.endTransmission(false); // I2C-Neustart Wire.requestFrom (0x68, 7); // 7 Byte von DS3231 anfordern und I2C-Bus am Ende des Lesens freigeben Sekunde = Wire.read (); // Sekunden aus dem Register lesen 0 Minute = Wire.read (); // Minuten aus Register 1 Stunde lesen = Wire.read (); // Stunde aus Register 2 lesen Wire.read (); // Tag aus Register 3 lesen (nicht verwendet) date = Wire.read(); // Datum aus Register 4 Monat lesen = Wire.read (); // Monat aus Register lesen 5 year = Wire.read(); // Jahr aus Register 6 lesen DS3231_display(); // Anzeigezeit und Kalenderverzögerung (50); // Warte 50ms }

Empfohlen: