Talaan ng mga Nilalaman:

Oras ng Oras Tunay Na May Arduino: 3 Mga Hakbang
Oras ng Oras Tunay Na May Arduino: 3 Mga Hakbang

Video: Oras ng Oras Tunay Na May Arduino: 3 Mga Hakbang

Video: Oras ng Oras Tunay Na May Arduino: 3 Mga Hakbang
Video: Ipinaliwanag ang function ng Arduino Millis na may 3 halimbawa 2024, Hulyo
Anonim
Real Time Clock Sa Arduino
Real Time Clock Sa Arduino

Sa proyektong ito, gagawa kami ng isang orasan sa tulong ng module ng Arduino at RTC. Tulad ng alam natin na ang Arduino ay hindi maaaring ipakita ang aktwal na oras sa gayon gagamitin namin ang module ng RTC upang ipakita ang tamang oras sa LCD. Basahing mabuti ang lahat ng hakbang na makakatulong sa iyo ng malaki upang magawa ang relos.

Ang DS3231 Arduino code ay tulad ng DS1307 code at gumagana ito sa parehong mga RTC chip.

Ang Arduino code sa ilalim ay hindi gumagamit ng anumang silid-aklatan para sa DS3231 RTC, ang Wire library ay para sa pagsusulat sa pagitan ng Arduino at ng DS3231 na gumagamit ng kombensiyon ng I2C.

Oo! Maraming mga inhinyero ng electronics ay nakasalalay dito para sa kanilang mga proyekto na nakabatay sa oras ngunit ang RTC ay hindi ganap na maaasahan. Ito ay pinapatakbo ng baterya at kailangang mapalitan sa lalong madaling panahon o huli. Pagdating sa mga proyekto ng IoT sumasakop ito ng mahalagang mga SPI (Serial Peripheral Interface) na mga pin at magulo sa mga wire na gusot sa paligid. Solusyon …. Narito ang aming bayani NTP (Network time protocol). NTP ay tumpak dahil nakakakuha ito ng oras mula sa internet. Isasagawa namin ang protokol na ito gamit ang isang mode ng client-server. ang proseso ay napakasimple na ang aming Nodemcu ay kumikilos bilang isang kliyente at humiling ng isang NTP packet mula sa server gamit ang UDP. Bilang gantimpala, nagpapadala ang server ng isang packet sa kliyente kung aling nag-i-parse ng data. Ang NTP ay ang unibersal na protokol ng pagsasabay sa oras. Ngayon ay sindihan natin ang aming istasyon ng trabaho sa labs

Hakbang 1: Kinakailangan na Mga Sangkap

  • Board ng Arduino
  • Lupon ng DS3231 RTC
  • 16x2 LCD screen
  • 2 x push button
  • 10K ohm variable risistor (o potentiometer)
  • 330-ohm risistor
  • 3V coin cell baterya
  • Breadboard
  • Jumper wires

RTC mocule DS3231

Ang oras ay isang mahalagang kahulugan na kinakailangan sa mabilis na mundong ito ng mga tao. Sa realtime na proyekto

Gumagamit kami ng RTC (A. K. A Real-time na orasan)

Ang RTC Real-time-clock (RTC) ay isang integrated circuit (IC) na sumusubaybay sa kasalukuyang oras. Inaalagaan ng RTC ang oras sa real mode. Ang RTC ay karaniwang matatagpuan sa mga motherboard ng computer at naka-embed na mga system upang mangailangan ng napapanahong pag-access.

Hakbang 2: Koneksyon ng Arduino Clock

Koneksyon ng Arduino Clock
Koneksyon ng Arduino Clock
  • Ikonekta ang SCL pin sa module ng RTC sa Arduino A5
  • Ikonekta ang SDA pin sa module ng RTC sa Arduino A4
  • Ikonekta ang VCC SA 5v at GND SA GND
  • Ikonekta ang isang pindutan sa pin 8
  • Ikonekta ang isa pang pushbutton sa pin 9
  • Ikonekta ang RS ng LCD sa pin 2 ng Arduino
  • Ikonekta ang E ng LCD sa pin 3 ng Arduino
  • Ikonekta ang D7 ng LCD sa pin 7 ng Arduino
  • Ikonekta ang D6 ng LCD sa pin 6 ng Arduino
  • Ikonekta ang D5 ng LCD sa pin 5 ng Arduino
  • Ikonekta ang D4 ng LCD sa pin 4 ng Arduino
  • Ikonekta ang VSS & K sa GND
  • Ikonekta ang VDD & A sa 5v
  • Ikonekta ang vo sa potentiometer output pin

Hakbang 3: Code para sa Arduino Clock Sa RTC

Code para sa Arduino Clock Sa RTC
Code para sa Arduino Clock Sa RTC

Gumagana ang DS3231 sa format na BCD lamang at i-convert ang BCD sa decimal at vise versa ginamit ko ang 2 linya sa ibaba (halimbawa para sa minuto): // I-convert ang BCD sa decimalminute = (minuto >> 4) * 10 + (minuto at 0x0F);

// convert decimal to BCDminute = ((minuto / 10) << 4) + (minuto% 10); walang bisa DS3231_display (): ipinapakita ang oras at kalendaryo, bago ipakita ang oras at data ng kalendaryo ay na-convert mula sa BCD sa decimal format. iwasan ang blink_parameter ():

// Real time na orasan at kalendaryo na may mga nakatakda na pindutan gamit ang DS3231 at Arduino // isama ang LCD library code #include // isama ang Wire library code (kinakailangan para sa mga I2C protocol device) # isama // mga koneksyon sa module ng LCD (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // button1 ay konektado sa pin 8 pinMode (9, INPUT_PULLUP); // button2 ay konektado sa pin 9 // i-set up ang bilang ng mga haligi ng LCD at mga row lcd.begin (16, 2); Wire.begin (); // Sumali sa i2c bus} char Oras = "TIME:::"; char Calendar = "DATE: / / 20"; byte i, pangalawa, minuto, oras, petsa, buwan, taon; walang bisa DS3231_display () {// I-convert ang BCD sa decimal segundo = (pangalawa >> 4) * 10 + (pangalawa & 0x0F); minuto = (minuto >> 4) * 10 + (minuto & 0x0F); oras = (oras >> 4) * 10 + (oras at 0x0F); petsa = (petsa >> 4) * 10 + (petsa & 0x0F); buwan = (buwan >> 4) * 10 + (buwan & 0x0F); taon = (taon >> 4) * 10 + (taon & 0x0F); // End Time of conversion [12] = segundo% 10 + 48; Oras [11] = segundo / 10 + 48; Oras [9] = minuto% 10 + 48; Oras [8] = minuto / 10 + 48; Oras [6] = oras% 10 + 48; Oras [5] = oras / 10 + 48; Kalendaryo [14] = taon% 10 + 48; Kalendaryo [13] = taon / 10 + 48; Kalendaryo [9] = buwan% 10 + 48; Kalendaryo [8] = buwan / 10 + 48; Kalendaryo [6] = petsa% 10 + 48; Kalendaryo [5] = petsa / 10 + 48; lcd.setCursor (0, 0); lcd.print (Oras); // Display time lcd.setCursor (0, 1); lcd.print (Kalendaryo); // Ipakita ang kalendaryo} void blink_parameter () {byte j = 0; habang (j 23) // Kung oras> 23 ==> oras = 0 parameter = 0; kung (i == 1 && parameter> 59) // Kung minuto> 59 ==> minuto = 0 parameter = 0; kung (i == 2 && parameter> 31) // Kung petsa> 31 ==> date = 1 parameter = 1; kung (i == 3 && parameter> 12) // Kung buwan> 12 ==> buwan = 1 parameter = 1; kung (i == 4 && parameter> 99) // Kung taon> 99 ==> taon = 0 parameter = 0; sprintf (teksto, "% 02u", parameter); lcd.setCursor (x, y); lcd.print (teksto); pagkaantala (200); // Wait 200ms} lcd.setCursor (x, y); lcd.print (""); // Ipakita ang dalawang puwang blink_parameter (); sprintf (teksto, "% 02u", parameter); lcd.setCursor (x, y); lcd.print (teksto); blink_parameter (); kung (! digitalRead (8)) {// Kung ang pindutan (pin # 8) ay pinindot i ++; // Increament 'i' para sa susunod na parameter ng pagbalik ng parameter; // Return parameter halaga at exit}}} void loop () {if (! DigitalRead (8)) {// Kung ang pindutan (pin # 8) ay pinindot i = 0; oras = pag-edit (5, 0, oras); minuto = i-edit (8, 0, minuto); petsa = i-edit (5, 1, petsa); buwan = i-edit (8, 1, buwan); taon = i-edit (13, 1, taon); // I-convert ang decimal sa BCD minuto = ((minuto / 10) << 4) + (minuto% 10); oras = ((oras / 10) << 4) + (oras% 10); petsa = ((petsa / 10) << 4) + (petsa% 10); buwan = ((buwan / 10) << 4) + (buwan% 10); taon = ((taon / 10) << 4) + (taon% 10); // End conversion // Sumulat ng data sa DS3231 RTC Wire.beginTransmission (0x68); // Start I2C protocol with DS3231 address Wire.write (0); // Magpadala ng address ng rehistro Wire.write (0); // Reset sesonds at simulan ang oscillator Wire.write (minuto); // Sumulat ng minutong Wire.write (oras); // Sumulat ng oras na Wire.write (1); // Isulat ang araw (hindi nagamit) Wire.write (petsa); // Isulat ang petsa Wire.write (buwan); // Sumulat ng buwan Wire.write (taon); // Sumulat ng taon Wire.endTransmission (); // Ihinto ang paghahatid at palabasin ang pagkaantala ng I2C bus (200); // Wait 200ms} Wire.beginTransmission (0x68); // Start I2C protocol with DS3231 address Wire.write (0); // Send register address Wire.endTransmission (false); // I2C restart Wire.requestFrom (0x68, 7); // Humiling ng 7 bytes mula sa DS3231 at palabasin ang I2C bus sa pagtatapos ng pagbabasa ng pangalawa = Wire.read (); // Basahin ang mga segundo mula sa pagrehistro ng 0 minuto = Wire.read (); // Basahin ang mga minut mula sa pagrehistro ng 1 oras = Wire.read (); // Basahin ang oras mula sa pagrehistro 2 Wire.read (); // Read day from register 3 (not used) date = Wire.read (); // Basahin ang petsa mula sa pagrehistro ng 4 na buwan = Wire.read (); // Basahin ang buwan mula sa pagrehistro ng 5 taon = Wire.read (); // Basahin ang taon mula sa pagrehistro 6 DS3231_display (); // Oras ng diaplay at pagkaantala sa kalendaryo (50); // Wait 50ms}

Inirerekumendang: