Wörteruhr

Hi
Ich habe mir vorgenommen eine Wörteruhr zu bauen. Das habe ich auch gemacht nun fehlt nur noch der Code. Ich habe lange recherchiert wie man am besten die richtigen Led's zur richtigen Zeit leuchten lässt, habe aber nichts richtiges gefunden. Wie kann ich das am besten machen? Also das um 14.06 die richtigen Leds Leuchten?

Die Zeit bekomme über einen NTP Server:

#include <NTPClient.h>
// change next line to use with another board/shield
#include <ESP8266WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

const char *ssid     = "*********";
const char *password = "**************";

WiFiUDP ntpUDP;

// You can specify the time server pool and the offset (in seconds, can be
// changed later with setTimeOffset() ). Additionaly you can specify the
// update interval (in milliseconds, can be changed using setUpdateInterval() ).
NTPClient timeClient(ntpUDP, "ch.pool.ntp.org", 3600, 60000); // für Zeitverschiebung vileicht offset verändern (hier 7200) (3600 im Februar/winter)

void setup(){
  Serial.begin(115200);

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();

    Serial.print(timeClient.getHours());
    Serial.print(":");
    Serial.print(timeClient.getMinutes());
    Serial.println();

  delay(1000);
}

Das funktioniert soweit

Danke fürs helfen
Elektrocrafter10

Hi

Deine Zugangsdaten zu Deinem WLan sollten schon Mal hier weg - Die gehen Niemanden sonst was an.
Oha - DAS nenne ich Mal einen durchdachten Sketch - da ist ja rein GAR NICHTS drin enthalten.

Ok - Zu Deinem Problem: Steuere die richtigen LED zur richtigen Zeit an.

Leider ist keine genauere Antwort möglich, da weder Dein Sketch, noch sonst was auch nur ansatzweise erkennen lassen können, WAS Du überhaupt verbaut hast.

Bis jetzt hast Du die Stunden und Minuten ... immerhin.

MfG

Es kommt ja auch darauf an, wie die Worte angeordnet sind und in welcher Sprache.
Im Netz gibt es viele komplette Bauanleitungen dazu. Die könnte man zuerst als Basis nehmen.

Gruß Tommy

postmaster-ino:
Hi

Deine Zugangsdaten zu Deinem WLan sollten schon Mal hier weg - Die gehen Niemanden sonst was an.
Oha - DAS nenne ich Mal einen durchdachten Sketch - da ist ja rein GAR NICHTS drin enthalten.

Ok - Zu Deinem Problem: Steuere die richtigen LED zur richtigen Zeit an.

Leider ist keine genauere Antwort möglich, da weder Dein Sketch, noch sonst was auch nur ansatzweise erkennen lassen können, WAS Du überhaupt verbaut hast.

Bis jetzt hast Du die Stunden und Minuten ... immerhin.

MfG

Ich verwende einen Adafruit Feather HUZZAH um 114 Adafruit Neopixels anzusteuern.
Hast du das gemeint?

Und hier ein kleiner Denkansatz. Sketch ist auch auf der Seite.
>Klick<
Gruß
DerDani

OT: am Freitag ist meine 16x16 Matrix gekommen, ihr bringt mich da auf eine ganz andere Idee als ursprünglich geplant ^^

Ja, manche Ideen kommen einfach so :wink:

Gruß Tommy

Am einfachsten machst Du es mit einem Array.
Einfach die entsprechung der Zahlen 0 bis 12 und der Viertelstunden.
Grüße Uwe

HI
Ich habe mir mal einen Weg überlegt wie ich den Code aufbauen soll.

Ich habe mir überlegt einen array zu machen, indem ich für jede LED mit true und false (also ein bool array) angeben kann ob sie leuchten muss oder nicht. Die Zeit habe ich von einem NTP-Server(oben der Sketch). Um den Status für jede LED festzulegen habe ich mir gedacht das ich eine if schleife pro LED mache, in der ich die Uhrzeiten angebe bei denen die LED leuchten soll und dass dann für jede LED. Gibt es da eine einfachere/bessere Lösung für?Würde es zu lange gehen so viele if schleifen immer wieder zu durchlaufen?
anders gesagt Wie kann ich am besten den richtigen LED status (true oder false) zu jeder LED in den array einspeichern?

Meine Variante kommt mir ein bisschen umständlich vor.

Danke fürs Helfen

Schau Dir als erstes mal die Buchstabenaufteilung bei bestehenden Wortuhr-Bauanleitungen an.
Da ist ein gewisses System dahinter, dass Du nicht nochmal erfinden musst. Es gibt auch verschiedene Sprachen und Dialekte.

Da Du nur eine Ein-/Aus-Information pro LED brauchst, kannst Du evtl. dafür einzelne Bits nutzen.
Dafür gibt es die Bit-Macros.
Dann müsstest Du erst mal wissen, wie viele LED Du brauchst.

Es gibt 2 Ansätze: Alle LEDs für jeweils 5 Minuten oder, wie Uwe schon schrieb, die Leds der Zahlen, vor nach und was es sonst noch braucht und dann die Umrechnung der Zeit in diese Infos.

Ich sage es nochmal: Schau Dir die bestehenden Bauanleitungen an und verstehe sie.
Du kannst natürlich auch einen völlig eigenen Weg gehen, der wird aber wohl ziemlich einsam werden.

Viele if wirst Du nicht brauchen. Es gibt übrigens keine if-Schleifen.

Gruß Tommy

Tommy56:
Schau Dir als erstes mal die Buchstabenaufteilung bei bestehenden Wortuhr-Bauanleitungen an.
Da ist ein gewisses System dahinter, dass Du nicht nochmal erfinden musst. Es gibt auch verschiedene Sprachen und Dialekte.

Das weiss ich schon, ich habe die Wortuhr schon gebaut, bin aber mit dem Code immer wieder gescheitert

Tommy56:
Es gibt 2 Ansätze: Alle LEDs für jeweils 5 Minuten ...

Meinst du damit dass ich für jede Fünf minuten schon im voraus festlege welche LEDs leuchten. Also Blöcke mit den LEDs machen die leuchten müssen und diese den 5 Minuten Schritten zuordnen?

Hi

Die Wort-Uhr zeigt die Zeit in 5-er Schritten an.
Also nicht 'Zwölf Uhr Dreiunddreißig', sondern 'Fünf nach halb Zwölf'.
DAS sind die 5er - und dort ist recht sicher, welche LED in welcher Reihenfolge dran kommt.

MfG

Ich verwende einen Adafruit Feather HUZZAH um 114 Adafruit Neopixels anzusteuern.

Die Neopixel sind RGB LED mit integrierten Controller. Darum kann jede LED einzeln in der Farbe und Helligkeit angesteuert werden. Da ist es wenig sinnvoll eine LED nur ein und auszuschalten sondern für jede LED ein 3 Byte Wert geben. So kann man Farbspiele machen und auch die Wörter farblich unterscheiden.

Die einzelnen Zahlen entsprechen ja bestimmten LED-Gruppen. ZB die eins von 89 bis 83, die zwei von 67 bis 70 ecc.
Du kannst 2 mehrdimensionale Arrays anlegen, eines für die Stunden und eins für die Minuten in 5er Schritten.
Mehrdimensional weil du einfach alle LED angibst diefür die entsprechende Zahl eingeschalten werden sollen.

Grüße Uwe

Ich hatte mich auch mal rangesetzt und das Rad neu erfunden.
War eine Super Sache, weil ich einfach eine Menge gelernt habe.
Die freien Stellen in der Matrix habe ich gefüllt um "Akku voll", "Akku leer" und "raznz_snasna" schreiben zu können.
Das "große Loch" war um die Außenhelligkeit zu messen und dann die Uhr zu Dimmen. Dies habe ich aber nicht zum laufen bekommen.

Ich frage einen RTC wie spät es ist, aber vielleicht kannst du dir eine Idee abschauen. Ich habe WS2812 genommen, um bei Bedarf bunt zu werden.

Zusammengefasst:
Ich frage wie spät es ist
Teile die Minuten, um 5 minuten schritte zu bekommen
Entscheide anhand des "Minutenschritts" ob ich die aktuelle oder nächste Stunde schreiben muss (10 nach FÜNF oder viertel SECHS)
und lass die passenden LEDs für die Stunde bzw. Minutenschritte anzeigen.

noch ein paar Ausnahmen um nicht Fünf nach null oder halb 13 zu vermeiden und fertig ist die Geschichte.

#include <Wire.h>
#include <DS3231.h>
#include <FastLED.h>

CRGB leds[100];

int stunde = 0;
int schritt = 0;
int schrittAlt = 0;
int dimMax = 250;
int dimMin = 3;
long dimAkt = dimMax;
int dimZeit = 7000;
int dimGeschw = 1;

int helligkeit = A2;
int dunkel = 1030;    // ab hier wird ausgeschalten
int hell = 200;       // unter dem ist volle Helligkeit
int akkuLeer = A3;  //unter 750 = ein, über 750 = aus
int akkuVoll = A6;
int ladeBuchse = 9; //wird geladen
int schalterEins = 2; //für Sommerzeit
//int schalterZwei = 3;


int analogGedreht;
int bereich;
float faktor;
int ergebnis;

bool boolAkkuLeer;
bool boolAkkuLaed;
bool boolAkkuVoll;


bool boolfuenf;
bool boolzehn;
bool boolvor;

...


long longRaznz = 0x0000FF;
long longStrich = 0x90EE90;
long longSnasna = 0x008000;
long longEs = 0x7F4F00;

....

RTClib RTC;


DS3231 Clock;

byte Year;
byte Month;
byte Date;
byte DoW;
byte Hour;
byte Minute;
byte Second;

void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW,
                  byte& Hour, byte& Minute, byte& Second) {
  // Call this if you notice something coming in on
  // the serial port. The stuff coming in should be in
  // the order YYMMDDwHHMMSS, with an 'x' at the end.
  boolean GotString = LOW;
  char InChar;
  byte Temp1, Temp2;
  char InString[20];

  byte j = 0;
  while (!GotString) {
    if (Serial.available()) {
      InChar = Serial.read();
      InString[j] = InChar;
      j += 1;
      if (InChar == 'x') {
        GotString = HIGH;
      }
    }
  }
  Serial.println(InString);
  // Read Year first
  Temp1 = (byte)InString[0] - 48;
  Temp2 = (byte)InString[1] - 48;
  Year = Temp1 * 10 + Temp2;
  // now month
  Temp1 = (byte)InString[2] - 48;
  Temp2 = (byte)InString[3] - 48;
  Month = Temp1 * 10 + Temp2;
  // now date
  Temp1 = (byte)InString[4] - 48;
  Temp2 = (byte)InString[5] - 48;
  Day = Temp1 * 10 + Temp2;
  // now Day of Week
  DoW = (byte)InString[6] - 48;
  // now Hour
  Temp1 = (byte)InString[7] - 48;
  Temp2 = (byte)InString[8] - 48;
  Hour = Temp1 * 10 + Temp2;
  // now Minute
  Temp1 = (byte)InString[9] - 48;
  Temp2 = (byte)InString[10] - 48;
  Minute = Temp1 * 10 + Temp2;
  // now Second
  Temp1 = (byte)InString[11 ] - 48;
  Temp2 = (byte)InString[12] - 48;
  Second = Temp1 * 10 + Temp2;
}


void setup () {
  Serial.begin(9600);
  Wire.begin();
  FastLED.addLeds<NEOPIXEL, 3>(leds, 100);
  FastLED.setBrightness( dimMax );
  pinMode(ladeBuchse, INPUT); //Ladeanzeige
  pinMode(schalterEins, INPUT); //Sommerzeit
  //pinMode(schalterZwei, INPUT);

  //RAZNZ_SNASNA erscheinen lassen


  leds[20] = longRaznz;
  leds[22] = longRaznz;
  leds[42] = longRaznz;
  leds[46] = longRaznz;

.....


  for (int i = 0 ; i < 256 ; i ++) {
    FastLED.setBrightness(i);
    FastLED.show();
    delay(50);
  }
  delay(1000);
}

void loop () {
  //delay(1000);

  //zurücksetzen

  boolfuenf = LOW;
  boolzehn = LOW;
  boolvor = LOW;
  boolnach = LOW;

...

  //Helligkeit errechnen

  if (analogRead(helligkeit) > dunkel) {
    dimAkt = 0;
  }
  else if (analogRead(helligkeit) < hell) {
    dimAkt = dimMax;
  }
  else {
    analogGedreht = dunkel - analogRead(helligkeit); // bei 1 = ganz dunkel, bei "hell" ist ganz hell
    bereich = dimMax - dimMin;
    faktor = (float)bereich / (dunkel - hell);
    ergebnis = analogGedreht * faktor;
    dimAkt = ergebnis + dimMin;
  }
  FastLED.setBrightness(dimAkt);

  

  delay(1000);

  // Stunde errechnen
  DateTime now = RTC.now();
  stunde = now.hour();

  //Schritt errechnen
  schritt = (now.minute() + 2) / 5 + 1;
  //Dimmen starten?
  if (schritt > schrittAlt) {
    // Dimmgeschwindigkeit auf dimZeit.
    dimGeschw = dimZeit / dimAkt;

    for (int zaehler = dimAkt ; zaehler > 0 ; zaehler --) {
      FastLED.setBrightness( zaehler );
      FastLED.show();
      delay(dimGeschw);
    }
    FastLED.clear();
    FastLED.show();
    delay(2000);
  }

  //Stunde anpassen
  if (digitalRead(schalterEins) == HIGH) { //Sommerzeit?
    stunde = stunde + 1;
    if (stunde == 25) stunde = 1; //der nächste Tag)
  }
  if (stunde >= 13) stunde = stunde - 12; //aus 24 mach 12

  if (schritt >= 4) //wenn die Zeit der nächsten Stunde gemeint ist
  {
    stunde = stunde + 1;
    if (stunde == 13) stunde = 1;  //wenn es viertel 13 wird
  }

  //welche Informationen soll er zeigen?

  if (schritt == 2 || schritt == 6 || schritt == 8 || schritt == 12) boolfuenf = HIGH;
  if (schritt == 3 || schritt == 5 || schritt == 9 || schritt == 11) boolzehn = HIGH;
  if (schritt == 5 || schritt == 6 || schritt == 11 || schritt == 12) boolvor = HIGH;
  if (schritt == 2 || schritt == 3 || schritt == 8 || schritt == 9) boolnach = HIGH;
  if (schritt >= 5 && schritt <= 9) boolhalb = HIGH;
  if (schritt == 10) booldrei = HIGH;
  if (schritt == 4 || schritt == 10) boolviertel = HIGH;
  if (schritt == 2 || schritt == 3 || schritt == 11 || schritt == 12) boolum = HIGH;
  if (schritt == 1 || schritt == 13) booluhr = HIGH;


  //LEDs ansteuern
  FastLED.clear();

  if (1 == 1)  leds[0] = longEs;
  if (1 == 1)  leds[1] = longEs;
  if (1 == 1)  leds[2] = longIst;
  if (1 == 1)  leds[3] = longIst;
  if (1 == 1)  leds[4] = longIst;
  if (1 == 2)  leds[5] = longAkku;
  if (boolzehn == HIGH)  leds[6] = longFuenfZehn;
  if (boolzehn == HIGH)  leds[7] = longFuenfZehn;
  if (boolzehn == HIGH)  leds[8] = longFuenfZehn;
  if (boolzehn == HIGH)  leds[9] = longFuenfZehn;


  if (booldrei == HIGH)  leds[19] = longUmDreiViertelHalb;
  if (boolfuenf == HIGH)  leds[18] = longFuenfZehn;
  if (boolfuenf == HIGH)  leds[17] = longFuenfZehn;
 
....

  if (1 == 2)  leds[94] = longAkku;
  if (1 == 2)  leds[93] = longAkku;
  if (booluhr == HIGH)  leds[92] = longUhr;
  if (booluhr == HIGH)  leds[91] = longUhr;
  if (booluhr == HIGH)  leds[90] = longUhr;

  FastLED.show();


  //bei Schrittwechsel wieder hochdimmen
  if (schritt > schrittAlt) {
    for (int zaehler2 = 0 ; zaehler2 < dimAkt ; zaehler2 ++) {
      FastLED.setBrightness( zaehler2 );
      FastLED.show();
      delay(dimGeschw);
    }
  }

  schrittAlt = schritt;

}

Als besondere Spielereien erscheint beim Einschalten "raznz_snasna" und ich dimme den alten Text aus, schalte dann um und dimme den neuen Text wieder hoch. Sieht klasse aus :cry:

Hi danke für die antworten

Ich habe eure Ideen probiert umzusetzen, jedoch hat nichts geleuchtet. Wie ich jetzt herausgefunden habe hat es die Zeit falsch übernommen. Jetzt versuche ich die Zeit anders zu kriegen(zwar immer noch von einem NTP-Server aber nun auf eine andere Art).
Ich habe mich an Beispiele aus dem Internet(zu dieser Library) gehalten.

Hier der Code:

#include <NTPClient.h>
// change next line to use with another board/shield
#include <ESP8266WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

const char *ssid     = "********";
const char *password = "**********";

WiFiUDP ntpUDP;

// You can specify the time server pool and the offset (in seconds, can be
// changed later with setTimeOffset() ). Additionaly you can specify the
// update interval (in milliseconds, can be changed using setUpdateInterval() ).
NTPClient timeClient(ntpUDP, "ch.pool.ntp.org", 3600, 60000);
String formattedDate;
void setup(){
  Serial.begin(115200);

  WiFi.begin(ssid, password);   

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();
  formattedDate = timeClient.getFormattedDate();
  Serial.println(formattedDate);
  Serial.println(timeClient.getFormattedTime());

  delay(1000);
}
void zeit() {
int splitT = formattedDate.indexOf("T");
// Extract time
timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
Serial.println(timeStamp);
}

Bei der Zeile ( formattedDate = timeClient.getFormattedDate(); ) kommt jetzt der Fehlercode: 'class NTPClient' has no member named 'getFormattedDate'

Reicht es nicht wenn ich die Library einfach einbinde. auch bei dem selben Code aus dem Internet-Beispiel kommt diese Meldung.

Danke fürs helfen

Es gibt verschiedene NTPClient-Libs.

Gruß Tommy

Hi

Auch solltest Du das Passwort zu Deinem WLan etwas mehr geheim halten.

MfG

Tommy56:
Es gibt verschiedene NTPClient-Libs.

Gruß Tommy

Ich habe die gleiche Bibliothek eingebunden die im Beispiel erwähnt wird

Entweder das stimmt nicht oder einer der beiden Codes wurde mittlerweile verändert.
Das sehen wir ohne Deine Infos nicht.

Gruß Tommy

Tommy56:
Entweder das stimmt nicht oder einer der beiden Codes wurde mittlerweile verändert.
Das sehen wir ohne Deine Infos nicht.

Gruß Tommy

Was für informationen meinst du?

Das ist die Seite: Getting Date and Time with ESP32 (NTP Client) | Random Nerd Tutorials
und das mein code:

#include <NTPClient.h>
// change next line to use with another board/shield
#include <ESP8266WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>


const char *ssid     = "************";
const char *password = "**************";

WiFiUDP ntpUDP;

// You can specify the time server pool and the offset (in seconds, can be
// changed later with setTimeOffset() ). Additionaly you can specify the
// update interval (in milliseconds, can be changed using setUpdateInterval() ).
NTPClient timeClient(ntpUDP, "ch.pool.ntp.org", 3600, 60000);
String formattedDate;
void setup(){
  Serial.begin(115200);

  WiFi.begin(ssid, password);   

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();
  formattedDate = timeClient.getFormattedDate();
  Serial.println(formattedDate);
  Serial.println(timeClient.getFormattedTime());

  delay(1000);
}
void zeit() {
int splitT = formattedDate.indexOf("T");
// Extract time
timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
Serial.println(timeStamp);
}

Danke fürs Helfen