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

Έξυπνο ξυπνητήρι με χρήση Magicbit (Arduino): 10 βήματα
Έξυπνο ξυπνητήρι με χρήση Magicbit (Arduino): 10 βήματα

Βίντεο: Έξυπνο ξυπνητήρι με χρήση Magicbit (Arduino): 10 βήματα

Βίντεο: Έξυπνο ξυπνητήρι με χρήση Magicbit (Arduino): 10 βήματα
Βίντεο: Φτιάξε το τραγικό ξυπνητήρι σου επιτέλους | Ξύπνα σαν άνθρωπος και όχι σαν να είσαι σε στρατόπεδο 2024, Ιούλιος
Anonim
Image
Image

Αυτό το σεμινάριο δείχνει πώς να φτιάξετε ένα έξυπνο ξυπνητήρι χρησιμοποιώντας οθόνη OLED στον πίνακα Magicbit dev χωρίς να χρησιμοποιήσετε καμία μονάδα RTC.

Προμήθειες

  • Magicbit
  • Καλώδιο USB-A σε Micro-USB

Βήμα 1: Ιστορία

Σε αυτό το σεμινάριο θα μάθουμε πώς να φτιάχνουμε ένα έξυπνο ξυπνητήρι χρησιμοποιώντας το Magicbit.

Βήμα 2: ΡΥΘΜΙΣΗ HARDWARE

Συνδέστε το Magicbit στον υπολογιστή χρησιμοποιώντας καλώδιο USB.

Βήμα 3: ΡΥΘΜΙΣΗ ΛΟΓΙΣΜΙΚΟΥ

Ανοίξτε το Arduino IDE και ρυθμίστε τον πίνακα με το Arduino IDE. Ο παρακάτω σύνδεσμος αναφέρεται πώς να το κάνετε αυτό. Σας προτείνουμε λοιπόν να πάτε πρώτα στον σύνδεσμο και να εξοικειωθείτε με το Magic bit.

magicbit-arduino.readthedocs.io/el/latest/…

Τώρα επιλέξτε τον σωστό τύπο πλακέτας και θύρα. Σε αυτή την περίπτωση, ο τύπος της πλακέτας είναι Magicbit. Οι βιβλιοθήκες είναι ήδη εγκατεστημένες όταν βρίσκονται οι βιβλιοθήκες Magicbit.

Βήμα 4: Θεωρία και Μεθοδολογία

Αν κοιτάξετε το πρώτο βίντεο, μπορείτε να δείτε ότι η οθόνη έχει 2 οθόνες.

  • οθόνη ρολογιού που δείχνει λεπτομέρειες ώρας
  • οθόνη συναγερμού που εμφανίζει λεπτομέρειες συναγερμού

Για εναλλαγή μεταξύ αυτών των δύο οθονών χρησιμοποιήσαμε οποιοδήποτε κουμπί δύο στο Magicbit. Αυτά τα κουμπιά συνδέονται με 35 (αριστερό κουμπί) και 34 (δεξί κουμπί) ακίδες του ESP32 στο Magicbit. Για να δείξουμε την ώρα και άλλες λεπτομέρειες χρησιμοποιήσαμε ενσωματωμένη οθόνη OLED στο magicbit.

Ας μιλήσουμε για το πώς λειτουργούν αυτές οι οθόνες γραφικών.

Η οθόνη ρολογιού έχει αναλογικό ρολόι, ψηφιακό ρολόι, ημερομηνία, μήνα και έτος κείμενα.

Για τη δημιουργία αναλογικού ρολογιού χρησιμοποιούμε μερικές λειτουργίες γραφικών που είναι διαθέσιμες στη βιβλιοθήκη γραφικών που ονομάζεται Adafriut GFX. Χρησιμοποιώντας τη λειτουργία κύκλου και τη συνάρτηση γραμμής δημιουργούμε αναλογική όψη ρολογιού. Οι απλές γεωμετρικές συναρτήσεις που ονομάζονται sin και cos χρησιμοποιούνται στη θέση των δεικτών του ρολογιού. Έτσι εισάγουμε μόνο τη γωνία που αντιστοιχεί στο χρόνο για περιστροφικά χέρια. για αυτό μετατρέπουμε πρώτα τον χρόνο σε γωνία ως εξής.

  • γωνία λεπτού χεριού = λεπτά*(360/60)
  • γωνία ωρών = ώρες*(360/12)

Η γωνία που μετριέται σε σχέση με τη γραμμή μεταξύ του κέντρου της όψης του ρολογιού και του αριθμού 12 στην όψη του ρολογιού. Χρησιμοποιώντας τις συναρτήσεις sin και cos μπορούμε να υπολογίσουμε τις συντεταγμένες x και y των άκρων των γραμμών ώρας και λεπτών. Η παρακάτω εικόνα περιγράφει πώς είναι.

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

Όπως και στην οθόνη του ρολογιού, χρησιμοποιήσαμε τη λειτουργία εκτύπωσης κειμένου στη βιβλιοθήκη Adafruit GFX για αριθμούς εκτύπωσης σε οθόνη OLED σε κατάλληλα σημεία.

Βήμα 5: Λήψη της τοπικής ώρας

Το πιο σημαντικό μέρος του ρολογιού είναι πώς λαμβάνουμε την τοπική ώρα με ακρίβεια. Για το σκοπό αυτό, μπορείτε να χρησιμοποιήσετε εξωτερική μονάδα ρολογιού RTC ή ενσωματωμένο ρολόι RC στο ESP32 στο Magicbit. Σε αυτό το έργο χρησιμοποιήσαμε τη δεύτερη μέθοδο. Σε αυτή τη μέθοδο χρησιμοποιούμε τον πελάτη NTP (πρωτόκολλο χρόνου δικτύου) για να λαμβάνει την τοπική ώρα από το διαδίκτυο. Για πρόσβαση στο διαδίκτυο χρησιμοποιήσαμε ενσωματωμένη εγκατάσταση WIFI στο ESP32. Ως εκ τούτου, στο πρώτο στάδιο χρησιμοποιούμε το WIFI για πρόσβαση στο διαδίκτυο, παρέχοντας SSID και κωδικό πρόσβασης. Στη συνέχεια, πρέπει να διαμορφώσουμε το gmtOffset και το daylightOffset σε μεταβλητές σε δευτερόλεπτα. Οι τιμές αυτών των μεταβλητών διαφέρουν από περιοχή σε περιοχή στον κόσμο. Το gmtOffset σημαίνει τον αριθμό των δευτερολέπτων που διαφέρετε από το GMT.. Για τα περισσότερα ares daylightOffset είναι 3600. Μπορείτε να το βρείτε στο διαδίκτυο. Αφού πήραμε την τρέχουσα τοπική ώρα, δεν χρησιμοποιήσαμε πλέον WIFI. Γιατί τότε υπολογίζουμε την τοπική ώρα από το ενσωματωμένο ρολόι RC στο ESP32. Αυτό γίνεται χρησιμοποιώντας βιβλιοθήκη time.h. Υπάρχει ένα απλό παράδειγμα στο Arduino (Arduino> Παραδείγματα> ESP32> Timeρα> απλή ώρα) για να μάθετε πώς λειτουργεί περαιτέρω. Επίσης, μπορείτε να χρησιμοποιήσετε αυτούς τους συνδέσμους για περαιτέρω γνώση του προγράμματος -πελάτη NTP.

  • https://dronebotworkshop.com/esp32-intro/
  • https://lastminuteengineers.com/esp32-ntp-server-d…

Αφού λάβουμε την τοπική ώρα σωστά, αλλάζουμε το χρόνο μας εμφανίζοντας κείμενα και γωνία σύμφωνα με αυτές τις πληροφορίες σε κάθε βρόχο.

Βήμα 6: Ρύθμιση του συναγερμού

Κάνοντας κλικ στα αριστερά και δεξιά κουμπιά μπορείτε να αλλάξετε την επιλογή ημερομηνίας και ώρας συναγερμού. Βεβαιωθείτε ότι απενεργοποιείτε το ξυπνητήρι όταν αλλάζετε ημερομηνία και ώρα αφύπνισης. Αφού ρυθμίσετε την ημερομηνία και την ώρα, ενεργοποιήστε το ξυπνητήρι. Διότι εάν ο συναγερμός είναι ενεργοποιημένος και όταν ο χρόνος αφύπνισης είναι ίσος με την τρέχουσα ώρα κατά τη ρύθμισή του, θα χτυπήσει ο βομβητής συναγερμού. Στον κύριο βρόχο ελέγχει πάντα την τρέχουσα τοπική ώρα και οι πληροφορίες συναγερμού είναι ίσες. Εάν αυτά είναι ίσα, τότε το βομβητή και το ενσωματωμένο πράσινο LED στο Magicbit θα λειτουργήσει για ένα λεπτό.

Βήμα 7: Ρύθμιση του βομβητή

Χρησιμοποιούμε τον παλμό PWM για να δημιουργήσουμε τον ήχο βομβητή χρησιμοποιώντας τη λειτουργία analogCwrite () στον κώδικα. Λόγω του ότι όλες οι λειτουργίες βιβλιοθήκης είναι στο ESP32 ισχύει για το Magicbit. Μπορείτε να αλλάξετε τον ήχο μπιπ του βομβητή από την αλλαγή συχνότητας και τιμής PWM στον κώδικα.

techtutorialsx.com/2017/06/15/esp32-arduin…

Αυτή η σελίδα περιγράφει πώς λειτουργεί ο βομβητής με το ESP32.

Βήμα 8: Ρύθμιση κουμπιών

Για την αλλαγή όλων των καταστάσεων χρησιμοποιήσαμε δύο ενσωματωμένα κουμπιά στο Magicbit. Ο κύριος βρόχος ελέγχει πάντα την κατάσταση δύο κουμπιών. Επειδή τράβηξαν εσωτερικά, εκεί η κανονική κατάσταση είναι υψηλού σήματος. Έτσι μπορείτε να δείτε ότι η ψηφιακή ανάγνωση αυτών των ακίδων είναι 1. Στο προεπιλεγμένο στάδιο, η οθόνη δείχνει τη διεπαφή του ρολογιού. Εκείνη τη στιγμή, όταν πατηθεί οποιοδήποτε από τα δύο κουμπιά, τότε αλλάζει οθόνη σε οθόνη αφύπνισης. Επίσης μετράμε το χρόνο σε δευτερόλεπτα από την τελευταία φορά που πατήθηκε το κουμπί. Εάν ο αριθμός αυτός είναι μεγαλύτερος από κάποια προκαθορισμένη διάρκεια, τότε στην οθόνη θα εμφανιστεί η οθόνη του ρολογιού.

Ο κώδικας γράφεται χρησιμοποιώντας βασικές λειτουργίες για αρχάριους. Έτσι, ο κώδικας είναι απλός στην κατανόηση και μπορείτε να μάθετε τη μέθοδο πώς λειτουργεί παραπέμποντας τον κώδικα.

Βήμα 9: Αντιμετώπιση προβλημάτων

Μερικές φορές το ρολόι ξεκινά λίγο αργότερα ή δεν εμφανίζει σωστά τα γραφικά. Οι παρακάτω συμβουλές βοηθούν στην επίλυση της κατάστασης.

  • Βεβαιωθείτε ότι έχετε δώσει το σωστό SSID και κωδικό πρόσβασης
  • Αλλάξτε τον διακομιστή NTP (μπορείτε να βρείτε πολλούς διακομιστές από το Διαδίκτυο που σχετίζονται με την περιοχή σας).
  • Αλλάζει τη σύνδεση στο διαδίκτυο. (Το hotspot για κινητά είναι επίσης δυνατό).

Επίσης, μπορείτε να αντιμετωπίσετε τα πάντα χρησιμοποιώντας τη σειριακή οθόνη. Εκτός από την οθόνη OLED, η σειριακή οθόνη δείχνει πληροφορίες χρόνου.

Βήμα 10: Κωδικός Arduino

// βιβλιοθήκες για οθόνη OLED

#περιλαμβάνω

#include #include #define OLED_RESET 4 #include // βιβλιοθήκη wifi για σύνδεση #include "time.h" // βιβλιοθήκη για χρήση ρολόι RC // καθορισμός ονομάτων pin εισόδου και εξόδου #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int μετράει = 0; int currentTime = 0; strukt tm timeinfo? const char* ssid = "YOUR SSID"; // wifi details const char* password = "YOUR PASSWORD"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // μεταβλητές συναγερμού int dateIndex = 0, int timeIndex = 0; int selectIndex = -1; bool buzzerOn = 0; int rect [6] [4] = {{5, 0, 118, 16}, {1, 22, 30, 22}, {37, 22, 30, 22}, {73, 22, 55, 22}, {31, 44, 30, 20}, {67, 44, 30, 20}}; // ορθογώνιο επιλογής const char* ntpServer = "asia.pool.ntp.org"; // server detais const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Οθόνη Adafruit_SSD1306 (128, 64); // Μέγεθος OLED καθορίστε byte clockCenterY = (display.height () + 16)/2; // αναλογικές λεπτομέρειες αναλογικού ρολογιού byte clockCenterX = (display.height () - 16)/2; byte clockRadius = 23; κατάσταση bool = 0; // ενεργοποίηση ή απενεργοποίηση οθόνης boolean Alarm = 0; // τρέχουσα κατάσταση συναγερμού String alarmState = "Ενεργοποίηση συναγερμού"; // ενεργοποίηση ή απενεργοποίηση συναγερμού // μεταβλητές αποθηκευμένων χρόνων δεδομένων char dayName [10]; char daynumber [3]? μήνα char [10]; έτος char [5]; ωράριο [3]; πρακτικά λεπτών [3]; char μηνιαίος αριθμός [3]; δευτερόλεπτα κάρτας [3]; // μεταβλητές κουμπιών bool RightState = 1; bool LeftState = 1; // μεταβλητές βομβητή int κανάλι = 0; int Συχνότητα = 2000; int PWM = 200; int ανάλυση = 8; void setup () {// set είσοδος και έξοδοι pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display.display (); καθυστέρηση (3000)? display.clearDisplay (); ledcSetup (0, Συχνότητα, ανάλυση); // διαμόρφωση παραμέτρων pwm ledcAttachPin (Buzzer, 0); Serial.begin (115200); // intilize σειριακή επικοινωνία // σύνδεση στο WiFi Serial.printf ("Σύνδεση με %s", ssid); WiFi.begin (ssid, κωδικός πρόσβασης); while (WiFi.status ()! = WL_CONNECTED) {καθυστέρηση (500); Serial.print ("."); } Serial.println ("CONNECTED"); // init και λήψη της ώρας configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // αποσυνδέστε το WiFi καθώς δεν χρειάζεται πλέον WiFi.disconnect (true)? WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // λήψη τρέχουσας ώρας // αποθήκευση καταστάσεων δεξιού και αριστερού κουμπιού RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // chaeck τα κουμπιά πιέζονται εάν (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // όταν πατηθεί το κουμπί ο βομβητής εκπέμπει καθυστέρηση ήχου μπιπ (100). εάν (κατάσταση == 0) {// αλλαγή σε κατάσταση πλαισίου οθόνης συναγερμού = 1; // αλλαγή κατάστασης σε κατάσταση συναγερμού RightState = LeftState = 1; // χρειαζόμαστε μόνο αλλαγή sceern} counts = 0; // reset counter} εάν (κατάσταση == 1 && (μετράει) <5) {// εάν στην οθόνη συναγερμού και δεν υπάρχει χρονικό όριο calcAlarm (); // υπολογίστε τις τιμές χρόνου των πληροφοριών συναγερμού showAlarm (); // εμφάνιση τιμών} else {// εάν είναι σε ρολόι κατάσταση οθόνης = 0; display.clearDisplay (); clockFace (); // αναλογική όψη ρολογιού printLocalTime (); // χρόνος εκτύπωσης σε όψη ρολογιού και εκτύπωση άλλων λεπτομερειών} onAlarm (); // σύγκριση του χρόνου συναγερμού με την τοπική ώρα και ενεργοποίηση της καθυστέρησης συναγερμού (100), // καθυστέρηση για συναγερμός on and off} void clockFace () {// caalog clock clock display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // εκτύπωση κύκλου ρολογιού για (int ψηφίο = 0; ψηφίο = 5) {// έχουν μόνο 5 selctions.so επαναφορά στο -1 (-1 = είναι ενεργοποιημένο ή απενεργοποιημένο) επιλέξτε Index = -1; } dateAndTimeSelection (selectIndex); // change selction} void dateAndTimeSelection (int index) {if (index == -1) {// alarm on and off if (RightState == 0) {// εναλλαγή μεταξύ ενεργοποίησης και απενεργοποίησης συναγερμού εάν (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Ειδοποίηση συναγερμού"; }}} else {if (RightState == 0) {// σε άλλες επιλογές εμφανίζεται η συσχέτιση ημερομηνίας ή ώρας στον πίνακα alarmDateTime [index] = alarmDateTime [index] + 1; // index είναι η επιλογή}} int σύγκριση [4] = {12, 2030, 23, 59}; // ανώτατα όρια των ημερομηνιών και ετών σε σύγκριση [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} · // άνω όριο των μηνών int resetValue [4] = {1, 2020, 0, 0}; // αρχικές τιμές για (int i = 1; συγκρίνω [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> συγκριτικός μήνας [alarmDateTime [1] - 1]) {// επαναφορά των vlaues εάν οι μήνες είναι μεγαλύτεροι από τα όριά τους alarmDateTime [0] = 1; }} void showAlarm () {// εκτύπωση λεπτομερειών συναγερμού String alarmDateTime0 = String (alarmDateTime [0]); // μετατροπή τσιμπημάτων σε εμφάνιση String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // εάν οι τιμές έχουν ένα 1 ψηφίο, προσθέστε το "0" σε αυτές. εάν (alarmDateTime [0]

Συνιστάται: