Satura rādītājs:

Reālā laika pulkstenis ar Arduino: 3 soļi
Reālā laika pulkstenis ar Arduino: 3 soļi

Video: Reālā laika pulkstenis ar Arduino: 3 soļi

Video: Reālā laika pulkstenis ar Arduino: 3 soļi
Video: VL53L1X Лазерный дистанционный датчик времени полета 400 см 2024, Novembris
Anonim
Reālā laika pulkstenis ar Arduino
Reālā laika pulkstenis ar Arduino

Šajā projektā mēs izgatavosim pulksteni ar Arduino un RTC moduļa palīdzību. Kā mēs zinām, Arduino nevar parādīt faktisko laiku, tāpēc mēs izmantosim RTC moduli, lai parādītu pareizo laiku LCD. Uzmanīgi izlasiet visu soli, tas jums ļoti palīdzēs izveidot pulksteņrādītāju.

DS3231 Arduino kods ir līdzīgs DS1307 kodam, un tas darbojas ar abām RTC mikroshēmām.

Zemāk esošais Arduino kods neizmanto DS3231 RTC bibliotēku, Wire bibliotēka ir paredzēta korespondencei starp Arduino un DS3231, izmantojot I2C konvenciju.

Jā! Daudzi elektronikas inženieri ir atkarīgi no saviem laika projektiem, taču RTC nav pilnīgi uzticams. Tas darbojas ar akumulatoru, un agrāk vai vēlāk tas ir jānomaina. Sākot ar IoT projektiem, tas aizņem vērtīgas SPI (seriālās perifērijas saskarnes) tapas un kļūst netīrs, jo vadi ir sapinušies. Risinājums…. Šeit nāk mūsu varonis NTP (tīkla laika protokols). NTP ir tik precīzs, jo iegūst laiku no interneta. Mēs izmantosim šo protokolu, izmantojot klienta-servera režīmu. process ir tik vienkāršs, ka mūsu Nodemcu darbojas kā klients un pieprasa NTP paketi no servera, izmantojot UDP. Savukārt serveris nosūta klientam paketi, kas analizē datus. NTP ir universāls laika sinhronizācijas protokols. Tagad iedegsim laboratorijas darba staciju

1. darbība. Nepieciešamās sastāvdaļas

  • Arduino dēlis
  • DS3231 RTC plate
  • 16x2 LCD ekrāns
  • 2 x spiedpoga
  • 10K omu mainīgs rezistors (vai potenciometrs)
  • 330 omu rezistors
  • 3V monētu šūnu baterija
  • Maizes dēlis
  • Jumper vadi

RTC molekula DS3231

Laiks ir būtiska sajūta, kas nepieciešama šajā straujajā cilvēku pasaulē. Reāllaika projektā

Mēs izmantojam RTC (A. K. A reālā laika pulkstenis)

RTC reālā laika pulkstenis (RTC) ir integrēta shēma (IC), kas seko pašreizējam laikam. RTC rūpējas par laiku reālajā režīmā. RTC parasti ir atrodams datoru mātesplatēs un iegultās sistēmās, lai tām būtu nepieciešama savlaicīga piekļuve.

2. darbība: Arduino pulksteņa savienošana

Arduino pulksteņa savienojums
Arduino pulksteņa savienojums
  • Pievienojiet SCL tapu RTC modulim Arduino A5
  • Pievienojiet SDA tapu RTC modulim Arduino A4
  • Savienojiet VCC ar 5v un GND uz GND
  • Pievienojiet spiedpogu tapai 8
  • Pievienojiet taustiņam 9 citu pogu
  • Savienojiet LCD RS ar Arduino 2. tapu
  • Savienojiet LCD E ar Arduino 3. tapu
  • Savienojiet LCD D7 ar Arduino 7. tapu
  • Savienojiet LCD D6 ar Arduino 6. tapu
  • Savienojiet LCD D5 ar Arduino 5. tapu
  • Savienojiet LCD D4 ar Arduino 4. tapu
  • Savienojiet VSS & K ar GND
  • Savienojiet VDD & A ar 5v
  • Pievienojiet vo potenciometra izejas tapai

3. darbība: kods Arduino pulkstenim ar RTC

Arduino pulksteņa kods ar RTC
Arduino pulksteņa kods ar RTC

DS3231 darbojas tikai ar BCD formātu, un, lai pārvērstu BCD par decimāldaļu un otrādi, es izmantoju divas tālāk norādītās rindiņas (piemēram, minūtes): // Konvertēt BCD uz decimālminūti = (minūte >> 4) * 10 + (minūte un 0x0F);

// Pārvērst decimālo uz BCDminute = ((minūte / 10) << 4) + (minūte % 10); void DS3231_display (): parāda laiku un kalendāru, pirms tiek parādīti laika un kalendāra dati no BCD uz decimāldaļu formātu. void blink_parameter ():

// Reālā laika pulkstenis un kalendārs ar iestatīšanas pogām, izmantojot DS3231 un Arduino // iekļaujiet LCD bibliotēkas kodu #include // iekļaujiet vadu bibliotēkas kodu (nepieciešams I2C protokola ierīcēm) #iekļaut // LCD moduļu savienojumus (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // poga1 ir savienota ar tapu 8 pinMode (9, INPUT_PULLUP); // poga2 ir savienota ar tapu 9 // iestatiet LCD kolonnu un rindu skaitu lcd.begin (16, 2); Wire.begin (); // Join i2c bus} char Time = "TIME:::"; char kalendārs = "DATE: / / 20"; baits i, otrais, minūte, stunda, datums, mēnesis, gads; void DS3231_display () {// Pārvērst BCD par decimālo sekundi = (otrais >> 4) * 10 + (otrais & 0x0F); minūte = (minūte >> 4) * 10 + (minūte & 0x0F); stunda = (stunda >> 4) * 10 + (stunda un 0x0F); datums = (datums >> 4) * 10 + (datums & 0x0F); mēnesis = (mēnesis >> 4) * 10 + (mēnesis un 0x0F); gads = (gads >> 4) * 10 + (gads un 0x0F); // Reklāmguvuma beigu laiks [12] = otrais % 10 + 48; Laiks [11] = sekunde / 10 + 48; Laiks [9] = minūte % 10 + 48; Laiks [8] = minūte / 10 + 48; Laiks [6] = stunda % 10 + 48; Laiks [5] = stunda / 10 + 48; Kalendārs [14] = gads % 10 + 48; Kalendārs [13] = gads / 10 + 48; Kalendārs [9] = mēnesis % 10 + 48; Kalendārs [8] = mēnesis / 10 + 48; Kalendārs [6] = datums % 10 + 48; Kalendārs [5] = datums / 10 + 48; lcd.setCursor (0, 0); lcd.print (laiks); // Displeja laiks lcd.setCursor (0, 1); lcd.print (kalendārs); // Parādīt kalendāru} void blink_parameter () {baits j = 0; while (j 23) // Ja stundas> 23 ==> stundas = 0 parametrs = 0; ja (i == 1 && parametrs> 59) // Ja minūtes> 59 ==> minūtes = 0 parametrs = 0; ja (i == 2 && parametrs> 31) // Ja datums> 31 ==> datums = 1 parametrs = 1; ja (i == 3 && parametrs> 12) // Ja mēnesis> 12 ==> mēnesis = 1 parametrs = 1; ja (i == 4 && parametrs> 99) // Ja gads> 99 ==> gads = 0 parametrs = 0; sprintf (teksts, "%02u", parametrs); lcd.setCursor (x, y); lcd.print (teksts); kavēšanās (200); // Pagaidiet 200 ms} lcd.setCursor (x, y); lcd.print (""); // Parādīt divas atstarpes blink_parameter (); sprintf (teksts, "%02u", parametrs); lcd.setCursor (x, y); lcd.print (teksts); mirgot_parametrs (); ja (! digitalRead (8)) {// Ja tiek nospiesta poga (pin #8) i ++; // nepareizs “i” nākamajam parametra atgriešanās parametram; // Atgriezt parametra vērtību un iziet}}} void loop () {if (! DigitalRead (8)) {// Ja tiek nospiesta poga (pin #8) i = 0; stunda = rediģēt (5, 0, stunda); minūte = rediģēt (8, 0, minūte); datums = rediģēt (5, 1, datums); mēnesis = rediģēt (8, 1, mēnesis); gads = rediģēt (13, 1, gads); // Pārvērst decimāldaļu uz BCD minūti = ((minūte / 10) << 4) + (minūte % 10); stunda = ((stunda / 10) << 4) + (stunda % 10); datums = ((datums / 10) << 4) + (datums % 10); mēnesis = ((mēnesis / 10) << 4) + (mēnesis % 10); gads = ((gads / 10) << 4) + (gads % 10); // Beigt konvertēšanu // Rakstīt datus uz DS3231 RTC Wire.beginTransmission (0x68); // Sākt I2C protokolu ar DS3231 adresi Wire.write (0); // Sūtīt reģistra adresi Wire.write (0); // Atiestatīt sesondus un sākt oscilatoru Wire.write (minūte); // Rakstīt minūtes Wire.write (stunda); // Rakstīt stundu Wire.write (1); // Rakstīt dienu (neizmanto) Wire.write (datums); // Rakstīt datumu Wire.write (mēnesis); // Rakstīt mēnesi Wire.write (gads); // Uzrakstiet gadu Wire.endTransmission (); // Apturiet pārraidi un atlaidiet I2C kopnes aizturi (200); // Pagaidiet 200 ms} Wire.beginTransmission (0x68); // Sākt I2C protokolu ar DS3231 adresi Wire.write (0); // Sūtīt reģistra adresi Wire.endTransmission (false); // I2C restart Wire.requestFrom (0x68, 7); // Pieprasīt 7 baitus no DS3231 un atbrīvot I2C kopni lasīšanas beigās otrais = Wire.read (); // Lasīt sekundes no reģistra 0 minūte = Wire.read (); // Lasīt minūtes no reģistra 1 stunda = Wire.read (); // Lasīšanas stunda no reģistra 2 Wire.read (); // Lasīšanas diena no reģistra 3 (netiek izmantota) datums = Wire.read (); // Lasīšanas datums no reģistra 4 mēneši = Wire.read (); // Lasīt mēnesi no reģistra 5 gads = Wire.read (); // Lasīt gadu no reģistra 6 DS3231_display (); // Displeja laiks un kalendāra aizkave (50); // Pagaidiet 50 ms}

Ieteicams: