zur Navigation springen


Projekt: LED-Uhr

ESP8266

erstellt 01.2019

Mir gefallen ausgefallene Uhren!
Eine Uhr mit Datumsanzeige aus LED’s und das Ganze mit einem ESP8266 ansteuern hat seinen Reiz.
Verwendet werden drei LED Ringe mit 12, 32 und 60 LED’s für Monat Tag und Stunden.


Da die Schaltung einfach ist, wird es sich hauptsächlich um die Programmerstellung drehen.



Der Innere Ring hat 12 LED und zeigen die Monate  
der Mittelere Ring hat 32 LRD und zeigen die Tage  
Der Äussere Ring zeigt die Stunden, Minuten und Sekunden  

Uhr an der Wand als Film

Materialien:


Wemos D1 Mini ESP8266
WS2812B RGB 5V LED Ring 60 LEDs Innen 156mm Außen 172mm Board Schwarz
WS2812B RGB 5V LED Ring 32 LEDs Innen 96mm Außen 112mm Board Schwarz
WS2812B RGB 5V LED Ring 12 LEDs Innen 36mm Außen 52mm Board Schwarz
    Die Ringe sind aus einem Stück!     Amazon.de
Christians Technikshop
https://www.christians-shop.de
5V Stromversorgung


Arduino IDE


Die Uhr habe ich in der Arduino IDE geschrieben, da es schon eine Bibliothek für die WS2812B gab, sowie einige Beispiele. Die Arduino IDE wie beschrieben installieren und die entsprechenden Bibliotheken laden.
Die benötigten Bibliotheken Adafruit_NeoPixel.h, NTPClient.h, ESP8266WiFi.h, WiFiUdp.h, Time.h, TimeLib.h unter Sketch / Bibliotheken einbinden / Bibliotheken verwalten einbinden.

Die IDE Einstellungen die verwendet werden:
  - Board: „WeMos D1 R1“
  - Flash Size: „4M (1M SPIFFS)“
  - Debug port: „Disabled“
  - Debug Level: „Keine“
  - IwIP Variant: "v2 Lower Menory"
  - CPU Frequency: "80 MHZ"
  - Upload Speed: „115200“
  - Erase Flash: Only Sketch"
  - Port: „COM6“

Verwendung findet das Standard Image mit AT-Befehlssatz für den Wemos D1 Mini ESP8266.


Grundschaltplan vom Wemos D1 Mini ESP8266 (ESP8266)


Das Programm sollte mit jedem ESP8266 funktionstüchtig sein!
Ich habe momentan den Wemos verwendet, möchte aber den ESP8266-01 fest verdrahten, weil ich es einfach toll finde mit welchen kleinen Platinen, so viel geschaffen werden kann.
Der Anschluss der Ringe an den ESP:
GND wird immer über den ESP - Ringe und 5V Stromversorgung verschaltet. Während der Programmierung ist es ratsam die Ringe mit einer eigenen 5V Stromversorgung zu betreiben, USB und ESP könnten nicht genug Power haben. Später kann ja nur die Stromversorgung verwendet werden. 5V an die Ringe durchschleifen. Vom ESP aus Pin14 (D5) an den DIN Ring60, DOUT Ring60 an den DIN Ring32 und vom DOUT Ring32 auf den DIN Ring12 verbinden. Die Datenleitung wird somit vom 60- auf den 32- und 12-Ring durchgeschleift.
Wenn ich noch Zeit finde werde ich einen Schaltplan erstellen.

Programm Besprechung


Der gesamte Quelltext ist hier zu finden.

Die meisten Programmodule habe ich mir zusammen gesammelt.
Es sind einige Module zusammen gekommen:
#include <NTPClient.h>
#include <Time.h>
#include <TimeLib.h>
#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

Die Farbwerte sind alle als Constanten herausgeführt worden.
//************* Optionen ******************************
                                  // Uhr Hintergrund Farben
const RGB U_Z  = { 64,  0, 64 };  // 12 
const RGB U_V  = { 32,  0, 20 };  // 3 6 9 
const RGB U_St = {  8,  0,  5 };  // 1,2,4,5,7,8,10,11 
const RGB U_HG = {  0,  0,  1 };  // Hintergrungfarbe
Die Variablen U_Z (Uhr Zwölf) wird mit den Farbwerten RGB 64,0,64 vesorgt, die Farbwerte Rot Grün Blau fallen bei LED's anders aus wie am Bildschirm und sollten niedriger gewählt werden. Einfach mal testen.

Die Zeitkonstante für Deutschland ist schon mal gesetzt worden.
const int hours_Offset_From_GMT = 1;  // Der Stunden Aufschlag zu GMT

Die wichtigen WLAN Parameter sind hir zu finden.
// WLAN Verbindungsparameter Passwort
const char *ssid      = "wulff";
const char *password  = "3689483812276369"; 

Die Deklaration von Neopixel.
//************* NeoPixel ******************************
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(104, PIN, NEO_GRB + NEO_KHZ800);  
für die Ringe 60,32 und 12 ergibt sich eine LED Zahl von 104.
Für unseren ESP8266, wozu der WiMos gehöhrt ist der Processor Parameter NEO_GRB + NEO_KHZ800.

Das Setup:
//************* Setup ******************************
void setup() {
  Serial.begin(115200);       // Fehlersuche ermöglichen
  pixels.begin();             // NeoPixel-Bibliothek initialisiert.
  Pixel_Reset(1,0,0);         // rot
  WiFi.begin(ssid, password); // mit WLAN verbinden
  Pixel_Reset(0,0,1);         // blau
  while ( WiFi.status() != WL_CONNECTED )
    delay ( 500 );            // WLAN Verbindung abwarten
  Pixel_Reset(0,1,0);         // grün
  SetClockFromNTP();          // Zeit hohlen vom NTP-Server mit Zeitzonen-Korrektur
  Pixel_Reset(0,0,0);         // aus
}
Serial.begin(115200); in Verbindung mit Serial.println(Beispiel()); ermöglicht die Fehlersuche über die Serielle Schnittstelle (Wie in alten Zeiten ;-)).
Pixel_Reset(1,0,0); gibt über LED's den Programmzustand aus und kann Hinweise zur Fehlersuche geben.

//************* Hauptprogramm Schleife  ******************************
void loop() {
  time_t t = now();       // Holt sich die aktuelle Uhrzeit
  Pixel_Datum(t);         // eventuell nicht ganz passend
  Pixel_Uhr(t);
//  Serial.println(month()); Debug Ausgaben
  delay(400);             // 0,8 Sekunden warten
  if (minute(t) == 0) {   // jeder Stunden die Uhrzeit vom Zeitserver hohlen und aktualisieren
    SetClockFromNTP();    // Holt sich die Zeit vom NTP-Server mit Zeitzonen-Korrektur
    delay(400);             // 0,8 Sekunden warten
    if (second(t) <= 1)   // Nur einmal das Lichtspiel
      Pixel_Reset(0,0,0); // Lichtspiel, aus
  }
}
Das Lichtspiel zu jeder vollen Stunde, habe ich lange Zeit zur Fehlersuche verwendet, wenn es stört kann es einfach auskommentieren (//).

void Pixel_Reset(byte r,byte g,byte b)
Diese Funktion ist für das Lichtspiel verantwortlich.
(und wird nochmal mit Regenbogenfarben verbessert)

Die Ausgabe der Uhr
void Pixel_Uhr(time_t t){                                               // ### Uhr                   
startet hier.
Neopixel verwendet ein Array für jeden Pixel für die 3 Farbwerte.
Wenn alle Farben der Ringe gesetzt sind kann mit
  pixels.show(); // Alle Pixel anzeigen
die Ausgabe erfolgen.
Somit kann zu erst der Hintergrund gezeichnet werden und anschließend die Zahlen, die Monats- und Tagesaufteilungen.
Am Schluß kommt der Sekundenzeiger.
Die Minuten- und StundenZeiger werden mit 3 LED's ausgegeben um Sie besser zu finden.
Wenn die Zeiger übereinander laufen, verlaufen die Zeiger ineinander, somit kann dieses leichter erkannt werden.
Die Tage und Monate werden nur zur vollen Stunde neu ausgegeben.
Die 12, 3, 6 und 9 werden heller (anders) angezeigt, durch die Constanten kann jedes Farbschema leicht ausgegeben werden.
Die eigenen Ideen sind hier leicht zu verwircklichen.

Wie ich gehört habe, könnte die Uhr falschrum laufen, weil die Hardware eventuell linksrum addressiert wird. Sollte das der Fall sein könnte vor der Ausgabe alles umgedreht werden.
int ClockCorrect(int Pixel)
{
  if (ClockGoBackwards == 1)
    return ((60 - Pixel +30) % 60);
  else
    return (Pixel);
}
(nicht getestet!)


Uhr mit Datum aufhängen


Uhr Rückseite mit Verdrahtung
An den ESP kommt nur noch eine Stromversorgung, die PC - USB hat bei mir nur an einem Port ausgereicht (Verwende ein USB-Ladebetzteil).


Viel Spass

Matthias Wulff


Mögliche Verbesserungen
sind zB. ein Webserver über den die Zugangsdaten für das Internet eingestellt werden können.
Der gleiche Webserver könnte auch als Menü für die Farbgebungen usw... verwendet werden.


Seitenanfang