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

Ρολόι κειμένου κύλισης Arduino: 3 βήματα
Ρολόι κειμένου κύλισης Arduino: 3 βήματα

Βίντεο: Ρολόι κειμένου κύλισης Arduino: 3 βήματα

Βίντεο: Ρολόι κειμένου κύλισης Arduino: 3 βήματα
Βίντεο: Πώς να χρησιμοποιήσετε το SSD1306 128x32 OLED Display I2C με τον κωδικό Arduino 2024, Ιούλιος
Anonim
Ρολόι κειμένου κύλισης Arduino
Ρολόι κειμένου κύλισης Arduino

Ο σκοπός αυτού του έργου είναι να δημιουργήσει ένα κυλιόμενο ρολόι κειμένου που εμφανίζει την ώρα που ομιλείται (για παράδειγμα, "είναι μεσάνυχτα").

Αυτό είναι ένα γρήγορο έργο - σας δίνουμε αρκετά για να προχωρήσετε με το υλικό και το σκίτσο και, στη συνέχεια, μπορείτε να το προχωρήσετε περαιτέρω για να καλύψει τις ανάγκες σας.

Βήμα 1: Υλικό

Σκεύη, εξαρτήματα
Σκεύη, εξαρτήματα

Θα χρειαστείτε τρία κύρια στοιχεία -

  • έναν πίνακα Arduino Uno-συμβατό
  • κύκλωμα ή μονάδα ρολογιού σε πραγματικό χρόνο χρησιμοποιώντας είτε IC DS1307 είτε DS3231
  • και μονόχρωμη οθόνη LED τύπου P10

Μπορεί να θέλετε εξωτερικό τροφοδοτικό, αλλά θα το φτάσουμε αργότερα.

Το πρώτο στάδιο είναι να προσαρμόσετε το ρολόι σας σε πραγματικό χρόνο. Κάντε κλικ εδώ για το σεμινάριο εάν χρειάζεστε βοήθεια σε αυτό.

Μέχρι τώρα ελπίζω να σκέφτεστε "πώς ορίζετε την ώρα;".

Υπάρχουν δύο απαντήσεις σε αυτό το ερώτημα. Εάν χρησιμοποιείτε το DS3231, απλώς τοποθετήστε το στο σκίτσο (δείτε παρακάτω) καθώς η ακρίβεια είναι πολύ καλή, χρειάζεται μόνο να ανεβάζετε το σκίτσο με τη νέα ώρα δύο φορές το χρόνο για να καλύψετε τις θερινές ώρες.

Διαφορετικά, προσθέστε μια απλή διεπαφή χρήστη-μερικά κουμπιά θα μπορούσαν να το κάνουν. Τέλος, απλά πρέπει να τοποθετήσετε το υλικό στο πίσω μέρος του DMD. Υπάρχουν πολλά περιθώρια για να καλύψετε τις δικές σας ανάγκες, μια απλή λύση μπορεί να είναι η ευθυγράμμιση της πλακέτας ελέγχου, ώστε να έχετε εύκολη πρόσβαση στην υποδοχή USB - και στη συνέχεια να την κολλήσετε με κάποιο Sugru.

Όσον αφορά την τροφοδοσία του ρολογιού - μπορείτε να εκτελέσετε μία οθόνη LED από το Arduino και λειτουργεί με καλή φωτεινότητα για εσωτερική χρήση. Εάν θέλετε το DMD να λειτουργεί πλήρως, η φωτεινότητα που καίει τον αμφιβληστροειδή πρέπει να χρησιμοποιήσετε ξεχωριστό τροφοδοτικό 5V 4A DC. Εάν χρησιμοποιείτε δύο DMD - αυτό πηγαίνει στα 8Α και ούτω καθεξής. Απλώς συνδέστε την εξωτερική τροφοδοσία σε τερματικά ενός DMD (συνδέστε το δεύτερο ή περισσότερα DMD σε αυτά τα τερματικά).

Εάν δεν σας αρέσει να κόβετε το άκρο του καλωδίου τροφοδοσίας, χρησιμοποιήστε μια έξοδο πρίζας DC.

Βήμα 2: Το σκίτσο του Arduino

Θα χρειαστεί να εγκαταστήσετε τις ακόλουθες δύο βιβλιοθήκες Arduino - TimerOne και DMD. Στη συνέχεια, ανεβάστε το σκίτσο:

// για RTC #περιλαμβάνουν "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // το DS1307 RTC είναι 0x68

// για οθόνη LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // θα μπορούσατε να έχετε περισσότερα από ένα DMD σε ένα σειρά #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // χρησιμοποιείται για να κρατήσει την τελευταία πρόταση για εμφάνιση στο DMD

void ScanDMD () // απαιτείται για DMD

{dmd.scanDisplayBySPI (); }

void setup ()

{// για DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (true);

// για RTC

Wire.begin (); // πυροδότηση byte λεωφορείου I2C δευτερόλεπτο, λεπτό, ώρα, dayOfWeek, dayOfMonth, μήνας, έτος. // αλλάξτε τις μεταβλητές και σχολιάστε το setDateDs1307 για να ορίσετε την ώρα // στη συνέχεια σχολιάστε ξανά τη συνάρτηση και ανεβάστε ξανά το σκίτσο δεύτερο = 0; λεπτό = 13; ώρα = 23; dayOfWeek = 4; dayOfMonth = 19; μήνας = 5; έτος = 13; // setDateDs1307 (δεύτερο, λεπτό, ώρα, dayOfWeek, dayOfMonth, μήνας, έτος); }

// συνηθισμένες λειτουργίες RTC

// Μετατροπή κανονικών δεκαδικών αριθμών σε δυαδικό κωδικοποιημένο δεκαδικό byte decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// Μετατροπή δυαδικών κωδικοποιημένων δεκαδικών σε κανονικούς δεκαδικούς αριθμούς

byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); }

void setDateDs1307 (byte δευτερόλεπτο, // 0-59

byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/byte month, // 1-12 byte year) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (δεύτερο)); // 0 στο bit 7 ξεκινά το ρολόι Wire.write (decToBcd (λεπτό)); Wire.write (decToBcd (ώρα)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (μήνας)); Wire.write (decToBcd (έτος)); Wire.write (00010000); // στέλνει 0x10 (εξάγωνο) 00010000 (δυαδικό) στον καταχωρητή ελέγχου - ενεργοποιεί το τετράγωνο κύμα Wire.endTransmission (); }

// Λαμβάνει την ημερομηνία και την ώρα από το ds1307

void getDateDs1307 (byte *δευτερόλεπτο, byte *λεπτό, byte *ώρα, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {// Επαναφορά του δείκτη μητρώου Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Μερικά από αυτά χρειάζονται μάσκες επειδή ορισμένα bits είναι bits ελέγχου

*δεύτερο = bcdToDec (Wire.read () & 0x7f); *λεπτό = bcdToDec (Wire.read ()); *ώρα = bcdToDec (Wire.read () & 0x3f); // Πρέπει να το αλλάξετε εάν 12 ώρες π.μ./μ.μ. *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *μήνας = bcdToDec (Wire.read ()); *έτος = bcdToDec (Wire.read ()); }

void drawText (String oldString)

{dmd.clearScreen (true); dmd.selectFont (Arial_Black_16); char newString [256]; int sLength = oldString.length (); oldString.toCharArray (newString, sLength+1); dmd.drawMarquee (newString, sLength, (32*DISPLAYS_ACROSS) -1, 0); μεγάλη εκκίνηση = millis (); long timer = εκκίνηση. long timer2 = εκκίνηση. boolean ret = false; while (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); χρονόμετρο = millis (); }}}

void createTextTime (int hh, int mm)

// αυτό μετατρέπει όλα τα δεδομένα σε κείμενο ως μία πρόταση {finalString = ""; // σβήστε την πρόταση για ειδικές περιπτώσεις (παρακάτω) finalString = finalString+"It's";

// τώρα προσθέστε την ώρα

εάν (hh == 1 || hh == 13) {finalString = finalString+"one"? } if (hh == 2 || hh == 14) {finalString = finalString+"two"? } if (hh == 3 || hh == 15) {finalString = finalString+"τρία"; } if (hh == 4 || hh == 16) {finalString = finalString+"τέσσερα"; } if (hh == 5 || hh == 17) {finalString = finalString+"πέντε"; } if (hh == 6 || hh == 18) {finalString = finalString+"six"? } if (hh == 7 || hh == 19) {finalString = finalString+"επτά"; } if (hh == 8 || hh == 20) {finalString = finalString+"οκτώ"; } if (hh == 9 || hh == 21) {finalString = finalString+"εννέα"; } if (hh == 10 || hh == 22) {finalString = finalString+"δέκα"; } if (hh == 11 || hh == 23) {finalString = finalString+"έντεκα"; }

// τώρα προσθέστε τα λεπτά

switch (mm) {case 1: finalString = finalString+"oh one"; Διακοπή; περίπτωση 2: finalString = finalString+"oh two"; Διακοπή; περίπτωση 3: finalString = finalString+"oh three"; Διακοπή; περίπτωση 4: finalString = finalString+"oh four"; Διακοπή; περίπτωση 5: finalString = finalString+"ω πέντε"; Διακοπή; περίπτωση 6: finalString = finalString+"oh six"; Διακοπή; περίπτωση 7: finalString = finalString+"ω επτά"; Διακοπή; περίπτωση 8: finalString = finalString+"oh οκτώ"; Διακοπή; περίπτωση 9: finalString = finalString+"oh nine"; Διακοπή; περίπτωση 10: finalString = finalString+"δέκα"; Διακοπή; περίπτωση 11: finalString = finalString+"έντεκα"; Διακοπή; περίπτωση 12: finalString = finalString+"δώδεκα"; Διακοπή; περίπτωση 13: finalString = finalString+"δεκατρία"; Διακοπή; περίπτωση 14: finalString = finalString+"δεκατέσσερα"; Διακοπή; περίπτωση 15: finalString = finalString+"δεκαπέντε"; Διακοπή; περίπτωση 16: finalString = finalString+"δεκαέξι"; Διακοπή; περίπτωση 17: finalString = finalString+"δεκαεπτά"; Διακοπή; περίπτωση 18: finalString = finalString+"δεκαοκτώ"; Διακοπή; περίπτωση 19: finalString = finalString+"δεκαεννέα"; Διακοπή; περίπτωση 20: finalString = finalString+"είκοσι"; Διακοπή; περίπτωση 21: finalString = finalString+"είκοσι ένα"; Διακοπή; περίπτωση 22: finalString = finalString+"είκοσι δύο"; Διακοπή; περίπτωση 23: finalString = finalString+"είκοσι τρία"; Διακοπή; περίπτωση 24: finalString = finalString+"είκοσι τέσσερα"; Διακοπή; περίπτωση 25: finalString = finalString+"είκοσι πέντε"; Διακοπή; περίπτωση 26: finalString = finalString+"είκοσι έξι"; Διακοπή; περίπτωση 27: finalString = finalString+"είκοσι επτά"; Διακοπή; περίπτωση 28: finalString = finalString+"είκοσι οκτώ"; Διακοπή; περίπτωση 29: finalString = finalString+"είκοσι εννέα"; Διακοπή; περίπτωση 30: finalString = finalString+"τριάντα"; Διακοπή; περίπτωση 31: finalString = finalString+"τριάντα ένα"; Διακοπή; περίπτωση 32: finalString = finalString+"τριάντα δύο"; Διακοπή; περίπτωση 33: finalString = finalString+"τριάντα τρία"; Διακοπή; περίπτωση 34: finalString = finalString+"τριάντα τέσσερα"; Διακοπή; περίπτωση 35: finalString = finalString+"τριάντα πέντε"; Διακοπή; περίπτωση 36: finalString = finalString+"τριάντα έξι"; Διακοπή; περίπτωση 37: finalString = finalString+"τριάντα επτά"; Διακοπή; περίπτωση 38: finalString = finalString+"τριάντα οκτώ"; Διακοπή; περίπτωση 39: finalString = finalString+"τριάντα εννέα"; Διακοπή; περίπτωση 40: finalString = finalString+"σαράντα"; Διακοπή; περίπτωση 41: finalString = finalString+"σαράντα ένα"; Διακοπή; περίπτωση 42: finalString = finalString+"σαράντα δύο"; Διακοπή; περίπτωση 43: finalString = finalString+"σαράντα τρία"; Διακοπή; περίπτωση 44: finalString = finalString+"σαράντα τέσσερα"; Διακοπή; περίπτωση 45: finalString = finalString+"σαράντα πέντε"; Διακοπή; περίπτωση 46: finalString = finalString+"σαράντα έξι"; Διακοπή; περίπτωση 47: finalString = finalString+"σαράντα επτά"; Διακοπή; περίπτωση 48: finalString = finalString+"σαράντα οκτώ"; Διακοπή; περίπτωση 49: finalString = finalString+"σαράντα εννέα"; Διακοπή; περίπτωση 50: finalString = finalString+"πενήντα"; Διακοπή; περίπτωση 51: finalString = finalString+"πενήντα ένα"; Διακοπή; περίπτωση 52: finalString = finalString+"πενήντα δύο"; Διακοπή; περίπτωση 53: finalString = finalString+"πενήντα τρία"; Διακοπή; περίπτωση 54: finalString = finalString+"πενήντα τέσσερα"; Διακοπή; περίπτωση 55: finalString = finalString+"πενήντα πέντε"; Διακοπή; περίπτωση 56: finalString = finalString+"πενήντα έξι"; Διακοπή; περίπτωση 57: finalString = finalString+"πενήντα επτά"; Διακοπή; περίπτωση 58: finalString = finalString+"πενήντα οκτώ"; Διακοπή; περίπτωση 59: finalString = finalString+"πενήντα εννέα"; Διακοπή; }

// μεσημέρι;

εάν (hh == 12 && mm == 0) {finalString = finalString+"μεσημέρι"; } // μεσάνυχτα; εάν (hh == 00 && mm == 0) {finalString = finalString+"μεσάνυχτα"; }

}

κενός βρόχος ()

{// λάβετε το χρόνο από το byte RTC δευτερόλεπτο, λεπτό, ώρα, dayOfWeek, dayOfMonth, μήνα, έτος. getDateDs1307 (& δεύτερο, & λεπτό, & ώρα, & dayOfWeek, & dayOfMonth, & μήνα, & έτος);

// μετατροπή του χρόνου σε συμβολοσειρά προτάσεων

createTextTime (ώρα, λεπτό).

// τώρα στείλτε το κείμενο στο DMD

drawText (finalString); }

Το σκίτσο έχει τις συνήθεις λειτουργίες για να ορίσετε και να ανακτήσετε το χρόνο από τα IC ρολογιών πραγματικού χρόνου DS1307/3232, και ως συνήθως με όλα τα ρολόγια μας μπορείτε να εισαγάγετε τις πληροφορίες ώρας στις μεταβλητές στο void setup (), και στη συνέχεια να αποσυνδέσετε το setDateDs1307 (), ανεβάστε το σκίτσο, σχολιάστε ξανά το setDateDs1307 και, στη συνέχεια, ανεβάστε το σκίτσο για άλλη μια φορά. Επαναλάβετε αυτήν τη διαδικασία για να ρυθμίσετε ξανά την ώρα εάν δεν προσθέσατε καμία διεπαφή χρήστη που βασίζεται σε υλικό.

Βήμα 3:

Μόλις ανακτηθεί ο χρόνος στον κενό βρόχο (), μεταφέρεται στη συνάρτηση createTextTime (). Αυτή η συνάρτηση δημιουργεί τη συμβολοσειρά κειμένου για προβολή ξεκινώντας με το "Είναι" και στη συνέχεια καθορίζει ποιες λέξεις θα ακολουθήσουν ανάλογα με την τρέχουσα ώρα. Τέλος, η συνάρτηση drawText () μετατρέπει τη συμβολοσειρά που περιέχει το κείμενο για εμφάνιση σε μεταβλητή χαρακτήρων η οποία μπορεί να περάσει στο DMD.

Συνιστάται: