Πίνακας περιεχομένων:

Ρολόι σε πραγματικό χρόνο με Arduino: 3 βήματα
Ρολόι σε πραγματικό χρόνο με Arduino: 3 βήματα

Βίντεο: Ρολόι σε πραγματικό χρόνο με Arduino: 3 βήματα

Βίντεο: Ρολόι σε πραγματικό χρόνο με Arduino: 3 βήματα
Βίντεο: Μετρήστε την απόσταση με τη μονάδα λέιζερ 6 ακίδων VL53L0X με το Arduino 2024, Νοέμβριος
Anonim
Ρολόι σε πραγματικό χρόνο με το Arduino
Ρολόι σε πραγματικό χρόνο με το Arduino

Σε αυτό το έργο, θα φτιάξουμε ένα ρολόι με τη βοήθεια της μονάδας Arduino και RTC. Όπως γνωρίζουμε, το Arduino δεν μπορεί να εμφανίσει τον πραγματικό χρόνο, οπότε θα χρησιμοποιήσουμε τη μονάδα RTC για να εμφανίσουμε τη σωστή ώρα στην οθόνη LCD. Διαβάστε προσεκτικά όλα τα βήματα, θα σας βοηθήσει πολύ να φτιάξετε το ρολόι.

Ο κωδικός DS3231 Arduino είναι σαν τον κωδικό DS1307 και λειτουργεί και με τα δύο τσιπ RTC.

Ο κώδικας Arduino από κάτω δεν χρησιμοποιεί καμία βιβλιοθήκη για το DS3231 RTC, η βιβλιοθήκη Wire είναι για την αντιστοιχία μεταξύ του Arduino και του DS3231 χρησιμοποιώντας τη σύμβαση I2C.

Ναι! Πολλοί μηχανικοί ηλεκτρονικών εξαρτώνται από αυτό για τα έργα τους βάσει χρόνου, αλλά το RTC δεν είναι απολύτως αξιόπιστο. Λειτουργεί με μπαταρία και πρέπει να αντικατασταθεί αργά ή γρήγορα. Ερχόμενος σε έργα IoT καταλαμβάνει πολύτιμες ακίδες SPI (Serial Peripheral Interface) και μπερδεύεται με καλώδια που μπερδεύονται. Λύση…. Εδώ έρχεται ο ήρωας μας NTP (πρωτόκολλο ώρας δικτύου). Το NTP είναι τόσο ακριβές αφού παίρνει χρόνο από το διαδίκτυο. Θα λειτουργήσουμε αυτό το πρωτόκολλο χρησιμοποιώντας μια λειτουργία πελάτη-διακομιστή. η διαδικασία είναι τόσο απλή που το Nodemcu λειτουργεί ως πελάτης και ζητά ένα πακέτο NTP από τον διακομιστή χρησιμοποιώντας UDP. Σε αντάλλαγμα, ο διακομιστής στέλνει ένα πακέτο στον πελάτη το οποίο αναλύει τα δεδομένα. Το NTP είναι το καθολικό πρωτόκολλο συγχρονισμού ώρας. Τώρα ας φωτίσουμε το εργαστήριο μας

Βήμα 1: Απαιτούμενα εξαρτήματα

  • Πίνακας Arduino
  • Πλακέτα DS3231 RTC
  • Οθόνη LCD 16x2
  • 2 x κουμπί
  • 10K ohm μεταβλητή αντίσταση (ή ποτενσιόμετρο)
  • Αντίσταση 330 ohm
  • Μπαταρία κυψελών νομισμάτων 3V
  • Breadboard
  • Καλώδια βραχυκυκλωτήρων

RTC mocule DS3231

Ο χρόνος είναι μια ουσιαστική αίσθηση που απαιτείται σε αυτόν τον γρήγορο κόσμο των ανθρώπων. Σε έργο σε πραγματικό χρόνο

Χρησιμοποιούμε RTC (ρολόι πραγματικού χρόνου A. K. A)

Το RTC Real-time-clock (RTC) είναι ένα ολοκληρωμένο κύκλωμα (IC) που παρακολουθεί την τρέχουσα ώρα. Το RTC φροντίζει για τον χρόνο σε πραγματική λειτουργία. Το RTC βρίσκεται συνήθως σε μητρικές πλακέτες υπολογιστών και ενσωματωμένα συστήματα που απαιτούν έγκαιρη πρόσβαση.

Βήμα 2: Σύνδεση ρολογιού Arduino

Σύνδεση ρολογιού Arduino
Σύνδεση ρολογιού Arduino
  • Συνδέστε τον πείρο SCL στη μονάδα RTC στο Arduino A5
  • Συνδέστε την καρφίτσα SDA στη μονάδα RTC στο Arduino A4
  • Συνδέστε το VCC TO 5v και το GND TO GND
  • Συνδέστε ένα κουμπί στον πείρο 8
  • Συνδέστε ένα άλλο κουμπί στον πείρο 9
  • Συνδέστε το RS της LCD με το pin 2 του Arduino
  • Συνδέστε το E της οθόνης LCD στην ακίδα 3 του Arduino
  • Συνδέστε το D7 της οθόνης LCD με το pin 7 του Arduino
  • Συνδέστε το D6 της οθόνης LCD στην ακίδα 6 του Arduino
  • Συνδέστε το D5 της οθόνης LCD με το pin 5 του Arduino
  • Συνδέστε το D4 της οθόνης LCD με το pin 4 του Arduino
  • Συνδέστε το VSS & K στο GND
  • Συνδέστε το VDD & A στο 5v
  • Συνδέστε το vo στον πείρο εξόδου του ποτενσιόμετρου

Βήμα 3: Κωδικός για ρολόι Arduino με RTC

Κωδικός για ρολόι Arduino με RTC
Κωδικός για ρολόι Arduino με RTC

Το DS3231 λειτουργεί μόνο με μορφή BCD και για τη μετατροπή του BCD σε δεκαδικό και αντίστροφα χρησιμοποίησα τις 2 παρακάτω γραμμές (παράδειγμα για λεπτό): // Μετατροπή BCD σε δεκαδικό λεπτό = (λεπτό >> 4) * 10 + (λεπτό & 0x0F) ?

// Μετατροπή δεκαδικών σε BCDminute = ((λεπτό / 10) << 4) + (λεπτό % 10); void DS3231_display (): εμφανίζει το χρόνο και το ημερολόγιο, πριν από την εμφάνιση του χρόνου και τα δεδομένα του ημερολογίου μετατρέπονται από BCD σε δεκαδική μορφή. void blink_parameter ():

// Ρολόι και ημερολόγιο σε πραγματικό χρόνο με ρυθμισμένα κουμπιά χρησιμοποιώντας DS3231 και Arduino // περιλαμβάνουν κωδικό βιβλιοθήκης LCD #συμπεριλάβετε // περιλαμβάνουν κωδικό βιβλιοθήκης καλωδίων (απαιτείται για συσκευές πρωτοκόλλου I2C) #συμπεριλάβετε // συνδέσεις μονάδας LCD (RS, E, D4, D5, D6, D7) LiquidCrystal LCD (2, 3, 4, 5, 6, 7). void setup () {pinMode (8, INPUT_PULLUP); // το κουμπί 1 είναι συνδεδεμένο με τον ακροδέκτη 8 pinMode (9, INPUT_PULLUP). // το κουμπί2 είναι συνδεδεμένο στον ακροδέκτη 9 // ρυθμίστε τον αριθμό των στηλών και των σειρών LCD lcd.begin (16, 2). Wire.begin (); // Εγγραφή i2c bus} char Timeρα = "ΩΡΑ:::"; char Ημερολόγιο = "DATE: / / 20"; byte i, δεύτερο, λεπτό, ώρα, ημερομηνία, μήνας, έτος. void DS3231_display () {// Μετατρέψτε το BCD σε δεκαδικό δευτερόλεπτο = (δεύτερο >> 4) * 10 + (δεύτερο & 0x0F); λεπτό = (λεπτό >> 4) * 10 + (λεπτό & 0x0F); ώρα = (ώρα >> 4) * 10 + (ώρα & 0x0F); ημερομηνία = (ημερομηνία >> 4) * 10 + (ημερομηνία & 0x0F); μήνας = (μήνας >> 4) * 10 + (μήνας & 0x0F); έτος = (έτος >> 4) * 10 + (έτος & 0x0F); // Τέλος Χρόνος μετατροπής [12] = δευτερόλεπτο % 10 + 48; Χρόνος [11] = δεύτερο / 10 + 48; Χρόνος [9] = λεπτό % 10 + 48 · Χρόνος [8] = λεπτό / 10 + 48; Χρόνος [6] = ώρα % 10 + 48; Χρόνος [5] = ώρα / 10 + 48; Ημερολόγιο [14] = έτος % 10 + 48 · Ημερολόγιο [13] = έτος / 10 + 48; Ημερολόγιο [9] = μήνας % 10 + 48; Ημερολόγιο [8] = μήνας / 10 + 48; Ημερολόγιο [6] = ημερομηνία % 10 + 48; Ημερολόγιο [5] = ημερομηνία / 10 + 48; lcd.setCursor (0, 0); lcd.print (Timeρα); // Χρόνος εμφάνισης lcd.setCursor (0, 1); lcd.print (Ημερολόγιο); // Εμφάνιση ημερολογίου} void blink_parameter () {byte j = 0; ενώ (j 23) // Εάν ώρες> 23 ==> ώρες = 0 παράμετρος = 0? εάν (i == 1 && παράμετρος> 59) // Εάν λεπτά> 59 ==> λεπτά = 0 παράμετρος = 0, εάν (i == 2 && παράμετρος> 31) // Εάν ημερομηνία> 31 ==> ημερομηνία = 1 παράμετρος = 1, εάν (i == 3 && παράμετρος> 12) // Εάν μήνας> 12 ==> μήνας = 1 παράμετρος = 1, εάν (i == 4 && παράμετρος> 99) // Εάν έτος> 99 ==> έτος = 0 παράμετρος = 0; sprintf (κείμενο, "%02u", παράμετρος); lcd.setCursor (x, y); lcd.print (κείμενο); καθυστέρηση (200)? // Περιμένετε 200ms} lcd.setCursor (x, y); lcd.print (""); // Εμφάνιση δύο διαστημάτων blink_parameter (); sprintf (κείμενο, "%02u", παράμετρος); lcd.setCursor (x, y); lcd.print (κείμενο); blink_parameter (); εάν (! digitalRead (8)) {// Εάν πατηθεί το κουμπί (pin #8) i ++; // Αύξηση «i» για την επόμενη παράμετρο παράμετρος επιστροφής. // Επιστροφή τιμής παραμέτρου και έξοδος}}} κενός βρόχος () {if (! DigitalRead (8)) {// Εάν πατηθεί το κουμπί (pin #8) i = 0; ώρα = επεξεργασία (5, 0, ώρα); λεπτό = επεξεργασία (8, 0, λεπτό); ημερομηνία = επεξεργασία (5, 1, ημερομηνία); μήνας = επεξεργασία (8, 1, μήνας); έτος = επεξεργασία (13, 1, έτος); // Μετατροπή δεκαδικού σε BCD λεπτό = ((λεπτό / 10) << 4) + (λεπτό % 10); ώρα = ((ώρα / 10) << 4) + (ώρα % 10); ημερομηνία = ((ημερομηνία / 10) << 4) + (ημερομηνία % 10) · μήνας = ((μήνας / 10) << 4) + (μήνας % 10) · έτος = ((έτος / 10) << 4) + (έτος % 10) · // Τερματισμός μετατροπής // Γράψτε δεδομένα στο DS3231 RTC Wire.beginTransmission (0x68); // Έναρξη πρωτοκόλλου I2C με διεύθυνση DS3231 Wire.write (0); // Αποστολή διεύθυνσης μητρώου Wire.write (0); // Επαναφορά sesonds και εκκίνηση ταλαντωτή Wire.write (λεπτό); // Γράψτε λεπτό Wire.write (ώρα); // Γράψτε ώρα Wire.write (1); // Γράψτε την ημέρα (δεν χρησιμοποιείται) Wire.write (ημερομηνία); // Γράψτε ημερομηνία Wire.write (μήνας); // Γράψτε μήνα Wire.write (έτος); // Γράψτε έτος Wire.endTransmission (); // Διακόψτε τη μετάδοση και αφήστε την καθυστέρηση διαύλου I2C (200). // Περιμένετε 200ms} Wire.beginTransmission (0x68); // Έναρξη πρωτοκόλλου I2C με διεύθυνση DS3231 Wire.write (0); // Αποστολή διεύθυνσης μητρώου Wire.endTransmission (false); // I2C επανεκκίνηση Wire.requestFrom (0x68, 7); // Ζητήστε 7 byte από το DS3231 και αφήστε τον δίαυλο I2C στο τέλος της ανάγνωσης δεύτερου = Wire.read (); // Διαβάστε δευτερόλεπτα από τον καταχωρητή 0 λεπτό = Wire.read (); // Διαβάστε λεπτά από τον καταχωρητή 1 ώρα = Wire.read (); // Readρα ανάγνωσης από το μητρώο 2 Wire.read (); // Διαβάστε την ημέρα από το μητρώο 3 (δεν χρησιμοποιείται) ημερομηνία = Wire.read (); // Ημερομηνία ανάγνωσης από μητρώο 4 μήνες = Wire.read (); // Διαβάστε μήνα από το μητρώο 5 χρόνια = Wire.read (); // Διαβάστε το έτος από το μητρώο 6 DS3231_display (); // Χρόνος διαλογής & καθυστέρηση ημερολογίου (50). // Περιμένετε 50ms}

Συνιστάται: