Cuprins:

Ceas în timp real cu Arduino: 3 pași
Ceas în timp real cu Arduino: 3 pași

Video: Ceas în timp real cu Arduino: 3 pași

Video: Ceas în timp real cu Arduino: 3 pași
Video: Unwrapping a DS3231 Real-time Clock Module: What’s inside?? 🧐😲 #diy #electronic #arduino #how #clock 2024, Noiembrie
Anonim
Ceas în timp real cu Arduino
Ceas în timp real cu Arduino

În acest proiect, vom realiza un ceas cu ajutorul modulului Arduino și RTC. După cum știm, Arduino nu poate afișa ora reală, așa că vom folosi modulul RTC pentru a afișa ora potrivită pe ecranul LCD. Citiți cu atenție tot pasul, vă va ajuta foarte mult să faceți ceasul.

Codul DS3231 Arduino este ca și codul DS1307 și funcționează cu ambele cipuri RTC.

Codul Arduino de dedesubt nu folosește nicio bibliotecă pentru DS3231 RTC, biblioteca Wire este pentru corespondența dintre Arduino și DS3231 utilizând convenția I2C.

Da! Mulți ingineri electronici depind de aceasta pentru proiectele lor bazate pe timp, dar RTC nu este complet fiabil. Este alimentat cu baterie și trebuie înlocuit în curând sau mai târziu. Venind la proiecte IoT, acesta ocupă pini valoroși SPI (Serial Peripheral Interface) și se încurcă cu firele încurcate în jur. Soluție … Aici vine eroul nostru NTP (Network time protocol). NTP este atât de precis, deoarece primește timp de pe internet. Vom opera acest protocol folosind un mod client-server. procesul este atât de simplu încât Nodemcu nostru acționează ca un client și solicită un pachet NTP de la server utilizând UDP. În schimb, serverul trimite un pachet către client care analizează datele. NTP este protocolul universal de sincronizare a timpului. Acum să ne aprindem stația de lucru din laboratoare

Pasul 1: Componente necesare

  • Placa Arduino
  • Placă RTC DS3231
  • Ecran LCD 16x2
  • 2 x buton
  • Rezistor variabil (sau potențiometru) de 10K ohm
  • Rezistor de 330 ohmi
  • Baterie cu celule monede de 3V
  • Pană de pâine
  • Sârme de jumper

Mocula RTC DS3231

Timpul este un sens esențial necesar în această lume rapidă a ființelor umane. În proiect în timp real

Folosim RTC (A. K. A ceas în timp real)

RTC-Ceasul în timp real (RTC) este un circuit integrat (IC) care ține evidența timpului curent. RTC are grijă de timp în modul real. RTC-ul se găsește de obicei în plăcile de bază ale computerelor și în sistemele încorporate pentru a necesita acces în timp util.

Pasul 2: Conexiunea ceasului Arduino

Conexiunea ceasului Arduino
Conexiunea ceasului Arduino
  • Conectați pinul SCL la modulul RTC la Arduino A5
  • Conectați pinul SDA la modulul RTC la Arduino A4
  • Conectați VCC la 5v și GND la GND
  • Conectați un buton la pinul 8
  • Conectați un alt buton la pinul 9
  • Conectați RS-ul LCD la pinul 2 al Arduino
  • Conectați E-ul LCD la pinul 3 al Arduino
  • Conectați D7 de la LCD la pinul 7 al Arduino
  • Conectați D6 de la LCD la pinul 6 al Arduino
  • Conectați D5 de la LCD la pinul 5 al Arduino
  • Conectați D4 de la LCD la pinul 4 al Arduino
  • Conectați VSS & K la GND
  • Conectați VDD & A la 5v
  • Conectați vo la pinul de ieșire al potențiometrului

Pasul 3: Cod pentru ceasul Arduino cu RTC

Cod pentru ceas Arduino cu RTC
Cod pentru ceas Arduino cu RTC

DS3231 funcționează numai în format BCD și pentru a converti BCD în zecimal și vice versa Am folosit cele 2 linii de mai jos (exemplu pentru minut): // Conversia BCD în zecimalminut = (minut >> 4) * 10 + (minut și 0x0F);

// Convertiți zecimal în BCDminute = ((minut / 10) << 4) + (minut% 10); void DS3231_display (): afișează ora și calendarul, înainte de afișarea orei și datele calendarului sunt convertite din format BCD în format zecimal.

// Ceas și calendar în timp real cu butoane setate folosind DS3231 și Arduino // includ cod bibliotecă LCD #include // include cod bibliotecă fir (necesar pentru dispozitivele de protocol I2C) #include // Conexiuni modul LCD (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // butonul 1 este conectat la pinul 8 pinMode (9, INPUT_PULLUP); // butonul 2 este conectat la pinul 9 // configurați numărul LCD de coloane și rânduri lcd.begin (16, 2); Wire.begin (); // Join i2c bus} char Time = "TIME:::"; char Calendar = "DATA: / / 20"; octet i, al doilea, minutul, ora, data, luna, anul; void DS3231_display () {// Convertiți BCD în secundă zecimală = (second >> 4) * 10 + (second & 0x0F); minut = (minut >> 4) * 10 + (minut & 0x0F); ora = (ora >> 4) * 10 + (ora & 0x0F); data = (data >> 4) * 10 + (data & 0x0F); luna = (luna >> 4) * 10 + (luna & 0x0F); year = (year >> 4) * 10+ (year & 0x0F); // Ora de încheiere a conversiei [12] = a doua% 10 + 48; Timpul [11] = secunda / 10 + 48; Timp [9] = minut% 10 + 48; Timp [8] = minut / 10 + 48; Timpul [6] = ora% 10 + 48; Timp [5] = oră / 10 + 48; Calendar [14] = anul% 10 + 48; Calendar [13] = an / 10 + 48; Calendar [9] = lună% 10 + 48; Calendar [8] = lună / 10 + 48; Calendar [6] = data% 10 + 48; Calendar [5] = data / 10 + 48; lcd.setCursor (0, 0); lcd.print (Timp); // Afișare timp lcd.setCursor (0, 1); lcd.print (Calendar); // Afișați calendarul} void blink_parameter () {octet j = 0; while (j 23) // Dacă ore> 23 ==> ore = 0 parametru = 0; if (i == 1 && parametru> 59) // If minutes> 59 ==> minutes = 0 parameter = 0; if (i == 2 && parametru> 31) // If date> 31 ==> date = 1 parametru = 1; if (i == 3 && parametru> 12) // If luna> 12 ==> luna = 1 parametru = 1; if (i == 4 && parametru> 99) // If year> 99 ==> year = 0 parametru = 0; sprintf (text, "% 02u", parametru); lcd.setCursor (x, y); lcd.print (text); întârziere (200); // Așteptați 200ms} lcd.setCursor (x, y); lcd.print (""); // Afișează două spații blink_parameter (); sprintf (text, "% 02u", parametru); lcd.setCursor (x, y); lcd.print (text); blink_parameter (); if (! digitalRead (8)) {// Dacă butonul (pinul # 8) este apăsat i ++; // Creșterea 'i' pentru următorul parametru returnează parametrul; // Întoarceți valoarea parametrului și ieșiți}}} void loop () {if (! DigitalRead (8)) {// Dacă butonul (pinul # 8) este apăsat i = 0; ora = editare (5, 0, oră); minut = editare (8, 0, minut); data = edit (5, 1, data); lună = editare (8, 1, lună); an = editare (13, 1, an); // Conversia zecimalului în minut BCD = ((minut / 10) << 4) + (minut% 10); ora = ((ora / 10) << 4) + (ora% 10); data = ((data / 10) << 4) + (data% 10); luna = ((luna / 10) << 4) + (luna% 10); year = ((year / 10) << 4) + (year% 10); // Încheie conversia // Scrie date în DS3231 RTC Wire.beginTransmission (0x68); // Porniți protocolul I2C cu adresa DS3231 Wire.write (0); // Trimiteți adresa de înregistrare Wire.write (0); // Resetați sesondele și porniți oscilatorul Wire.write (minut); // Scrie minut Wire.write (ora); // Scrie ora Wire.write (1); // Scrie ziua (nu se folosește) Wire.write (data); // Scrie data Wire.write (luna); // Scrie luna Wire.write (anul); // Scrie anul Wire.endTransmission (); // Opriți transmisia și eliberați întârzierea autobuzului I2C (200); // Așteptați 200ms} Wire.beginTransmission (0x68); // Porniți protocolul I2C cu adresa DS3231 Wire.write (0); // Trimiteți adresa de înregistrare Wire.endTransmission (fals); // I2C reporniți Wire.requestFrom (0x68, 7); // Solicitați 7 octeți de la DS3231 și eliberați magistrala I2C la sfârșitul citirii a doua = Wire.read (); // Citiți secunde din registru 0 minut = Wire.read (); // Citește minute din registru 1 oră = Wire.read (); // Citește ora din registrul 2 Wire.read (); // Citește ziua din registrul 3 (neutilizat) data = Wire.read (); // Data citirii din registru 4 luni = Wire.read (); // Citeste luna din registru 5 ani = Wire.read (); // Citiți anul din registrul 6 DS3231_display (); // Diaplay time & calendar delay (50); // Așteptați 50 ms}

Recomandat: