Turinys:

Laikrodis realiuoju laiku su „Arduino“: 3 žingsniai
Laikrodis realiuoju laiku su „Arduino“: 3 žingsniai

Video: Laikrodis realiuoju laiku su „Arduino“: 3 žingsniai

Video: Laikrodis realiuoju laiku su „Arduino“: 3 žingsniai
Video: Introduction to HT16K33 4 Digit LED Seven Segment Display with Arduino 2024, Liepa
Anonim
Laikrodis realiuoju laiku su „Arduino“
Laikrodis realiuoju laiku su „Arduino“

Šiame projekte mes pagaminsime laikrodį naudodami „Arduino“ir RTC modulius. Kaip žinome, „Arduino“negali rodyti tikrojo laiko, todėl mes naudosime RTC modulį, kad LCD ekrane būtų rodomas tinkamas laikas. Atidžiai perskaitykite visus žingsnius, tai labai padės jums sukurti laikrodžio rodyklę.

„DS3231 Arduino“kodas yra panašus į DS1307 kodą ir veikia su abiem RTC lustais.

Žemiau pateiktas „Arduino“kodas nenaudoja jokios DS3231 RTC bibliotekos, „Wire“biblioteka skirta „Arduino“ir DS3231 susirašinėjimui, naudojant I2C konvenciją.

Taip! Daugelis elektronikos inžinierių priklauso nuo to, kaip atlikti savo laiką, tačiau RTC nėra visiškai patikimas. Jis maitinamas baterijomis ir anksčiau ar vėliau turi būti pakeistas. Ateinant į daiktų interneto projektus, jis užima vertingus SPI (serijinės periferinės sąsajos) kaiščius ir netvarka, kai laidai susipainioja. Sprendimas…. Čia ateina mūsų herojus NTP (tinklo laiko protokolas). NTP yra toks tikslus, nes gauna laiko iš interneto. Šį protokolą naudosime kliento-serverio režimu. procesas yra toks paprastas, kad mūsų „Nodemcu“veikia kaip klientas ir prašo NTP paketo iš serverio naudojant UDP. Savo ruožtu serveris siunčia paketą klientui, kuris analizuoja duomenis. NTP yra universalus laiko sinchronizavimo protokolas. Dabar apšvieskime savo laboratorijos darbo vietą

1 žingsnis: reikalingi komponentai

  • „Arduino“lenta
  • DS3231 RTC plokštė
  • 16x2 LCD ekranas
  • 2 x mygtukas
  • 10K omų kintamasis rezistorius (arba potenciometras)
  • 330 omų rezistorius
  • 3 V monetų elementų baterija
  • Bandomoji Lenta
  • Jumperio laidai

RTC molekulė DS3231

Laikas yra esminis jausmas, reikalingas šiame sparčiai besivystančiame žmonių pasaulyje. Realaus laiko projekte

Mes naudojame RTC (A. K. A realaus laiko laikrodis)

RTC Real-time-clock (RTC) yra integruotas grandynas (IC), kuris stebi esamą laiką. RTC rūpinasi laiku realiuoju režimu. RTC paprastai randamas kompiuterių pagrindinėse plokštėse ir įterptosiose sistemose, kad būtų galima laiku pasiekti.

2 žingsnis: „Arduino“laikrodžio prijungimas

„Arduino“laikrodžio prijungimas
„Arduino“laikrodžio prijungimas
  • Prijunkite SCL kaištį prie RTC modulio prie „Arduino A5“
  • Prijunkite SDA kaištį prie RTC modulio prie „Arduino A4“
  • Prijunkite VCC prie 5v ir GND prie GND
  • Prijunkite mygtuką prie kaiščio 8
  • Prie kaiščio 9 prijunkite kitą mygtuką
  • Prijunkite LCD ekraną prie „Arduino“2 kaiščio
  • Prijunkite LCD ekraną prie „Arduino“3 kaiščio
  • Prijunkite LCD D7 prie „Arduino“7 kaiščio
  • Prijunkite LCD D6 prie „Arduino“6 kaiščio
  • Prijunkite LCD D5 prie „Arduino“5 kaiščio
  • Prijunkite LCD D4 prie „Arduino“4 kaiščio
  • Prijunkite VSS & K prie GND
  • Prijunkite VDD & A prie 5v
  • Prijunkite vo prie potenciometro išvesties kaiščio

3 žingsnis: „Arduino“laikrodžio su RTC kodas

„Arduino“laikrodžio su RTC kodas
„Arduino“laikrodžio su RTC kodas

DS3231 veikia tik su BCD formatu ir, norėdamas konvertuoti BCD į dešimtainį ir atvirkščiai, aš naudoju 2 toliau pateiktas eilutes (pavyzdžiui, minutę): // Konvertuoti BCD į dešimtainę minutę = (minutė >> 4) * 10 + (minutė ir 0x0F);

// Konvertuoti dešimtainį skaičių į BCDminute = ((minutė / 10) << 4) + (minutė % 10); void DS3231_display (): rodo laiką ir kalendorių, prieš tai rodant laiką ir kalendoriaus duomenis iš BCD konvertuojami į dešimtainį formatą. void blink_parameter ():

// Realaus laiko laikrodis ir kalendorius su nustatymo mygtukais naudojant DS3231 ir Arduino // įtraukti LCD bibliotekos kodą #include // įtraukti laidinės bibliotekos kodą (reikalingas I2C protokolo įrenginiams) #įtraukti // LCD modulio jungtys (RS, E, D4, D5, D6, D7) „LiquidCrystal lcd“(2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // mygtukas1 yra prijungtas prie 8 kaiščio pinMode (9, INPUT_PULLUP); // mygtukas2 prijungtas prie 9 kaiščio // nustatyti LCD stulpelių ir eilučių skaičių lcd.begin (16, 2); Wire.begin (); // Prisijungti prie i2c autobuso} char Time = "TIME:::"; char kalendorius = "DATE: / / 20"; baitas i, antra, minutė, valanda, data, mėnuo, metai; void DS3231_display () {// Konvertuoti BCD į dešimtainę sekundę = (antra >> 4) * 10 + (antra & 0x0F); minutė = (minutė >> 4) * 10 + (minutė ir 0x0F); valanda = (valanda >> 4) * 10 + (valanda ir 0x0F); data = (data >> 4) * 10 + (data & 0x0F); mėnuo = (mėnuo >> 4) * 10 + (mėnuo ir 0x0F); metai = (metai >> 4) * 10 + (metai ir 0x0F); // Pabaigos konversijos laikas [12] = antras % 10 + 48; Laikas [11] = sekundė / 10 + 48; Laikas [9] = minutė % 10 + 48; Laikas [8] = minutė / 10 + 48; Laikas [6] = valanda % 10 + 48; Laikas [5] = valanda / 10 + 48; Kalendorius [14] = metai % 10 + 48; Kalendorius [13] = metai / 10 + 48; Kalendorius [9] = mėnuo % 10 + 48; Kalendorius [8] = mėnuo / 10 + 48; Kalendorius [6] = data % 10 + 48; Kalendorius [5] = data / 10 + 48; lcd.setCursor (0, 0); lcd.print (laikas); // Rodymo laikas lcd.setCursor (0, 1); lcd.print (kalendorius); // Rodyti kalendorių} void blink_parameter () {baitas j = 0; while (j 23) // Jei valandos> 23 ==> valandos = 0 parametras = 0; if (i == 1 && parametras> 59) // Jei minutės> 59 ==> minutės = 0 parametras = 0; if (i == 2 && parametras> 31) // Jei data> 31 ==> data = 1 parametras = 1; if (i == 3 && parametras> 12) // Jei mėnuo> 12 ==> mėnuo = 1 parametras = 1; if (i == 4 && parametras> 99) // Jei metai> 99 ==> metai = 0 parametras = 0; sprintf (tekstas, "%02u", parametras); lcd.setCursor (x, y); lcd.print (tekstas); vėlavimas (200); // Palaukite 200 ms} lcd.setCursor (x, y); lcd.print (""); // Rodyti dvi erdves blink_parameter (); sprintf (tekstas, "%02u", parametras); lcd.setCursor (x, y); lcd.print (tekstas); blink_parameter (); if (! digitalRead (8)) {// Jei paspaustas mygtukas (kaištis #8) i ++; // Netinkamas kito parametro grąžinimo parametro „i“; // Grąžinti parametro vertę ir išeiti}}} void loop () {if (! DigitalRead (8)) {// Jei paspaudžiamas mygtukas (kaištis #8) i = 0; valanda = redaguoti (5, 0, valanda); minutė = redaguoti (8, 0, minutė); data = redaguoti (5, 1, data); mėnuo = redaguoti (8, 1, mėnuo); metai = redaguoti (13, 1, metai); // Konvertuoti dešimtainį skaičių į BCD minutę = ((minutė / 10) << 4) + (minutė % 10); valanda = ((valanda / 10) << 4) + (valanda % 10); data = ((data / 10) << 4) + (data % 10); mėnuo = ((mėnuo / 10) << 4) + (mėnuo % 10); metai = ((metai / 10) << 4) + (metai % 10); // Baigti konversiją // Rašyti duomenis į DS3231 RTC Wire.beginTransmission (0x68); // Pradėti I2C protokolą su DS3231 adresu Wire.write (0); // Siųsti registro adresą Wire.write (0); // Iš naujo nustatyti sesondus ir paleisti osciliatorių Wire.write (minutė); // Rašyti minutę Wire.write (valanda); // Rašyti valandą Wire.write (1); // Rašyti dieną (nenaudojama) Wire.write (data); // Rašyti datą Wire.write (mėnuo); // Rašyti mėnesį Wire.write (metai); // Rašyti metus Wire.endTransmission (); // Sustabdyti perdavimą ir atleisti I2C magistralės vėlavimą (200); // Palaukite 200 ms} Wire.beginTransmission (0x68); // Pradėti I2C protokolą su DS3231 adresu Wire.write (0); // Siųsti registro adresą Wire.endTransmission (false); // I2C paleisti Wire.requestFrom (0x68, 7); // Prašykite 7 baitų iš DS3231 ir atleiskite I2C magistralę skaitymo pabaigoje antra = Wire.read (); // Skaityti sekundes iš registro 0 minutė = Wire.read (); // Skaityti minutes iš registro 1 valanda = Wire.read (); // Skaitymo valanda iš registro 2 Wire.read (); // Skaitymo diena iš registro 3 (nenaudojama) data = Wire.read (); // Skaitymo data iš registro 4 mėn. = Wire.read (); // Skaityti mėnesį iš registro 5 metai = Wire.read (); // Skaityti metus iš registro 6 DS3231_display (); // Rodymo laikas ir kalendoriaus uždelsimas (50); // Palaukite 50 ms}

Rekomenduojamas: