Kazalo:

Ura v realnem času z Arduinom: 3 koraki
Ura v realnem času z Arduinom: 3 koraki

Video: Ura v realnem času z Arduinom: 3 koraki

Video: Ura v realnem času z Arduinom: 3 koraki
Video: FLProg8:установка часов реального времени с помощью ЖК-меню| Визуальное программирование для Arduino 2024, November
Anonim
Ura v realnem času z Arduinom
Ura v realnem času z Arduinom

V tem projektu bomo s pomočjo modula Arduino in RTC izdelali uro. Kot vemo, Arduino ne more prikazati dejanskega časa, zato bomo z modulom RTC prikazali pravi čas na LCD -prikazovalniku. Pozorno preberite vse korake, ki vam bodo v veliko pomoč pri izdelavi ure.

Koda DS3231 Arduino je podobna kodi DS1307 in deluje z obema čipoma RTC.

Arduino koda spodaj ne uporablja nobene knjižnice za DS3231 RTC, knjižnica Wire je za korespondenco med Arduino in DS3231, ki uporablja konvencijo I2C.

Ja! Mnogi inženirji elektronike so pri svojih časovno odvisnih projektih odvisni od tega, vendar RTC ni povsem zanesljiv. Deluje na baterije in ga je treba kmalu ali slej zamenjati. Prihaja do projektov IoT, zavzema dragocene zatiče SPI (Serial Peripheral Interface) in se zaplete z žicami, ki se prepletajo. Rešitev … Prihaja naš junak NTP (omrežni časovni protokol). NTP je tako natančen, saj dobi čas iz interneta. Ta protokol bomo upravljali v načinu odjemalec-strežnik. postopek je tako preprost, da naš Nodemcu deluje kot odjemalec in od strežnika z uporabo UDP zahteva paket NTP. V zameno strežnik pošlje paket odjemalcu, ki razčleni podatke. NTP je univerzalni protokol za časovno sinhronizacijo. Zdaj pa prižgimo laboratorijsko delovno mesto

Korak: Potrebne komponente

  • Arduino plošča
  • DS3231 RTC plošča
  • 16x2 LCD zaslon
  • 2 x gumb
  • 10K ohmski spremenljivi upor (ali potenciometer)
  • 330-ohmski upor
  • 3V gumbna baterija
  • Ogledna plošča
  • Mostične žice

RTC mokula DS3231

Čas je bistveni čut, ki je potreben v tem hitrem svetu ljudi. V projektu v realnem času

Uporabljamo RTC (A. K. A ura v realnem času)

RTC ura v realnem času (RTC) je integrirano vezje (IC), ki spremlja trenutni čas. RTC skrbi za čas v realnem načinu. RTC običajno najdemo v računalniških matičnih ploščah in vgrajenih sistemih, kar zahteva pravočasen dostop.

2. korak: Povezava ure Arduino

Povezava ure Arduino
Povezava ure Arduino
  • Priključite SCL pin na modul RTC na Arduino A5
  • Priključite pin SDA na modul RTC na Arduino A4
  • VCC priključite na 5v in GND na GND
  • Priključite gumb na zatič 8
  • Priključite drug gumb na zatič 9
  • Priključite RS LCD na pin 2 Arduina
  • E LCD priključite na pin 3 Arduina
  • Priključite D7 LCD na pin 7 Arduina
  • Priključite D6 LCD na pin 6 Arduina
  • Priključite D5 LCD na pin 5 Arduina
  • Priključite D4 LCD na pin 4 Arduina
  • Priključite VSS & K na GND
  • Priključite VDD & A na 5v
  • Priključite vo na izhodni zatič potenciometra

3. korak: Koda za uro Arduino z RTC

Koda za uro Arduino z RTC
Koda za uro Arduino z RTC

DS3231 deluje samo v formatu BCD in za pretvorbo BCD v decimalno vrednost in obratno sem uporabil 2 vrstici spodaj (primer za minute): // Pretvori BCD v decimalno minuto = (minuta >> 4) * 10 + (minuta & 0x0F);

// Pretvori decimalno v BCDminute = ((minute / 10) << 4) + (minuta % 10); void DS3231_display (): prikaže čas in koledar, preden se prikaz časa in koledarski podatki pretvorijo iz BCD v decimalni format. void blink_parameter ():

// Ura in koledar v realnem času z nastavljenimi gumbi z uporabo DS3231 in Arduino // vključuje kodo knjižnice LCD #include // vključuje kodo knjižnice Wire (potrebno za naprave s protokolom I2C) #include // povezave z modulom LCD (RS, E, D4, D5, D6, D7) LCD tekoči kristal (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // gumb1 je priključen na pin 8 pinMode (9, INPUT_PULLUP); // button2 je priključen na pin 9 // nastavite število stolpcev in vrstic LCD -ja lcd.begin (16, 2); Wire.begin (); // Pridružite se vodilu i2c} char Time = "TIME:::"; char Calendar = "DATE: / / 20"; bajt i, druga, minuta, ura, datum, mesec, leto; void DS3231_display () {// Pretvori BCD v decimalno sekundo = (druga >> 4) * 10 + (druga & 0x0F); minuta = (minuta >> 4) * 10 + (minuta & 0x0F); ura = (ura >> 4) * 10 + (ura & 0x0F); datum = (datum >> 4) * 10 + (datum & 0x0F); mesec = (mesec >> 4) * 10 + (mesec & 0x0F); leto = (leto >> 4) * 10 + (leto & 0x0F); // Končni čas pretvorbe [12] = drugi % 10 + 48; Čas [11] = sekunda / 10 + 48; Čas [9] = minuta % 10 + 48; Čas [8] = minuta / 10 + 48; Čas [6] = ura % 10 + 48; Čas [5] = ura / 10 + 48; Koledar [14] = leto % 10 + 48; Koledar [13] = leto / 10 + 48; Koledar [9] = mesec % 10 + 48; Koledar [8] = mesec / 10 + 48; Koledar [6] = datum % 10 + 48; Koledar [5] = datum / 10 + 48; lcd.setCursor (0, 0); lcd.print (čas); // Prikaz časa lcd.setCursor (0, 1); lcd.print (koledar); // Prikaz koledarja} void blink_parameter () {bajt j = 0; while (j 23) // Če so ure> 23 ==> ure = 0 parameter = 0; if (i == 1 && parameter> 59) // Če minute> 59 ==> minute = 0 parameter = 0; if (i == 2 && parameter> 31) // Če je datum> 31 ==> datum = 1 parameter = 1; if (i == 3 && parameter> 12) // Če je mesec> 12 ==> mesec = 1 parameter = 1; if (i == 4 && parameter> 99) // Če je leto> 99 ==> leto = 0 parameter = 0; sprintf (besedilo, "%02u", parameter); lcd.setCursor (x, y); lcd.print (besedilo); zamuda (200); // Počakajte 200 ms} lcd.setCursor (x, y); lcd.print (""); // Prikaz dveh presledkov blink_parameter (); sprintf (besedilo, "%02u", parameter); lcd.setCursor (x, y); lcd.print (besedilo); blink_parameter (); if (! digitalRead (8)) {// Če pritisnete gumb (pin #8) i ++; // Povečanje 'i' za naslednji vrnjeni parameter; // Vrnitev vrednosti parametra in izhod}}} void loop () {if (! DigitalRead (8)) {// Če je pritisnjen gumb (pin #8) i = 0; ura = uredi (5, 0, ura); minuta = uredi (8, 0, minuta); datum = uredi (5, 1, datum); mesec = uredi (8, 1, mesec); leto = uredi (13, 1, leto); // Pretvori decimalno v BCD minuto = ((minute / 10) << 4) + (minuta % 10); ura = ((ura / 10) << 4) + (ura % 10); datum = ((datum / 10) << 4) + (datum % 10); mesec = ((mesec / 10) << 4) + (mesec % 10); leto = ((leto / 10) << 4) + (leto % 10); // Konec pretvorbe // Zapis podatkov v DS3231 RTC Wire.beginTransmission (0x68); // Zaženite protokol I2C z naslovom DS3231 Wire.write (0); // Pošlji naslov registra Wire.write (0); // Ponastavi sesonde in zažene oscilator Wire.write (minuta); // Zapišite minuto Wire.write (ura); // Pisanje ure Wire.write (1); // Napišite dan (ne uporablja se) Wire.write (datum); // Zapišite datum Wire.write (mesec); // Zapišite mesec Wire.write (leto); // Zapišite leto Wire.endTransmission (); // Ustavi prenos in sprosti zakasnitev vodila I2C (200); // Počakajte 200 ms} Wire.beginTransmission (0x68); // Zaženite protokol I2C z naslovom DS3231 Wire.write (0); // Pošlji naslov registra Wire.endTransmission (false); // I2C znova zaženite Wire.requestFrom (0x68, 7); // Zahtevajte 7 bajtov od DS3231 in sprostite vodilo I2C na koncu drugega branja = Wire.read (); // Branje sekund iz registra 0 minut = Wire.read (); // 1 uro beremo zapisnike iz registra = Wire.read (); // Ura branja iz registra 2 Wire.read (); // dan branja iz registra 3 (ne uporablja se) datum = Wire.read (); // Datum branja iz registra 4 mesec = Wire.read (); // Branje meseca iz registra 5 let = Wire.read (); // Preberite leto iz registra 6 DS3231_display (); // Čas predvajanja in zamik koledarja (50); // Počakajte 50 ms}

Priporočena: