Obsah:

Hodiny v reálném čase s Arduino: 3 kroky
Hodiny v reálném čase s Arduino: 3 kroky

Video: Hodiny v reálném čase s Arduino: 3 kroky

Video: Hodiny v reálném čase s Arduino: 3 kroky
Video: Build Seven Segment LED clock with Arduino and DS3231 - Robojax 2024, Červenec
Anonim
Hodiny v reálném čase s Arduino
Hodiny v reálném čase s Arduino

V tomto projektu vyrobíme hodiny pomocí modulu Arduino a RTC. Jak víme, Arduino nemůže zobrazovat skutečný čas, takže použijeme modul RTC k zobrazení správného času na LCD. Přečtěte si pozorně všechny kroky, které vám k hodinovému stroji hodně pomohou.

Kód DS3231 Arduino je jako kód DS1307 a funguje s oběma čipy RTC.

Níže uvedený kód Arduino nevyužívá žádnou knihovnu pro DS3231 RTC, knihovna Wire je pro korespondenci mezi Arduino a DS3231 využívající konvenci I2C.

To jo! Mnoho inženýrů v oblasti elektroniky je závislých na svých projektech založených na čase, ale RTC není zcela spolehlivý. Je napájen baterií a brzy nebo později bude muset být vyměněn. Pokud jde o projekty IoT, zabírá cenné piny SPI (Serial Peripheral Interface) a zamotává se kolem drátů zamotaných kolem. Řešení…. Zde přichází náš hrdina NTP (Network Time Protocol). NTP je tak přesný, protože získává čas z internetu. Tento protokol budeme provozovat v režimu klient-server. proces je tak jednoduchý, že náš Nodemcu funguje jako klient a vyžádá si paket NTP ze serveru pomocí UDP. Server na oplátku odešle klientovi paket, který data analyzuje. NTP je univerzální protokol pro synchronizaci času. Nyní rozsviťme naši laboratoř

Krok 1: Požadované součásti

  • Deska Arduino
  • Deska RTC DS3231
  • 16x2 LCD displej
  • 2 x tlačítko
  • 10K ohm variabilní odpor (nebo potenciometr)
  • Rezistor 330 ohmů
  • 3V knoflíková baterie
  • Prkénko
  • Propojovací vodiče

RTC mocule DS3231

Čas je v tomto rychle se měnícím světě lidských bytostí nezbytný. V projektu v reálném čase

Používáme RTC (A. K. A hodiny reálného času)

Hodiny reálného času RTC (RTC) jsou integrovaný obvod (IC), který sleduje aktuální čas. RTC se stará o čas v reálném režimu. RTC se obvykle nachází na základních deskách počítačů a vestavěných systémech, které vyžadují včasný přístup.

Krok 2: Připojení hodin Arduino

Připojení hodin Arduino
Připojení hodin Arduino
  • Připojte pin SCL k modulu RTC k Arduino A5
  • Připojte pin SDA k modulu RTC k Arduino A4
  • Připojte VCC TO 5v a GND TO GND
  • Připojte tlačítko ke kolíku 8
  • Připojte další tlačítko ke kolíku 9
  • Připojte RS LCD k pinu 2 Arduina
  • Připojte E displeje LCD ke kolíku 3 Arduina
  • Připojte D7 LCD k pinu 7 Arduina
  • Připojte D6 LCD k pinu 6 Arduina
  • Připojte D5 LCD k pinu 5 Arduina
  • Připojte D4 LCD k pin 4 Arduino
  • Připojte VSS & K ke GND
  • Připojte VDD & A k 5v
  • Připojte vo k výstupnímu pinu potenciometru

Krok 3: Kód pro hodiny Arduino s RTC

Kód pro hodiny Arduino s RTC
Kód pro hodiny Arduino s RTC

DS3231 pracuje pouze s formátem BCD a pro převod BCD na desítkové a svěráky jsem použil níže uvedené 2 řádky (příklad pro minuty): // Převod BCD na desetinné minuty = (minuta >> 4) * 10 + (minuty & 0x0F);

// Převod desítkové na BCDminute = ((minuta / 10) << 4) + (minuta % 10); void DS3231_display (): zobrazuje čas a kalendář, před zobrazením času a kalendáře jsou data převedena z BCD do desítkového formátu. Vyhněte se blink_parameter ():

// Hodiny a kalendář v reálném čase s nastavenými tlačítky pomocí DS3231 a Arduino // zahrnout kód LCD knihovny #include // zahrnout kód drátové knihovny (potřebné pro zařízení s protokolem I2C) #include // připojení LCD modulu (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); neplatné nastavení () {pinMode (8, INPUT_PULLUP); // button1 je připojen k pinu 8 pinMode (9, INPUT_PULLUP); // tlačítko2 je připojeno k pinu 9 // nastavení počtu sloupců a řádků LCD lcd.begin (16, 2); Wire.begin (); // Připojte se k i2c bus} char Čas = "TIME:::"; char Calendar = "DATUM: / / 20"; byte i, sekunda, minuta, hodina, datum, měsíc, rok; void DS3231_display () {// Převod BCD na desetinnou sekundu = (sekunda >> 4) * 10 + (sekunda & 0x0F); minuta = (minuta >> 4) * 10 + (minuta & 0x0F); hodina = (hodina >> 4) * 10 + (hodina & 0x0F); datum = (datum >> 4) * 10 + (datum & 0x0F); měsíc = (měsíc >> 4) * 10 + (měsíc & 0x0F); rok = (rok >> 4) * 10 + (rok & 0x0F); // Čas ukončení převodu [12] = sekunda % 10 + 48; Čas [11] = sekunda / 10 + 48; Čas [9] = minuta % 10 + 48; Čas [8] = minuta / 10 + 48; Čas [6] = hodina % 10 + 48; Čas [5] = hodina / 10 + 48; Kalendář [14] = rok % 10 + 48; Kalendář [13] = rok / 10 + 48; Kalendář [9] = měsíc % 10 + 48; Kalendář [8] = měsíc / 10 + 48; Kalendář [6] = datum % 10 + 48; Kalendář [5] = datum / 10 + 48; lcd.setCursor (0, 0); lcd.print (čas); // Čas zobrazení lcd.setCursor (0, 1); lcd.print (kalendář); // Zobrazit kalendář} neplatné blink_parameter () {byte j = 0; while (j 23) // If hours> 23 ==> hours = 0 parameter = 0; if (i == 1 && parameter> 59) // If minutes> 59 ==> minutes = 0 parameter = 0; if (i == 2 && parametr> 31) // If date> 31 ==> date = 1 parameter = 1; if (i == 3 && parameter> 12) // If month> 12 ==> month = 1 parameter = 1; if (i == 4 && parameter> 99) // If year> 99 ==> year = 0 parameter = 0; sprintf (text, "%02u", parametr); lcd.setCursor (x, y); lcd.print (text); zpoždění (200); // Počkejte 200 ms} lcd.setCursor (x, y); lcd.print (""); // Zobrazení dvou mezer blink_parameter (); sprintf (text, "%02u", parametr); lcd.setCursor (x, y); lcd.print (text); blink_parameter (); if (! digitalRead (8)) {// Pokud je stisknuto tlačítko (pin #8) i ++; // Zvýšení 'i' pro další parametr návratového parametru; // Vrácení hodnoty parametru a ukončení}}} void loop () {if (! DigitalRead (8)) {// Pokud je stisknuto tlačítko (pin #8) i = 0; hodina = úprava (5, 0, hodina); minuta = upravit (8, 0, minuta); datum = upravit (5, 1, datum); měsíc = upravit (8, 1, měsíc); rok = upravit (13, 1, rok); // Převod desetinné na BCD minutu = ((minuta / 10) << 4) + (minuta % 10); hodina = ((hodina / 10) << 4) + (hodina % 10); datum = ((datum / 10) << 4) + (datum % 10); měsíc = ((měsíc / 10) << 4) + (měsíc % 10); rok = ((rok / 10) << 4) + (rok % 10); // Ukončení převodu // Zápis dat do DS3231 RTC Wire.beginTransmission (0x68); // Spusťte protokol I2C s adresou DS3231 Wire.write (0); // Odeslat registrační adresu Wire.write (0); // Resetujte sesondy a spusťte oscilátor Wire.write (minuta); // Zápis minuty Wire.write (hodina); // Hodina zápisu Wire.write (1); // Den zápisu (nepoužívá se) Wire.write (datum); // Datum zápisu Wire.write (měsíc); // Zápis měsíce Wire.write (rok); // Napsat rok Wire.endTransmission (); // Zastavte přenos a uvolněte zpoždění sběrnice I2C (200); // Počkejte 200 ms} Wire.beginTransmission (0x68); // Spusťte protokol I2C s adresou DS3231 Wire.write (0); // Odeslat registrační adresu Wire.endTransmission (false); // I2C restart Wire.requestFrom (0x68, 7); // Požadavek 7 bytů z DS3231 a uvolnění sběrnice I2C na konci čtení sekundy = Wire.read (); // Čtení sekund z registru 0 minut = Wire.read (); // Čtení minut z registru 1 hodinu = Wire.read (); // Hodina čtení z registru 2 Wire.read (); // Den čtení z registru 3 (nepoužito) datum = Wire.read (); // Datum čtení z registru 4 měsíce = Wire.read (); // Přečíst měsíc z registru 5 let = Wire.read (); // Přečíst rok z registru 6 DS3231_display (); // Diaplay time & calendar delay (50); // Počkejte 50 ms}

Doporučuje: