Sisällysluettelo:

Reaaliaikainen kello Arduinolla: 3 vaihetta
Reaaliaikainen kello Arduinolla: 3 vaihetta

Video: Reaaliaikainen kello Arduinolla: 3 vaihetta

Video: Reaaliaikainen kello Arduinolla: 3 vaihetta
Video: Reaaliaikaiset junatiedot Arduino Unon ja NodeJS-palvelimen avulla 2024, Heinäkuu
Anonim
Reaaliaikainen kello Arduinon kanssa
Reaaliaikainen kello Arduinon kanssa

Tässä projektissa teemme kellon Arduino- ja RTC -moduulin avulla. Kuten tiedämme, Arduino ei voi näyttää todellista aikaa, joten käytämme RTC -moduulia oikean ajan näyttämiseen nestekidenäytössä. Lue kaikki vaiheet huolellisesti, se auttaa sinua paljon tekemään kellokoneiston.

DS3231 Arduino -koodi on kuin DS1307 -koodi ja se toimii molempien RTC -sirujen kanssa.

Alla oleva Arduino -koodi ei käytä mitään kirjastoa DS3231 RTC: lle, Wire -kirjasto on tarkoitettu Arduinon ja DS3231: n väliselle kirjeenvaihdolle I2C -sopimuksen mukaisesti.

Joo! Monet elektroniikkainsinöörit ovat riippuvaisia siitä aikapohjaisissa projekteissaan, mutta RTC ei ole täysin luotettava. Se toimii paristolla ja se on vaihdettava ennemmin tai myöhemmin. IoT -projekteissa se käyttää arvokkaita SPI -sarjoja (Serial Peripheral Interface) ja sotkeutuu, kun johdot ovat sotkeutuneet. Ratkaisu… Tässä on sankarimme NTP (Network Time Protocol). NTP on niin tarkka, koska se saa aikaa Internetistä. Aiomme käyttää tätä protokollaa asiakas-palvelin-tilassa. prosessi on niin yksinkertainen, että Nodemcu toimii asiakkaana ja pyytää NTP -paketin palvelimelta UDP: tä käyttäen. Vastineeksi palvelin lähettää paketin asiakkaalle, joka jäsentää tiedot. NTP on universaali ajan synkronointiprotokolla. Valaistetaan nyt laboratoriomme työpiste

Vaihe 1: Tarvittavat komponentit

  • Arduino -levy
  • DS3231 RTC -kortti
  • 16x2 LCD -näyttö
  • 2 x painike
  • 10K ohmin muuttuva vastus (tai potentiometri)
  • 330 ohmin vastus
  • 3V nappiparisto
  • Leipälauta
  • Hyppyjohdot

RTC -molekyyli DS3231

Aika on olennainen tunne, jota vaaditaan tässä nopeatempoisessa ihmismaailmassa. Reaaliaikaisessa projektissa

Käytämme RTC: tä (A. K. A Real-time clock)

RTC Real-time-clock (RTC) on integroitu piiri (IC), joka seuraa nykyistä aikaa. RTC löytyy yleensä tietokoneen emolevyistä ja sulautetuista järjestelmistä, jotka vaativat ajoissa pääsyä.

Vaihe 2: Arduino -kellon liittäminen

Arduino -kellon liitäntä
Arduino -kellon liitäntä
  • Liitä SCL -nasta RTC -moduuliin Arduino A5: een
  • Liitä SDA -nasta RTC -moduuliin Arduino A4 -laitteeseen
  • Kytke VCC 5V ja GND GND
  • Kytke painike tappiin 8
  • Liitä toinen painike tappiin 9
  • Liitä nestekidenäytön RS Arduinon nastaan 2
  • Liitä nestekidenäytön E Arduinon nastaan 3
  • Liitä nestekidenäytön D7 Arduinon nastaan 7
  • Liitä nestekidenäytön D6 Arduinon nastaan 6
  • Liitä nestekidenäytön D5 Arduinon nastaan 5
  • Liitä nestekidenäytön D4 Arduinon nastaan 4
  • Liitä VSS & K GND: hen
  • Kytke VDD & A 5 V: iin
  • Liitä vo potentiometrin ulostulonappiin

Vaihe 3: Arduino -kellon koodi RTC: llä

Arduino -kellon koodi RTC: llä
Arduino -kellon koodi RTC: llä

DS3231 toimii vain BCD -muodossa ja muuntaaksesi BCD: n desimaaliksi ja päinvastoin, käytin alla olevia 2 riviä (esimerkki minuutista): // Muunna BCD desimaaliminuutiksi = (minuutti >> 4) * 10 + (minuutti & 0x0F);

// Muunna desimaali BCDminute = ((minuutti / 10) << 4) + (minuutti % 10); void DS3231_display (): näyttää ajan ja kalenterin, ennen kuin näyttöaika ja kalenteritiedot muunnetaan BCD: stä desimaalimuotoon. void blink_parameter ():

// Reaaliaikainen kello ja kalenteri asetuspainikkeilla käyttäen DS3231: tä ja Arduinoa // sisällytä LCD -kirjaston koodi #include // sisälly langallisen kirjaston koodi (tarvitaan I2C -protokollalaitteisiin) #sisällytä // LCD -moduuliliitännät (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // painike1 on kytketty nastaan 8 pinMode (9, INPUT_PULLUP); // painike2 on kytketty nastaan 9 // LCD -näytön sarakkeiden ja rivien määrän asettaminen lcd.begin (16, 2); Wire.begin (); // Liity i2c -väylään} char Time = "TIME:::"; char -kalenteri = "DATE: / / 20"; tavu i, toinen, minuutti, tunti, päivämäärä, kuukausi, vuosi; void DS3231_display () {// Muunna BCD desimaalisekundiksi = (toinen >> 4) * 10 + (toinen & 0x0F); minuutti = (minuutti >> 4) * 10 + (minuutti & 0x0F); tunti = (tunti >> 4) * 10 + (tunti & 0x0F); päivämäärä = (päivämäärä >> 4) * 10 + (päivämäärä & 0x0F); kuukausi = (kuukausi >> 4) * 10 + (kuukausi & 0x0F); vuosi = (vuosi >> 4) * 10 + (vuosi & 0x0F); // Lopetusaika [12] = toinen % 10 + 48; Aika [11] = sekunti / 10 + 48; Aika [9] = minuutti % 10 + 48; Aika [8] = minuutti / 10 + 48; Aika [6] = tunti % 10 + 48; Aika [5] = tunti / 10 + 48; Kalenteri [14] = vuosi % 10 + 48; Kalenteri [13] = vuosi / 10 + 48; Kalenteri [9] = kuukausi % 10 + 48; Kalenteri [8] = kuukausi / 10 + 48; Kalenteri [6] = päivämäärä % 10 + 48; Kalenteri [5] = päivämäärä / 10 + 48; lcd.setCursor (0, 0); lcd.print (aika); // Näyttöaika lcd.setCursor (0, 1); lcd.print (kalenteri); // Näytä kalenteri} void blink_parameter () {tavu j = 0; while (j 23) // Jos tuntia> 23 ==> tuntia = 0 parametri = 0; if (i == 1 && parametri> 59) // Jos minuutit> 59 ==> minuutit = 0 parametri = 0; if (i == 2 && parametri> 31) // Jos päivämäärä> 31 ==> päivämäärä = 1 parametri = 1; if (i == 3 && parametri> 12) // Jos kuukausi> 12 ==> kuukausi = 1 parametri = 1; if (i == 4 && parametri> 99) // Jos vuosi> 99 ==> vuosi = 0 parametri = 0; sprintf (teksti, "%02u", parametri); lcd.setCursor (x, y); lcd.print (teksti); viive (200); // Odota 200 ms} lcd.setCursor (x, y); lcd.print (""); // Näytä kaksi välilyöntiä blink_parameter (); sprintf (teksti, "%02u", parametri); lcd.setCursor (x, y); lcd.print (teksti); blink_parameter (); if (! digitalRead (8)) {// Jos painiketta (nasta #8) painetaan i ++; // Virheellinen 'i' seuraavan parametrin palautusparametrille; // Palauta parametrin arvo ja poistu}}} void loop () {if (! DigitalRead (8)) {// Jos painiketta (nasta #8) painetaan i = 0; tunti = muokkaa (5, 0, tunti); minuutti = muokkaa (8, 0, minuutti); päivämäärä = muokkaa (5, 1, päivämäärä); kuukausi = muokkaa (8, 1, kuukausi); vuosi = muokkaa (13, 1, vuosi); // Muunna desimaali BCD minuutiksi = ((minuutti / 10) << 4) + (minuutti % 10); tunti = ((tunti / 10) << 4) + (tunti % 10); päivämäärä = ((päivämäärä / 10) << 4) + (päivämäärä % 10); kuukausi = ((kuukausi / 10) << 4) + (kuukausi % 10); vuosi = ((vuosi / 10) << 4) + (vuosi % 10); // Lopeta muuntaminen // Kirjoita tiedot DS3231 RTC Wire -järjestelmään. AlkuTransmission (0x68); // Käynnistä I2C -protokolla DS3231 -osoitteella Wire.write (0); // Lähetä rekisteriosoite Wire.write (0); // Nollaa sesondit ja käynnistä oskillaattori Wire.write (minuutti); // Kirjoita minuutti Wire.write (tunti); // Kirjoita tunti Wire.write (1); // Kirjoita päivä (ei käytössä) Wire.write (päivämäärä); // Kirjoita päivämäärä Wire.write (kuukausi); // Kirjoita kuukausi Wire.write (vuosi); // Kirjoita vuosi Wire.endTransmission (); // Pysäytä lähetys ja vapauta I2C -väylän viive (200); // Odota 200 ms} Wire.beginTransmission (0x68); // Käynnistä I2C -protokolla DS3231 -osoitteella Wire.write (0); // Lähetä rekisteriosoite Wire.endTransmission (false); // I2C käynnistä uudelleen Wire.requestFrom (0x68, 7); // Pyydä 7 tavua DS3231: ltä ja vapauta I2C -väylä lukemisen lopussa toinen = Wire.read (); // Lue sekuntia rekisteristä 0 minuutti = Wire.read (); // Lue minuutit rekisteristä 1 tunti = Wire.read (); // Lukuaika rekisteristä 2 Wire.read (); // Lukupäivä rekisteristä 3 (ei käytössä) päivämäärä = Wire.read (); // Lukupäivä rekisteristä 4 kuukautta = Wire.read (); // Lue kuukausi rekisteristä 5 vuosi = Wire.read (); // Lue vuosi rekisteristä 6 DS3231_display (); // Näyttöaika ja kalenteriviive (50); // Odota 50 ms}

Suositeltava: