Inhaltsverzeichnis:
2025 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2025-01-13 06:56
Dieses Tutorial zeigt, wie Sie einen intelligenten Wecker mit einem OLED-Display in der Magicbit-Entwicklungsplatine erstellen, ohne ein RTC-Modul zu verwenden.
Lieferungen
- Magicbit
- USB-A-zu-Micro-USB-Kabel
Schritt 1: Geschichte
In diesem Tutorial erfahren Sie, wie Sie mit Magicbit einen intelligenten Wecker erstellen.
Schritt 2: HARDWARE-SETUP
Schließen Sie Ihr Magicbit über ein USB-Kabel an den Computer an.
Schritt 3: SOFTWARE-SETUP
Öffnen Sie Ihre Arduino IDE und richten Sie das Board mit Arduino IDE ein. Der folgende Link zeigt, wie das geht. Wir empfehlen Ihnen daher, zuerst zu verlinken und sich mit Magic Bit vertraut zu machen.
magicbit-arduino.readthedocs.io/en/latest/…
Wählen Sie nun den richtigen Kartentyp und Port aus. In diesem Fall ist der Kartentyp Magicbit. Die Bibliotheken sind bereits in den Magicbit-Bibliotheken installiert.
Schritt 4: Theorie und Methodik
Wenn Sie sich das erste Video ansehen, können Sie sehen, dass das Display 2 Bildschirme hat.
- Uhrbildschirm, der Zeitdetails anzeigt
- Alarmbildschirm, der Alarmdetails anzeigt
Zum Umschalten zwischen diesen beiden Bildschirmen haben wir in Magicbit einen beliebigen Druckknopf von zwei verwendet. Diese Tasten sind mit 35 (linke Taste) und 34 (rechte Taste) Pins des ESP32 in Magicbit verbunden. Um die Uhrzeit und andere Details anzuzeigen, haben wir das eingebaute OLED-Display in magicbit verwendet.
Lassen Sie uns darüber sprechen, wie diese Grafikbildschirme funktionieren.
Der Uhrbildschirm hat Analoguhr-, Digitaluhr-, Datums-, Monats- und Jahrestexte.
Zum Erstellen einer analogen Uhr verwenden wir einige Grafikfunktionen, die in der Grafikbibliothek namens Adafriut GFX verfügbar sind. Durch die Verwendung der Kreisfunktion und der Linienfunktion erstellen wir ein analoges Zifferblatt. Einfache geometrische Funktionen namens sin und cos werden für die Position der Uhrzeiger verwendet. Wir geben also nur den Winkel ein, der der Zeit für rotierende Hände entspricht. dazu wandeln wir die Zeit zunächst wie folgt in Winkel um.
- Winkel des Minutenzeigers=Minuten*(360/60)
- Winkel des Stundenzeigers=Stunden*(360/12)
Der Winkel, der in Bezug auf die Linie zwischen der Mitte des Zifferblatts und der Zahl 12 im Zifferblatt gemessen wird. Mit sin- und cos-Funktionen können wir die x- und y-Koordinaten der Enden der Stunden- und Minutenlinien berechnen. Das folgende Bild beschreibt, wie es funktioniert.
Nach Koordinaten drucken wir Stunden- und Minutenzeiger durch Ziehen von Linien. Es gibt auch eine Textdruckfunktion in der Adafruit GFX-Bibliothek. Es hilft, andere Details (Datum, Monat und Zeitanzeige in Ziffern) auf dem Display zu drucken. Sie können die Position der analogen Uhr und die Textpositionen ändern, indem Sie Parameter im Code ändern.
Wie als Uhrbildschirm haben wir die Textdruckfunktion in der Adafruit GFX-Bibliothek zum Drucken von Zahlen auf dem OLED-Display an geeigneten Stellen verwendet.
Schritt 5: Abrufen der Ortszeit
Der wichtigste Teil der Uhr ist, wie wir die Ortszeit genau ermitteln. Zu diesem Zweck können Sie ein externes RTC-Uhrenmodul oder eine eingebaute RC-Uhr in ESP32 in Magicbit verwenden. In diesem Projekt haben wir die zweite Methode verwendet. Bei dieser Methode verwenden wir den NTP-Client (Network Time Protocall), um die lokale Zeit aus dem Internet abzurufen. Für den Zugang zum Internet haben wir die eingebaute WIFI-Einrichtung im ESP32 verwendet. Daher verwenden wir in der ersten Phase WIFI für den Zugang zum Internet, indem wir SSID und Passwort angeben. Dann sollten wir gmtOffset und TageslichtOffset in Variablen in Sekunden konfigurieren. Die Werte dieser Variablen sind weltweit von Region zu Region unterschiedlich. gmtOffset bedeutet die Anzahl der Sekunden, die Sie von der GMT unterscheiden. Für die meisten Bereiche beträgt der TageslichtOffset 3600. Sie finden ihn im Internet. Nachdem wir die aktuelle Ortszeit bekommen haben, haben wir WIFI nicht mehr genutzt. Denn dann berechnen wir die lokale Zeit aus der eingebauten RC-Uhr in ESP32. Dies geschieht mithilfe der Bibliothek time.h. Es gibt ein einfaches Beispiel in Arduino (Arduino>Examples> ESP32> Time>simpletime), um zu erfahren, wie dies weiter funktioniert. Auch diese Links können Sie für weitere Informationen zum NTP-Client verwenden.
- https://dronebotworkshop.com/esp32-intro/
- https://lastminuteengineers.com/esp32-ntp-server-d…
Nachdem wir die Ortszeit korrekt erhalten haben, ändern wir unsere Zeit, indem wir Texte und Winkel entsprechend dieser Zeitinformationen in jeder Schleife anzeigen.
Schritt 6: Einrichten des Alarms
Durch Klicken auf die linke und rechte Schaltfläche können Sie die Auswahl von Datum und Uhrzeit des Alarms ändern. Stellen Sie sicher, dass Sie den Alarm ausschalten, wenn Sie Datum und Uhrzeit des Alarms ändern. Nachdem Sie Datum und Uhrzeit eingestellt haben, schalten Sie den Wecker ein. Denn wenn der Wecker eingeschaltet ist und die Weckzeit beim Einrichten mit Ihrer aktuellen Uhrzeit übereinstimmt, ertönt der Alarmsummer. In der Hauptschleife wird immer überprüft, ob die aktuelle Ortszeit und die Alarminformationen gleich sind. Wenn diese gleich sind, funktionieren der Summer und die eingebaute grüne LED in Magicbit eine Minute lang.
Schritt 7: Einrichten des Summers
Wir verwenden PWM-Impulse, um den Summerton zu erzeugen, indem wir die Funktion analogCwrite() im Code verwenden. Da alle Bibliotheksfunktionen in ESP32 sind gilt für Magicbit. Sie können den Signalton des Summers ändern, indem Sie seine Frequenz und den PWM-Wert im Code ändern.
techtutorialsx.com/2017/06/15/esp32-arduin…
Auf dieser Seite wird beschrieben, wie Summer mit ESP32 funktioniert.
Schritt 8: Tasten einrichten
Um alle Zustände zu ändern, haben wir zwei eingebaute Druckknöpfe in Magicbit verwendet. Hauptschleife prüft immer den Zustand von zwei Knöpfen. Da sie intern hochgezogen werden, ist der normale Zustand ein hohes Signal. So können Sie sehen, dass die Digitalanzeige dieser Pins 1 ist. In der Standardeinstellung zeigt das Display die Uhrschnittstelle an. Wenn zu diesem Zeitpunkt eine der beiden Tasten gedrückt wird, wechselt der Bildschirm zum Alarmbildschirm. Außerdem zählen wir die Zeit in Sekunden ab dem letzten Tastendruck. Wenn diese Zählung länger als eine vordefinierte Dauer ist, zeigt das Display den Uhrbildschirm an.
Der Code wird unter Verwendung grundlegender Funktionen für Anfänger geschrieben. Der Code ist also einfach zu verstehen und Sie können die Funktionsweise der Methode erlernen, indem Sie auf den Code verweisen.
Schritt 9: Fehlerbehebung
Manchmal wird die Uhr etwas später gestartet oder die Grafik wird nicht richtig angezeigt. Die folgenden Tipps helfen, die Situation zu lösen.
- Stellen Sie sicher, dass Sie die richtige SSID und das richtige Passwort angegeben haben
- Ändern Sie den NTP-Server (Sie können viele Server im Internet finden, die sich auf Ihre Region beziehen).
- Ändert die Internetverbindung. (auch mobiler Hotspot möglich).
Sie können auch alles mit dem seriellen Monitor beheben. Neben dem OLED-Display zeigt der serielle Monitor Zeitinformationen an.
Schritt 10: Arduino-Code
// Bibliotheken für OLED-Display
#enthalten
#include #include #define OLED_RESET 4 #include //WLAN-Bibliothek zum Verbinden #include "time.h" //Bibliothek zur Verwendung RC-Uhr //definiere Eingangs- und Ausgangspinnamen #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Summer 25 int preTime = 0; int zählt = 0; int aktuelleZeit = 0; struct tm timeinfo; const char* ssid = "IHRE SSID"; // WLAN-Details const char* password = "IHR PASSWORT"; int alarmDateTime[5] = {1, 1, 2020, 0, 0}; // Alarmvariablen int dateIndex = 0; int Zeitindex = 0; int selectIndex = -1; bool SummerOn = 0; intrecht[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}}; // Auswahlrechteck const char* ntpServer = "asia.pool.ntp.org"; // Serverdetails const long gmtOffset_sec = 19800; const int TageslichtOffset_sec = 0; Adafruit_SSD1306 display (128, 64); // OLED-Größe definieren Byte clockCenterY = (display.height () + 16) / 2; // analoge Ziffernblattdetails byte clockCenterX = (display.height () - 16) / 2; Byte-TaktRadius = 23; bool state = 0; // Bildschirm an oder aus boolean Alarm = 0; // aktueller Alarmzustand String alarmState = "Alarm ON"; // Alarm an oder aus // Variable gespeicherte Zeitdaten char dayName [10]; char-Tagesnummer[3]; Zeichenmonat[10]; Zeichenjahr[5]; Zeichenstunden[3]; Zeichenminuten[3]; char Monatsnummer[3]; Zeichen Sekunden [3]; // Schaltflächenvariablen bool RightState = 1; bool LeftState = 1; // Summervariablen int channel = 0; int-Frequenz = 2000; int-PWM = 200; int-Auflösung = 8; Void setup () {//set Input und Outputs pinMode (RightButton, INPUT); pinMode (Linke Taste, INPUT); PinMode (Grüne LED, AUSGANG); pinMode (Summer, AUSGANG); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // Anzeige initialisieren display.display(); Verzögerung (3000); display.clearDisplay(); ledcSetup (0, Frequenz, Auflösung); // PWM-Parameter konfigurieren ledcAttachPin (Buzzer, 0); Serial.begin (115200); // serielle Kommunikation intilisieren // mit WiFi verbinden Serial.printf ("Verbindung mit %s", ssid); WiFi.begin(ssid, Passwort); Während (WiFi.status () != WL_CONNECTED) { Verzögerung (500); Serial.print("."); } Serial.println("VERBUNDEN"); // init und die Zeit abrufen configTime (gmtOffset_sec, TageslichtOffset_sec, ntpServer); Zeit kriegen(); // WLAN trennen, da es nicht mehr benötigt wird WiFi.disconnect (true); WiFi.mode (WIFI_OFF); display.clearDisplay(); aufrechtzuerhalten. Void loop () { getTime (); // aktuelle Zeit abrufen // rechte und linke Drucktastenzustände speichern RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // Überprüfen Sie, ob die Tasten gedrückt werden, wenn (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // Wenn die Taste gedrückt wird, gibt der Summer eine Signaltonverzögerung aus (100); if (state == 0) {//in den Alarmbildschirm-Rahmenzustand wechseln = 1; // den Zustand in den Alarmzustand ändern RightState = LeftState = 1; // wir brauchen nur das Bild ändern } counts = 0; // Zähler zurücksetzen } if (state == 1 && (counts) < 5) {//if in Alarm screen and no timeoutcalculalarm();//berechnen Sie die Zeitwerte der Alarminformationen showAlarm();//show values } else {//if in clock Bildschirmzustand = 0; display.clearDisplay(); clockFace(); // Analoges Zifferblatt printLocalTime (); // Zeit im Zifferblatt drucken und andere Details drucken } onAlarm (); // Weckzeit mit Ortszeit vergleichen und Alarmverzögerung einschalten (100); // Verzögerung für Alarm ein und aus} void clockFace() {//caalog Zifferblatt display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // Uhrenkreis drucken für (int digit = 0; digit = 5) {// haben nur 5 selections.so auf -1 zurücksetzen (-1= ist alarn an oder aus) selectIndex = -1; } dateAndTimeSelection (selectIndex); // Auswahl ändern } void dateAndTimeSelection (int index) { if (index == -1) {//alarm ein oder aus if (RightState == 0) {// zwischen on und off alarm if (alarmState == "Alarm EIN") { alarmState = "Alarm AUS"; aufrechtzuerhalten. Sonst { alarmState = "Alarm EIN"; aufrechtzuerhalten. //index ist die auswahl } } int vergleich[4] = {12, 2030, 23, 59}; //obere Grenzen der Daten und Jahre int CompareMonat[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //obere Grenze der Monate int resetValue[4] = {1, 2020, 0, 0}; //Startwerte für (int i = 1; ich vergleiche[i - 1]) { alarmDateTime = resetValue[i - 1]; }} if (alarmDateTime[0] > Comparemonth[alarmDateTime[1] - 1]) {// Werte zurücksetzen, wenn Monate größer als ihre Grenzen sind alarmDateTime[0] = 1; aufrechtzuerhalten. aufrechtzuerhalten. Void showAlarm () {// Alarmdetails drucken String alarmDateTime0 = String (alarmDateTime [0]); // Stings konvertieren, um String anzuzeigen alarmDateTime1 = String (alarmDateTime[1]); String alarmDateTime2 = String(alarmDateTime[2]); String alarmDateTime3 = String(alarmDateTime[3]); String alarmDateTime4 = String(alarmDateTime[4]); // Wenn Werte eine 1-Stelle haben, fügen Sie "0" hinzu. if (alarmDateTime[0]