Sadržaj:

Sat u stvarnom vremenu sa Arduinom: 3 koraka
Sat u stvarnom vremenu sa Arduinom: 3 koraka

Video: Sat u stvarnom vremenu sa Arduinom: 3 koraka

Video: Sat u stvarnom vremenu sa Arduinom: 3 koraka
Video: Дедушка не выдержал и дал ответ за Украинский флаг 2024, Juli
Anonim
Sat u realnom vremenu sa Arduinom
Sat u realnom vremenu sa Arduinom

U ovom projektu napravit ćemo sat uz pomoć Arduino i RTC modula. Kao što znamo, Arduino ne može prikazati stvarno vrijeme, pa ćemo koristiti RTC modul za prikazivanje pravog vremena na LCD -u. Pažljivo pročitajte sve korake, mnogo će vam pomoći da napravite sat.

Arduino kod DS3231 je sličan kodu DS1307 i radi s oba RTC čipa.

Arduino kôd ispod ne koristi nikakvu biblioteku za DS3231 RTC, biblioteka Wire služi za korespondenciju između Arduina i DS3231 koristeći I2C konvenciju.

Da! Mnogi inženjeri elektronike ovise o tome za svoje vremenski zasnovane projekte, ali RTC nije potpuno pouzdan. Radi na baterije i mora se zamijeniti uskoro ili kasnije. Dolazeći na IoT projekte, on zauzima vrijedne SPI (Serial Peripheral Interface) pinove i postaje neuredan sa žicama isprepletenim okolo. Rješenje …. Evo našeg heroja NTP (mrežni protokol vremena). NTP je toliko precizan jer dobiva vrijeme s interneta. Ovim protokolom ćemo upravljati koristeći način klijent-server. proces je toliko jednostavan da naš Nodemcu djeluje kao klijent i traži NTP paket od poslužitelja koristeći UDP. Zauzvrat, server šalje paket klijentu koji analizira podatke. NTP je univerzalni protokol za sinhronizaciju vremena. Osvijetlimo sada našu laboratorijsku radnu stanicu

Korak 1: Potrebne komponente

  • Arduino ploča
  • DS3231 RTC ploča
  • 16x2 LCD ekran
  • 2 x dugme
  • 10K ohm promjenjivi otpornik (ili potenciometar)
  • 330-ohmski otpornik
  • 3V dugmasta baterija
  • Breadboard
  • Žice za kratkospojnike

RTC mokula DS3231

Vrijeme je bitan osjećaj potreban u ovom brzom svijetu ljudskih bića. U projektu u realnom vremenu

Koristimo RTC (A. K. A sat u stvarnom vremenu)

RTC sat u realnom vremenu (RTC) je integrirano kolo (IC) koje prati trenutno vrijeme. RTC se brine o vremenu u stvarnom načinu rada. RTC se obično nalazi na računarskim matičnim pločama i ugrađenim sistemima kako bi zahtijevao pravovremeni pristup.

Korak 2: Povezivanje Arduino sata

Povezivanje Arduino sata
Povezivanje Arduino sata
  • Spojite SCL pin na RTC modul na Arduino A5
  • Spojite SDA pin na RTC modul na Arduino A4
  • Spojite VCC na 5v i GND na GND
  • Spojite dugme na pin 8
  • Spojite drugo dugme na iglu 9
  • Spojite RS LCD na pin 2 Arduina
  • Spojite E LCD -a na pin 3 Arduina
  • Spojite D7 LCD -a na pin 7 Arduina
  • Spojite D6 LCD -a na pin 6 Arduina
  • Spojite D5 LCD -a na pin 5 Arduina
  • Spojite D4 LCD -a na pin 4 Arduina
  • Spojite VSS & K na GND
  • Spojite VDD & A na 5v
  • Spojite vo na izlazni pin potenciometra

Korak 3: Kôd za Arduino sat sa RTC -om

Kôd za Arduino sat sa RTC -om
Kôd za Arduino sat sa RTC -om

DS3231 radi samo s BCD formatom i za pretvaranje BCD -a u decimalni i obratno, upotrijebio sam 2 retka ispod (primjer za minute): // Pretvorim BCD u decimalnu minutu = (minuta >> 4) * 10 + (minuta & 0x0F);

// Pretvorimo decimalni u BCDminute = ((minute / 10) << 4) + (minute % 10); void DS3231_display (): prikazuje vrijeme i kalendar, prije prikaza vremena i podaci kalendara se pretvaraju iz BCD u decimalni format. void blink_parameter ():

// Sat u stvarnom vremenu i kalendar sa postavljenim gumbima koristeći DS3231 i Arduino // uključuju kôd LCD biblioteke #include // uključuju kôd knjižnice žice (potrebno za uređaje s protokolom I2C) #include // veze LCD modula (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // button1 je spojen na pin 8 pinMode (9, INPUT_PULLUP); // button2 je spojen na pin 9 // postavlja LCD broj stupaca i redova lcd.begin (16, 2); Wire.begin (); // Pridruži se i2c sabirnici} char Time = "TIME:::"; char Calendar = "DATUM: / / 20"; bajt i, drugi, minut, sat, datum, mjesec, godina; void DS3231_display () {// Pretvori BCD u decimalnu sekundu = (druga >> 4) * 10 + (druga & 0x0F); minuta = (minuta >> 4) * 10 + (minuta & 0x0F); sat = (sat >> 4) * 10 + (sat & 0x0F); date = (datum >> 4) * 10 + (datum & 0x0F); mjesec = (mjesec >> 4) * 10 + (mjesec & 0x0F); godina = (godina >> 4) * 10 + (godina & 0x0F); // Vrijeme konverzije na kraju [12] = drugi % 10 + 48; Vrijeme [11] = drugo / 10 + 48; Vrijeme [9] = minut % 10 + 48; Vrijeme [8] = minuta / 10 + 48; Vrijeme [6] = sat % 10 + 48; Vrijeme [5] = sat / 10 + 48; Kalendar [14] = godina % 10 + 48; Kalendar [13] = godina / 10 + 48; Kalendar [9] = mjesec % 10 + 48; Kalendar [8] = mjesec / 10 + 48; Kalendar [6] = datum % 10 + 48; Kalendar [5] = datum / 10 + 48; lcd.setCursor (0, 0); lcd.print (vrijeme); // Vrijeme prikaza lcd.setCursor (0, 1); lcd.print (Kalendar); // Prikaz kalendara} void blink_parameter () {bajt j = 0; while (j 23) // Ako su sati> 23 ==> sati = 0 parametar = 0; if (i == 1 && parameter> 59) // Ako minute> 59 ==> minute = 0 parametar = 0; if (i == 2 && parametar> 31) // Ako je datum> 31 ==> datum = 1 parametar = 1; if (i == 3 && parametar> 12) // Ako je mjesec> 12 ==> mjesec = 1 parametar = 1; if (i == 4 && parametar> 99) // Ako je godina> 99 ==> godina = 0 parametar = 0; sprintf (tekst, "%02u", parametar); lcd.setCursor (x, y); lcd.print (tekst); kašnjenje (200); // Pričekajte 200 ms} lcd.setCursor (x, y); lcd.print (""); // Prikaz dva razmaka blink_parameter (); sprintf (tekst, "%02u", parametar); lcd.setCursor (x, y); lcd.print (tekst); blink_parameter (); if (! digitalRead (8)) {// Ako je pritisnuto dugme (pin #8) i ++; // Povećanje 'i' za sljedeći parametar vraćanja parametra; // Vrati vrijednost parametra i izađi}}} void loop () {if (! DigitalRead (8)) {// Ako je pritisnuto dugme (pin #8) i = 0; sat = uredi (5, 0, sat); minuta = uređivanje (8, 0, minuta); datum = uredi (5, 1, datum); mjesec = uredi (8, 1, mjesec); godina = uredi (13, 1, godina); // Pretvorimo decimalu u BCD minute = ((minute / 10) << 4) + (minute % 10); sat = ((sat / 10) << 4) + (sat % 10); datum = ((datum / 10) << 4) + (datum % 10); mjesec = ((mjesec / 10) << 4) + (mjesec % 10); godina = ((godina / 10) << 4) + (godina % 10); // Završetak konverzije // Zapisivanje podataka na DS3231 RTC Wire.beginTransmission (0x68); // Pokretanje I2C protokola s DS3231 adresom Wire.write (0); // Pošaljite adresu registra Wire.write (0); // Resetiraj sesondove i pokreni oscilator Wire.write (minuta); // Zapisivanje minute Wire.write (sat); // Zapisati sat Wire.write (1); // Upiši dan (ne koristi se) Wire.write (datum); // Upišite datum Wire.write (mjesec); // Napiši mjesec Wire.write (godina); // Napišite godinu Wire.endTransmission (); // Zaustavljanje prijenosa i otpuštanje kašnjenja sabirnice I2C (200); // Pričekajte 200 ms} Wire.beginTransmission (0x68); // Pokretanje I2C protokola s DS3231 adresom Wire.write (0); // Pošaljite adresu registra Wire.endTransmission (false); // I2C ponovno pokretanje Wire.requestFrom (0x68, 7); // Zatražite 7 bajtova od DS3231 i otpustite I2C sabirnicu na kraju drugog čitanja = Wire.read (); // Očitavanje sekundi iz registra 0 minuta = Wire.read (); // Čitanje minuta iz registra 1 sat = Wire.read (); // Očitavanje sata iz registra 2 Wire.read (); // Očitavanje dana iz registra 3 (ne koristi se) date = Wire.read (); // Čitanje datuma iz registra 4 mjeseca = Wire.read (); // Očitavanje mjeseca iz registra 5 godina = Wire.read (); // Očitavanje godine iz registra 6 DS3231_display (); // Vrijeme reprodukcije i kašnjenje kalendara (50); // Sačekajte 50 ms}

Preporučuje se: