Heute wollen wir mit dem RGB-Led Ring der neu im Angebot von AZ-Delivery ist und einem D1-Mini eine Uhr bauen die über NTP synchronisiert wird. Die Zeiger werd durch verschiedene Farben symbolisiert. Sekundenzeiger = rot, Minutenzeiger = grün und Stundenzeiger = blau. Zur Anzeige wird diejenige der 12 Leds, die sich unter dem entsprechenden Zeiger befindet auf die Farbe des Zeigers geschaltet. Ist ein Zeiger zwischen zwei Leds, leuchten beide in der entsprechenden Farbe wobei jene, die näher am Zeiger ist, heller leuchtet.
Wenn ihr noch zusätzlich ein Trimmpotentiometer spendiert, könnt ihr auch die Helligkeit der Anzeige regeln. In dem Fall bitte die Auskommentierung der folgenden Zeile aufheben, indem ihr die Schrägstriche "/" am Zeilenanfang entfernt.
#define Potentiometer //uncomment om potentiometer voor helderheid te gebruiken
Ihr dürft auch nicht vergessen im Code eure Zugangsdaten bei "MYSSID" und "MYPWD" einzugeben.
Der Code:
#include <NeoPixelBus NeoPixelBus.H> bibliotheek voor led strip bibliotheken voor WiFi en NTP #include <ESP8266WiFi.H> #include <NtpClientLib (NtpClientLib).H> #include <TimeLib TimeLib TimeLib.H> NTP-serverinstallatie indien mogelijk lokale router gebruiken voor NTP-server snelle respons met een hogere beschikbaarheid #define NTP_SERVER "fritz.box" "pool.ntp.org" #define GMT_TIMEZONE 1 #define Daglicht Waar #define TIMEZONE_MINUTES 0 hier voeg uw toegangsgegevens toe #define MYSSID MYSSID "************" #define MYPWD "******************" #define Potentiometer uncomment om potentiometer voor helderheid te gebruiken Const uint16_t Aantal pixels = 12; in dit voorbeeld wordt uitgegaan van 12 pixels, waardoor het kleiner wordt, een fout veroorzaakt Const uint8_t Pixelpin = 2; zorg ervoor dat u dit instelt op de juiste pin, genegeerd voor Esp8266 initialiseer ledstripdriver NeoPixelBus NeoPixelBus<NeoGrbFeature NeoGrbFeature, Neo800KbpsMethode> Strip(Aantal pixels, Pixelpin); kleurdefinitie voor zwart om leds uit te schakelen Rgbcolor Zwarte(0); sommige globale vatriables Booleaanse Aangesloten = Valse; Bool wifiFirstConnected = Valse; uint8_t kleurVerzadiging = 64; maximale helderheid callback op WiFi aangesloten Void onSTAConnected (WiFiEventStationModeVerbonden ipInfo) { Seriële.Printf ("Verbonden met %s\r\n", ipInfo.Ssid.c_str ()); } callback op ip-adres NTP pas starten nadat ip-netwerk is aangesloten Void onSTAGotIP (WiFiEventStationModeGotIP ipInfo) { Seriële.Printf ("Got IP: %s\r\n", ipInfo.Ip.toString ().c_str ()); Seriële.Printf ("Verbonden: %s\r\n", Wifi.Status () == WL_CONNECTED ? "Ja" : "Nee"); wifiFirstConnected = Waar; vlag instellen om NTP in hoofdlus te starten Aangesloten = Waar; } Netwerkverbinding beheren Void onSTADisconnected (WiFiEventStationModusDisconnected event_info) { Seriële.Printf ("Losgekoppeld van SSID: %s\n", event_info.Ssid.c_str ()); Seriële.Printf ("Reden: %d\n", event_info.Reden); NTP.stop(); NTP-synchronisatie kan worden uitgeschakeld om synchronisatiefouten te voorkomen } callback op NTP-gebeurtenissen Void processSyncEvent (NTPSyncEvent_t ntpEvent) { Als (ntpEvent) { Seriële.Afdrukken ("Time Sync fout: "); Als (ntpEvent == noResponse) Seriële.println ("NTP-server niet bereikbaar"); Anders Als (ntpEvent == invalidAdres) Seriële.println ("Ongeldig NTP-serveradres"); } Anders { Serial.print ("Got NTP time: "); Serial.println (NTP.getTimeDateString (NTP.getLastNTPSync ())); } } Booleaanse syncEventTriggered = Valse; True als een tijdgebeurtenis is geactiveerd NTPSyncEvent_t ntpEvent; Laatst geactiveerde gebeurtenis deze functie krijgt de seconden van de dag en berekent de ledpositie en helderheid Void setTime(uint32_t Seconden) { array om RGB-waarden te verzamelen uint8_t Rode[12]; uint8_t Groene[12]; uint8_t Blauwe[12]; een leidde om de vijf seconden en twelfe leds op alle uint8_t led_s1 = Seconden / 5 % 12; tweede led is de volgende led of 0 als we het einde bereikt uint8_t led_s2 = (led_s1 < 11)?led_s1+1:0; één leidde om de 300 seconden en twelfe leds bij allen uint8_t led_m1 = Seconden / 300 % 12; uint8_t led_m2 = (led_m1 < 11)?led_m1+1:0; één leidde om de 3600 seconden en twelfe leds bij allen uint8_t led_h1 = Seconden / 3600 % 12; uint8_t led_h2 = (led_h1 < 11)?led_h1+1:0; voor de waarden voor seconden splitsen we het in 5 delen met 1 seconde uint8_t val_s = (Seconden % 5) * kleurVerzadiging /5; voor waarden voor minuten splitsen we het in 15 delen met 20 seconden uint8_t val_m = ((Seconden / 20) % 15) * kleurVerzadiging /15; voor waarden voor uren splitsen we het in 16 delen met 225 seconden uint8_t val_h = ((Seconden / 225) % 16) * kleurVerzadiging /16; Serial.printf("Sek = %i %i:%i:%i values %i:%i:%i \n",seconds,led_s1,led_m1,led_h1,val_s,val_m,val_h); nu vullen we de rgb arrays met 0 voor zwart Voor (uint8_t I = 0; I<12; I++) { Rode[I]=0; Groene[I]=0; Blauwe[I] =0; } vervolgens stellen we de waarden voor de leds zoals berekend voordat Rode[led_s1] = kleurVerzadiging - val_s; Rode[led_s2] = val_s; Groene[led_m1] = kleurVerzadiging - val_m; Groene[led_m2] = val_m; Blauwe[led_h1] = kleurVerzadiging - val_h; Blauwe[led_h2] = val_h; eindelijk bereiden we de stuurbuffer voor het verzenden naar de strip Voor (uint8_t I = 0; I<12; I++) { Rgbcolor Kolonel(Rode[I],Groene[I],Blauwe[I]); HslColor hcol hcol(Kolonel); Strip.SetPixelColor(I,hcol hcol); } } Void Setup() { Statische WiFiEventHandler WiFiEventHandler e1, e2, e3; Seriële.Beginnen(115200); Terwijl (!Seriële); wachten op seriële attach Seriële.println(); Seriële.println("Initialiseren..."); Seriële.Flush(); hiermee worden alle neopixels teruggezet naar een off-status Strip.Beginnen(); Strip.Toon(); Seriële.println(); Seriële.println("Aansluiten..."); Wifi.Modus(WIFI_STA); Wifi.Beginnen(MYSSID MYSSID, MYPWD); Ntp.onNTPSyncEvent ([](NTPSyncEvent_t Gebeurtenis) { ntpEvent = Gebeurtenis; syncEventTriggered = Waar; }); e1 = Wifi.onStationModeGotIP (onSTAGotIP);Zodra WiFi is aangesloten, start NTP Client e2 = Wifi.onStationModeDisconnected (onSTADisconnected); e3 = Wifi.onStationModeConnected (onSTAConnected); } time_t T; uint32_t S; Void Lus() { Opbrengst(); achtergrondtaken toestaan Statische Int Laatste = 0; Als (wifiFirstConnected) { als we verbonden zijn starten we NTP wifiFirstConnected = Valse; Ntp.Beginnen (NTP_SERVER, GMT_TIMEZONE, Daglicht, TIMEZONE_MINUTES); Ntp.setInterval (63); } Als (syncEventTriggered) { we kregen een NTP-evenement processSyncEvent (ntpEvent); syncEventTriggered = Valse; } Als (Aangesloten && ((millis () - Laatste) > 1000)) { #ifdef Potentiometer als we een potentiometer gebruiken voor helderheid lezen we de waarde van pin A0 kleurVerzadiging = analoogLezen(A0) /16; max = 64 #endif elke seconde werken we led strip Laatste = millis(); T = Ntp.getTime(); Als (T>0) { als we een tijd krijgen, berekenen we de seconden van de dag. S = Uur(T)*3600+Minuut(T)*60+Tweede(T); } Anders { anders verhogen we de seconden S++; } stel de leds en stuur het naar de strip setTime(S); Strip.Toon(); } }
Alle erforderlichen Bibliotheken können über die Arduino Bibliotheksverwaltung registriert werden:
Die Schaltung:
Die Schaltung ist ganz einfach. Der RX-Pin des ESP8266 wird wegen der DMA Möglichkeiten genutzt. Nicht wundern wenn während des Programm-Hochladens alle LED's weiß leuchten. Die Controller der WS2812 können mit den Daten auf der Seriellen Schnittstelle nichts anfangen. Das Potentiometer wird zwischen 3.3 V und Masse geschaltet. Der Schleifer kommt een A0.
Viel Spass beim Basteln.
26 Reacties
Christoph
Wenn diese Anleitung hier stehen bleiben soll, muss sie dringend überarbeitet werden. Für Anfänger ist sie so keineswegs geeignet. Abgesehen davon, dass die Bibliotheken NeoPixelBus_by_Makuna und NtpClientLib installiert werden muss, was nur bei sehr viel good will aus dem verschwommenen Screenshot zu sehen ist, sind auch noch die Bibliotheken Time-master und ESPAsyncUDP-master zu installieren. Und dann hagelt es Compilierungsfehler. Ich gebe auf.
Thomas
Ich habe jetzt stundenlang versucht das Ding zu Kompilieren .
Ich komme über #include nicht hinaus .
Library #include ESP8266WiFi hinzu gefügt und es kommen tausende Fehlermeldungen .
Wenn ich die eine bereinige kommt die nächste …
Wo finde ich die passende ESP8266WiFi ?
Gruß
Thomas
Michael
Super.
Danke für diesen Artikel.
Statt LedRing nehme ich ein Rest-Stück vom WS2812B-Stripe. Was ja Ansicht identisch ist.
Klappt alles auf Anhieb, nach dem die TimeLib besorgt und in Library-Verzeichnis gebracht wurde.
Danke nochmal.
Dirk
Hallo an Alle!
Nach einiger holperei mit den zu installierenden Libs klappt Kompilieren und Hochladen, aber da zuckt nicht eine LED. auch nicht während des Ladens.
Der serielle Monitor meldet das die Verbindung mit Fritz funktioniert, aber dann Dauerschleifen Meldung
Time Sync error:
Weiß jemand Rat ?
Gruß, Dirk
Gerald Lechner
Hallo Thomas, das sieht nach einem Problem mit dem NTP Server aus, das ist der Teil der UDP verwendet. Schau mal welche Meldungen der serielle Monitor ausgibt.
Eventuell solltest du das ESP8266 Paket in der Arduino IDE entfernen und neu installieren
Thomas
Hallo,
ich hatte nach längerer Zeit einen Fehler schon beim kompilieren (ESPAsyncUDP fehlt). Nach dem includieren dieser Bibliohek ist der Fehler weg, aber der Sketch lädt hoch auf den Mini D1 und die Uhr läuft nicht. Es leuchtet nur die 12-Uhr-LED weiß und die 14-Uhr
rot. Was könnte der Fehler sein ?
Harald
Nach langem Kampf hat soweit alles funktioniert, aber nun kommt immer Time Server nicht erreichbar. Ich benutze keine Fritz Box (ich habe den Speedport) und wenn ich
pool.ntp.org eintrage das gleiche. Wer weis Rat ? Vielen Dank !
Ingbert
Hallo Gerald, Danke für die Antwort & wäre echt klasse, wenn es eine Version mit WPS Modul geben wird. Dann wäre die Uhr ein 101%iges Geschenk :-)
Gerald
Zur TimeLib.h Bibliothek.: Die findet ihr auf GitHub https://github.com/PaulStoffregen/Time .
Einfach die ZIP Datei runterladen und entpackt in das Arduino libraries Verzeichnis kopieren.
Gerald
Zum stray Fehlermeldung: Diese Fehlermeldung besagt, dass im Code ein ungültiges Sonderzeichen vorkommt.
Manfred
Schönes Projekt, habe aber auch ich habe das problem beim kompelieren mit TimeLib.h wie kann ich diese einbinden?
Harald
Hallo! Ich bekomme beim Kompilieren immer die Fehlermeldung "NeoPixelBus_by_Makuna\src\internal\NeoEsp8266UartMethod.h:260:9: error: ‘swap’ is not a member of ‘std’
std::swap(_asyncPixels, _pixels);Weiß jemand Rat?
Thx!
Matthias
Kompilierungsfehler? Schon mal die “Was suchen Sie?” Leiste benutzt?! Die ist echt praktisch:
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/kodierungsfehler-schnell-beheben?ls=de
Gerolf Kunde
Schönes Projekt. Komme aber nicht über den Versuch des Kompilierenshinaus. Fehler stray 240 und 302.
Weiß jemand Rat?
Gerald
Hallo Ingbert
Leider müssen die Zugangsdaten in der vorliegenden Version für jedes WLAN gesetzt werden.
Man könnte jedoch WPS einsetzen um das Modul mit einem Router zu verbinden. Ich werde das mal versuchen und wenn ich erfolgreich bin einen Beitrag mit der WPS fähigen Uhr in diesem Blog posten.
Gerald
Hallo Deschdi für dein Gewächshaus Projekt würde ich dir die Beitragsserie zur Smart-Home Zentrale mit Ardui-Touch empfehlen. Das Projekt ist noch in Arbeit, wird aber wenn es fertig ist, all das können was du brauchst, also Webanbindung, NTP-synchronisierte Zeit und Datenlogging.
Ingbert
So die Teile sind bestellt, aber noch eine Frage
Wenn ich die Uhr mitnehmen, also in verschiedenen WLANs betreiben, möchte – muss ich jedes Mal den Code
=> //here add your access information
#define MYSSID “************”
#define MYPWD “******************”
anpassen & neu auf das Modul laden, oder gibt es da einen “Trick” ?
Thomas
Sehr schöne Idee, leider vermisse ich den Hinweis auf die TimeLib, die man nachinstallieren muß, da sonst schon das Kompilieren scheitert.
Ansonsten viele schöne Projekte mit ergänzenden, kostenlosen e-books.
Deschdi
Hi Gerald,
NTP via FritzBox ist ein echt nettes Projekt.
Ich würde die Temperatur- und Spannungs-Messwerte gerne an die FritzBox.NAS schicken via FTP Client, um den täglichen Temperaturverlauf im Gewächshaus zu erfassen.
Und anschließend imPC weiter zu verarbeiten.
Hast so etwas oder ähnliches in der Schublade?
Viel Spass beim Schaffa
Deschdi
Hi Gerald,
NTP via FritzBox ist ein echt nettes Projekt.
Ich würde die Temperatur- und Spannungs-Messwerte gerne an die FritzBox.NAS schicken via FTP Client, um den täglichen Temperaturverlauf im Gewächshaus zu erfassen.
Und anschließend imPC weiter zu verarbeiten.
Hast so etwas oder ähnliches in der Schublade?
Viel Spass beim Schaffa
Gerald
Den D1-Mini habe ich gewählt, da die Uhr über NTP gesetzt werden sollte.
wIWa
Nettes Projekt, mal fix getestet. Muss mir nur noch ne elegante “Einhausung” einfallen lassen. Statt des Potis kommt noch ne automatische Helligkeitsanpassung mit Fototransistor.
Bitte im Code die beiden abschließenden geschweiften Klammern nachtragen.
veit
top, schönes projekt und schöner code!
soweit ich mich erinnere nutzt die Neopixel lib nicht die fähigkeiten von rmt am esp32 (bitte korrigieren wenn die info veraltet ist) – das wäre dann noch ein punkt zum optimieren, falls man den chip gleichzeitig noch für andere aufgaben nutzt, gerade mit wifi nutzung flackern die leds dann gerne.
wäre großartig wenn ihr die anderen ring-größen auch noch in euren shop aufnehmt!
Mike
Nett aber warum einen D1? Wozu das WLAN? Das geht doch genau so gut mit einem Nano?!
Henning Lühken
Sehr schöne Idee – aber gerade der D1Mini ist im Moment ausverkauft!?!
Ingbert
Cooles Projekt – wollte gerade die Teile Bestellen, aber der D1 ist wohl ausverkauft :-/