Rellotge en temps real amb Arduino: 3 passos
Rellotge en temps real amb Arduino: 3 passos
Anonim
Rellotge en temps real amb Arduino
Rellotge en temps real amb Arduino

En aquest projecte, crearem un rellotge amb l’ajut del mòdul Arduino i RTC. Com sabem, l'Arduino no pot mostrar l'hora real, de manera que farem servir el mòdul RTC per mostrar l'hora adequada a la pantalla LCD. Llegiu atentament tot el pas, us ajudarà molt a fer el rellotge.

El codi Arduino DS3231 és com el codi DS1307 i funciona amb els dos xips RTC.

El codi Arduino que hi ha a sota no utilitza cap biblioteca per al DS3231 RTC, la biblioteca Wire serveix per a la correspondència entre l'Arduino i el DS3231 mitjançant la convenció I2C.

Sí! Molts enginyers electrònics en depenen per als seus projectes basats en el temps, però RTC no és completament fiable. Funciona amb bateria i s’ha de canviar aviat o després. Arribant a projectes IoT, ocupa valuosos pins SPI (Serial Peripheral Interface) i s’embolica amb cables enredats. Solució … Aquí arriba el nostre heroi NTP (Network time protocol). El NTP és tan precís ja que obté temps d’Internet. Operarem aquest protocol mitjançant un mode client-servidor. el procés és tan senzill que el nostre Nodemcu actua com a client i sol·licita un paquet NTP al servidor mitjançant UDP. A canvi, el servidor envia un paquet al client que analitza les dades. NTP és el protocol universal de sincronització horària. Ara il·luminem la nostra estació de treball dels laboratoris

Pas 1: components necessaris

  • Taula Arduino
  • Taula RTC DS3231
  • Pantalla LCD de 16x2
  • 2 x polsador
  • Resistència variable (o potenciòmetre) de 10 K ohmis
  • Resistència de 330 ohms
  • Bateria mòbil de 3V
  • Taula de pa
  • Filferros de pont

Mocula RTC DS3231

El temps és un sentit essencial que es requereix en aquest trepidant món dels éssers humans. Projecte en temps real

Utilitzem RTC (A. K. A rellotge en temps real)

RTC Real-time-clock (RTC) és un circuit integrat (IC) que fa un seguiment de l’hora actual. RTC s’encarrega del temps en mode real. El RTC sol trobar-se a les plaques base dels ordinadors i als sistemes incrustats per requerir un accés oportú.

Pas 2: connexió del rellotge Arduino

Connexió del rellotge Arduino
Connexió del rellotge Arduino
  • Connecteu el pin SCL al mòdul RTC a l'Arduino A5
  • Connecteu el pin SDA al mòdul RTC a l'Arduino A4
  • Connecteu VCC a 5v i GND a GND
  • Connecteu un polsador al passador 8
  • Connecteu un altre polsador al passador 9
  • Connecteu RS de pantalla LCD al pin 2 d'Arduino
  • Connecteu l'E de la pantalla LCD al pin 3 d'Arduino
  • Connecteu D7 de la pantalla LCD al pin 7 d'Arduino
  • Connecteu D6 de la pantalla LCD al pin 6 d'Arduino
  • Connecteu D5 de la pantalla LCD al pin 5 d'Arduino
  • Connecteu D4 de la pantalla LCD al pin 4 d'Arduino
  • Connecteu VSS & K a GND
  • Connecteu VDD & A al 5v
  • Connecteu vo al pin de sortida del potenciòmetre

Pas 3: Codi del rellotge Arduino amb RTC

Codi per al rellotge Arduino amb RTC
Codi per al rellotge Arduino amb RTC

El DS3231 només funciona amb format BCD i per convertir el BCD en decimal i viceversa he utilitzat les 2 línies següents (exemple per minut): // Converteix BCD en decimalminut = (minut >> 4) * 10 + (minut i 0x0F);

// Converteix decimal a BCDminute = ((minut / 10) << 4) + (minut% 10); void DS3231_display (): mostra l'hora i el calendari, abans de mostrar l'hora i les dades del calendari es converteixen de BCD a format decimal. void blink_parameter ():

// Rellotge i calendari en temps real amb botons ajustats que fan servir DS3231 i Arduino // inclouen el codi de biblioteca LCD #include // inclouen el codi de biblioteca de filferro (necessari per a dispositius de protocol I2C) #include // Connexions del mòdul LCD (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // el botó1 està connectat al pin 8 pinMode (9, INPUT_PULLUP); // el botó2 està connectat al pin 9 // configureu el nombre de columnes i files de la pantalla LCD lcd.begin (16, 2); Wire.begin (); // Uneix-te al bus i2c} char Time = "HORA:::"; char Calendar = "DATA: / / 20"; byte i, segon, minut, hora, data, mes, any; void DS3231_display () {// Converteix BCD en segon decimal = (segon >> 4) * 10 + (segon i 0x0F); minut = (minut >> 4) * 10 + (minut & 0x0F); hora = (hora >> 4) * 10 + (hora & 0x0F); data = (data >> 4) * 10 + (data & 0x0F); mes = (mes >> 4) * 10 + (mes i 0x0F); any = (any >> 4) * 10 + (any & 0x0F); // Temps de conversió final [12] = segon% 10 + 48; Temps [11] = segon / 10 + 48; Temps [9] = minut% 10 + 48; Temps [8] = minut / 10 + 48; Temps [6] = hora% 10 + 48; Temps [5] = hora / 10 + 48; Calendari [14] = any% 10 + 48; Calendari [13] = any / 10 + 48; Calendari [9] = mes% 10 + 48; Calendari [8] = mes / 10 + 48; Calendari [6] = data% 10 + 48; Calendari [5] = data / 10 + 48; lcd.setCursor (0, 0); lcd.print (Temps); // Temps de visualització lcd.setCursor (0, 1); lcd.print (calendari); // Mostra el calendari} void blink_parameter () {byte j = 0; while (j 23) // Si hores> 23 ==> hores = 0 paràmetre = 0; if (i == 1 && paràmetre> 59) // If minutes> 59 ==> minutes = 0 parameter = 0; if (i == 2 && paràmetre> 31) // If date> 31 ==> date = 1 parameter = 1; if (i == 3 && paràmetre> 12) // Si mes> 12 ==> mes = 1 paràmetre = 1; if (i == 4 && paràmetre> 99) // Si any> 99 ==> any = 0 paràmetre = 0; sprintf (text, "% 02u", paràmetre); lcd.setCursor (x, y); lcd.print (text); retard (200); // Espereu 200 ms} lcd.setCursor (x, y); lcd.print (""); // Mostra dos espais blink_parameter (); sprintf (text, "% 02u", paràmetre); lcd.setCursor (x, y); lcd.print (text); blink_parameter (); if (! digitalRead (8)) {// Si es prem el botó (pin # 8) i ++; // Increment "i" per al següent paràmetre de retorn; // Torna el valor del paràmetre i surt}}} void loop () {if (! DigitalRead (8)) {// Si es prem el botó (pin # 8) i = 0; hora = edició (5, 0, hora); minut = edició (8, 0, minut); data = edició (5, 1, data); mes = edició (8, 1, mes); any = edició (13, 1, any); // Converteix decimal a minut BCD = ((minut / 10) << 4) + (minut% 10); hora = ((hora / 10) << 4) + (hora% 10); data = ((data / 10) << 4) + (data% 10); mes = ((mes / 10) << 4) + (mes% 10); any = ((any / 10) << 4) + (any% 10); // Finalitzar la conversió // Escriure dades a DS3231 RTC Wire.beginTransmission (0x68); // Inicieu el protocol I2C amb l'adreça DS3231 Wire.write (0); // Enviar adreça de registre Wire.write (0); // Restableix les seccions i engega l'oscil·lador Wire.write (minut); // Escriu minut Wire.write (hora); // Escriu l’hora Wire.write (1); // Escriure dia (no s’utilitza) Wire.write (data); // Escriu la data Wire.write (mes); // Escriu mes Wire.write (any); // Escriure any Wire.endTransmission (); // Atureu la transmissió i deixeu anar el retard del bus I2C (200); // Espera 200 ms} Wire.beginTransmission (0x68); // Inicieu el protocol I2C amb l'adreça DS3231 Wire.write (0); // Enviar adreça de registre Wire.endTransmission (fals); // I2C reiniciar Wire.requestFrom (0x68, 7); // Sol·liciteu 7 bytes de DS3231 i deixeu anar el bus I2C al final de la lectura de segon = Wire.read (); // Llegir segons del registre 0 minut = Wire.read (); // Llegir minuts del registre 1 hora = Wire.read (); // Llegiu l’hora del registre 2 Wire.read (); // Dia de lectura del registre 3 (no utilitzat) data = Wire.read (); // Data de lectura del registre 4 mesos = Wire.read (); // Llegir el mes des del registre 5 anys = Wire.read (); // Llegiu l'any des del registre 6 DS3231_display (); // Temps de diaplay i retard del calendari (50); // Espera 50 ms}

Recomanat: