Noch eine Wordclock Wortuhr

Teil 2

void DisplayMode(){
  switch (DisplayModeNo){
    case 0:    
      if(currentMillis - prevMillisRainbow >= RainbowSpeed){
        prevMillisRainbow = currentMillis; 
        CurrentPalette = RainbowColors_p;
        ColorIndex++;
      }
      break;
    case 1:
      fill_solid(CurrentPalette, 16, Color1);
      break;
    case 2:
      fill_solid(CurrentPalette, 16, Color2);
      break; 
    case 3:
      fill_solid(CurrentPalette, 16, Color3);
      break;
    case 4:
      fill_solid(CurrentPalette, 16, Color4);
      break;
    case 5:
      fill_solid(CurrentPalette, 16, Color5);
      break;
    case 6:
      fill_solid(CurrentPalette, 16, Color6);
      break;
    case 7:
      fill_solid(CurrentPalette, 16, Color7);
      break;
    case 8:
      fill_solid(CurrentPalette, 16, Color8);
      break;
    case 9:
      fill_solid(CurrentPalette, 16, Color9);
      break;
    case 10:
      fill_solid(CurrentPalette, 16, Color10);
      break;
    case 11:
      fill_solid(CurrentPalette, 16, Color11);
      break;
    case 12:
      fill_solid(CurrentPalette, 16, Color12);
      break;
    case 13:
      fill_solid(CurrentPalette, 16, Color13);
      break;
    case 14:
      fill_solid(CurrentPalette, 16, Color14);
      break;
    case 15:
      fill_solid(CurrentPalette, 16, Color15);
      break;
    case 16:
      fill_solid(CurrentPalette, 16, Color16);
      break;
  }
}

void DisplayOnOff(){
  if(HourSW == OnTimeH && MinuteSW == OnTimeM && NightMode == true ){
    NightMode = false;
    SetBrightness = 255; 
  }
  if(HourSW == OffTimeH && MinuteSW == OffTimeM && NightMode == false){
    NightMode = true;
    SetBrightness = 0; 
  } 
  if (Timeout == true){
    SetBrightness = 255;
    if(currentMillis - prevMillisTimeout >= DisplayTimout){
      prevMillisTimeout = currentMillis; 
      SetBrightness = 0;
        Timeout = false;
    }
  }
}

Teil 3

/*

Draft by Markus Backes
111                                        112          .                             .

       0  1  2  3  4  5  6  7  8  9  10                      E S K I S T L F Ü N F
       21 20 19 18 17 16 15 14 13 12 11                      Z E H N Z W A N Z I G
       22 23 24 25 26 27 28 29 30 31 32                      D R E I V I E R T E L
       43 42 41 40 39 38 37 36 35 34 33                      T G N A C H V O R J M
       44 45 46 47 48 49 50 51 52 53 54                      H A L B Q Z W Ö L F P
       65 64 63 62 61 60 59 58 57 56 55                      Z W E I N S I E B E N
       66 67 68 69 70 71 72 73 74 75 76                      K D R E I R H F Ü N F
       87 86 85 84 83 82 81 80 79 78 77                      E L F N E U N V I E R
       88 89 90 91 92 93 94 95 96 97 98                      W A C H T Z E H N R S
   109 108 107 106 105 104 103 102 101 100 99                B S E C H S F M U H R

110                                        113          .                             .


Definitions:
P_  = Point
W_  = Word
M_  = Minute
H_  = Hour

*/ 
 
 
/*
1st we defined the minutes ponits and the words in "German"
*/

void P_EINS(){
  leds[111]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);
}

void P_ZWEI(){
  leds[111]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  leds[112]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
}

void P_DREI(){
  leds[111]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  leds[112]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  leds[113]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
}

void P_VIER(){
  leds[110]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  leds[111]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  leds[112]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  leds[113]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
}

void W_ES_IST(){
  leds[0]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  leds[1]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  leds[3]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  leds[4]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  leds[5]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);
}

void W_VOR(){
  for (int i=35; i <= 37; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);
  } 
}

void W_NACH(){
  for (int i=38; i <= 41; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void W_UHR(){
  for (int i=99; i <= 101; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void M_HALB(){
  for (int i=44; i <= 47; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void M_VIERTEL(){
  for (int i=26; i <= 32; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void M_FUENF(){
  for (int i=7; i <= 10; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void M_ZEHN(){
  for (int i=18; i <= 21; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);   
  }
}

void M_ZWANZIG(){
  for (int i=11; i <= 17; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  }
}

void H_EIN(){
  for (int i=61; i <= 63; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);   
  }
}

void H_EINS(){
  for (int i=60; i <= 63; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void H_ZWEI(){
  for (int i=62; i <= 65; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);   
  }
}

void H_DREI(){
  for (int i=67; i <= 70; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);   
  }
}

void H_VIER(){  
  for (int i=77; i <= 80; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void H_FUENF(){
  for (int i=73; i <= 76; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  }
}

void H_SECHS(){
  for (int i=104; i <= 108; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void H_SIEBEN(){
  for (int i=55; i <= 60; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void H_ACHT(){
  for (int i=89; i <= 92; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }
}

void H_NEUN(){
  for (int i=81; i <= 84; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);  
  }

}

void H_ZEHN(){
  for (int i=93; i <= 96; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);   
  }
}

void H_ELF(){
  for (int i=85; i <= 87; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending);   
  }
}

void H_ZWOELF(){
  for (int i=49; i <= 53; i++){
    leds[i]=ColorFromPalette(CurrentPalette, ColorIndex, Brightness, Blending); 
  }
}

Teil 4

void ShowWords(){  
  MinuteSW = minute();
  HourSW = hour();    
  DaySW = day();     
  FastLED.clear();     
  Minute5RestSW=MinuteSW%5;                             
  Minute5SW=MinuteSW-Minute5RestSW;                           
  if (HourSW>=13){                                   
    DisplayHourSW=HourSW-12;            
  }
  if (Minute5RestSW==1) P_EINS();                   
  else if (Minute5RestSW==2) P_ZWEI();
  else if (Minute5RestSW==3) P_DREI();
  else if (Minute5RestSW==4) P_VIER();
  W_ES_IST();
  if (Minute5SW==5||Minute5SW==25||Minute5SW==35||Minute5SW==55){
    M_FUENF();
  }
  if (Minute5SW==10||Minute5SW==50){
    M_ZEHN();
  }
  if (Minute5SW==15||Minute5SW==45){
    M_VIERTEL();
  }
  if (Minute5SW==20||Minute5SW==40){
    M_ZWANZIG();
  }        
  if (Minute5SW==25||Minute5SW==30||Minute5SW==35){
    M_HALB();
  }
  if (Minute5SW==0){  
    W_UHR();
  }
  if (Minute5SW==5||Minute5SW==10||Minute5SW==15||Minute5SW==20||Minute5SW==35){
    W_NACH();
  }
  if (Minute5SW==25||Minute5SW==40||Minute5SW==45||Minute5SW==50||Minute5SW==55){
    W_VOR();
  }
  DisplayHourSW=HourSW;
  if (MinuteSW>=25){                                          
    if (HourSW==0||HourSW==12){                                
      DisplayHourSW=1;
    }
    else
      DisplayHourSW=HourSW+1;
  }
  if (DisplayHourSW==1&&Minute5SW==0) H_EIN();               
  else if (DisplayHourSW==1 || DisplayHourSW==13) H_EINS();                   
  else if (DisplayHourSW==2 || DisplayHourSW==14) H_ZWEI();
  else if (DisplayHourSW==3 || DisplayHourSW==15) H_DREI();
  else if (DisplayHourSW==4 || DisplayHourSW==16) H_VIER(); 
  else if (DisplayHourSW==5 || DisplayHourSW==17) H_FUENF();
  else if (DisplayHourSW==6 || DisplayHourSW==18) H_SECHS(); 
  else if (DisplayHourSW==7 || DisplayHourSW==19) H_SIEBEN(); 
  else if (DisplayHourSW==8 || DisplayHourSW==20) H_ACHT();  
  else if (DisplayHourSW==9 || DisplayHourSW==21) H_NEUN();
  else if (DisplayHourSW==10 || DisplayHourSW==22) H_ZEHN();
  else if (DisplayHourSW==11 || DisplayHourSW==23) H_ELF();
  else if (DisplayHourSW==12 || DisplayHourSW==24|| DisplayHourSW==0) H_ZWOELF();
  FastLED.show();
}

Teil 5

void SyncSystemTime(){ // Function to Sync the System Time from RTC
  time_t RTCTime = RTC.get();
  if(SummerTime(RTCTime) == true){
    setTime(RTCTime+3600);
  } else {
      setTime(RTCTime);
    }
} 
  
void SyncRTCTime(){ // Function to Sync the RTC Time from NTP via WIFI
  if(CheckOnlineStatus() == true){
    LastDaySW = DaySW;
    time_t NTPTime = getNtpTime();
    if(SummerTime(NTPTime) == true){
      RTC.set(NTPTime-3600);  
    } else {
        RTC.set(NTPTime);
      }
  }
}

void SyncTimer(){ // Function for Sync Interval
  currentMillis = millis();
  unsigned long currentMillisSST = millis();
  unsigned long currentMillisSRT = millis();
  if(currentMillisSST - previousMillisSST >= intervalSST) {
    previousMillisSST = currentMillisSST; 
    SyncSystemTime();
  } 
  if(HourSW == SyncHour && DaySW != LastDaySW ){
    SyncRTCTime(); 
  } 
}

// Code by jurs from arduino forum
boolean SummerTime(time_t t){ // Function to check Summer / Winter Time
  tmElements_t tm; 
  breakTime(t, tm); 
  if (tm.Month<3 || tm.Month>10) return false; 
  if (tm.Month>3 && tm.Month<10) return true; 
  if (tm.Month==3 && tm.Day<25) return false; 
  if (tm.Month==10 && tm.Day<25) return true; 
  if (tm.Month==3 && (tm.Hour + 24 * tm.Day)>=(1 + 24*(31 - (5 * tm.Year /4 + 4) % 7)) 
     || tm.Month==10 && (tm.Hour + 24 * tm.Day)<(1 + 24*(31 - (5 * tm.Year /4 + 1) % 7)))
    return true;
  else
    return false;
}

time_t getNtpTime() { // Function to get NTP Time in time_t format
  esp8266_ntp.setGMTOffset(GMTOFFSET);
  return esp8266_ntp.getTime();
}

boolean CheckOnlineStatus(){ // Function to check WIFI connectivity
  Serial.println("AT+CWJAP?");
  if(!Serial.find(WIFI_SSID)) {
    return false;
  }
  Serial.println("AT+CIPNTP?"); 
  if(!Serial.findUntil("Time: ", " ")) { 
  return false;
  }
return true;
}

Teil 6

void TouchLogic(){
  if(FrontTouch() == true && NightMode == false){
      delay(250);
      SyncSystemTime();
      DisplayModeNo++; 
    if(DisplayModeNo > 16){
      ColorIndex = 3;
      DisplayModeNo = 0;
    }
  }
  if(FrontTouch() == true && NightMode == true){
      SyncSystemTime();
      delay(250);
      Timeout = true;
  }   
}

// code by jurs from arduino forum
boolean FrontTouch(){
  static boolean TouchDown = false;
  boolean CurrentTouch;
  if (TouchDown) {
    CurrentTouch=(FrontTouchSensor.capacitiveSensor(50)>HystMinus);
  } else { 
      CurrentTouch=(FrontTouchSensor.capacitiveSensor(50)>HystPlus);
    }
  if (CurrentTouch && !TouchDown) 
    TouchDown=true;
    else if (!CurrentTouch && TouchDown) 
      TouchDown=false;
  return TouchDown;
}

So, das war´s. Hoffe jemand kann mit dem Code was anfangen. Der Code wird noch umgebaut bzw. ich versuche es ^^

Ziel soll später sein die Farben via Browser zu ändern.

Hallo Zusammen

Ich bin schon seit längeren schon auf diese, mit einfachen Teilen, gebaute Wortuhr aufmerksam geworden. Ich habe mal die Grundlegenden Teile auf einem Breadboard verkabelt und getestet. Leider bekomme ich das Programm nicht zum Laufen. Die Fastled Beispiele laufen allesamt und alles leuchtet so wie es muss. Ich habe die Software die im ersten Post von diesem Artikel auf Instructabels verlinkt ist verwendet. Alles ist dort schön und sauber aufgeteilt so dass ich es auch nachvollziehen kann was passiert.Schaue ich mir die die ganze Sache am Oszi an werden die Led auch schön mit Daten versorgt bei 800khz. Kann es sein, dass ich wenn ich auf Hochladen klicke nur der Programmteil hochgeladen wird der aktuell offen ist? Das Programm hat insgesamt 3 tabs welche alle mit .ino Enden? Ich verwende die aktuellste Arduino Software und als Board habe ich ein Uno am laufen. Habt Ihr irgendwelche Ideen?

Dort ist ein kleiner "erstinbetiebnahme" Bug drinnen. Die Helligkeitswerte der LED sind im EEPROM gespeichert. Bei einem Jungfräulichen UNO liegen dort nullen.

Bau mal in das void setup()

      EEPROM.write(0, 255);
      EEPROM.write(1, 255);
      EEPROM.write(2, 255);

einmal Hochladen dann stehen da Werte drinnen dann dürft es gehen. Wenn du was siehst kannst diese Zeilen wieder löschen und das "normale" Programm rein. Gruß DerDani

Ich sollte ein IBN Pin reinbringen der bei Start und LOW auf dem Eingang die EEPromwerte schreibt

Hallo Volvodani

Besten Dank für deine Hilfe. Ich dachte mir schon so was weil die Kommunikation zu den Leds eigentlich gut aussah. Sie hatten einfach die Aufgabe mit der Helligkeit 0 zu leuchten was sie auch taten! ;-)

Gruss

Achtung in der Software befindet sich noch ein kleiner Bug In der Zeit von 13:00 - 13:04 wird "ES IST EINS UHR" angezeigt in der Zeile 238: if (hhdisplay==1&&mm5er==0) H_EIN();    in if ((hhdisplay==1||hhdisplay==13)&&mm5er==0) H_EIN();    ändern Gruß DerDani

Klasse Projekt! Gute Idee!

Zum Uhr-Stellen könnte man auch mit dem ESP8266 die Google-Zeit holen:

#include <ESP8266WiFi.h>

const char* ssid = "deine SSID";
const char* password = "dein Passwort";

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





  //Serial.println(getTime());
  Serial.println(getTime().substring(17, 25));
  delay(9000);
  Serial.println(getTime().substring(17, 25));
}



void loop() {
}





  
String getTime() {
  WiFiClient client;
  while (!!!client.connect("google.de", 80)) {
    Serial.println("connection failed, retrying...");
  }

  client.print("HEAD / HTTP/1.1\r\n\r\n");
 
  while(!!!client.available()) {
     yield();
  }

  while(client.available()){
    if (client.read() == '\n') {    
      if (client.read() == 'D') {    
        if (client.read() == 'a') {    
          if (client.read() == 't') {    
            if (client.read() == 'e') {    
              if (client.read() == ':') {    
                client.read();
                String theDate = client.readStringUntil('\r');
                client.stop();
                return theDate;
              }
            }
          }
        }
      }
    }
  }
}





void initWifi() {
   Serial.print("Connecting to ");
   Serial.print(ssid);
   if (strcmp (WiFi.SSID(),ssid) != 0) {
      WiFi.begin(ssid, password);
   }

   while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
   }
  Serial.print("\nWiFi connected, IP address: ");
  Serial.println(WiFi.localIP());
}

Hallo,

weil es nicht so schwer war- als Anregung für die die vielleicht noch unentschlossen sind.
Der Support war schnell und hilfreich :slight_smile:

Ohne viel Aufwand und mit geringen Mitteln!

Das Ganze hat nicht mal 30€ gekostet.

Viel Spaß beim Nachbau

Dani’s WordUhr

Frontplatte_DE.pdf (257 KB)

Ich habe die Uhr auch nachgebaut. Danke für die Top Anleitung. Ich habe nur für 4 LEDs an den Ecke weggelassen. Aber die sollten für die Funktion ja nicht entscheidend sein.

Nur leider bekomm ich die Zeit nicht eingestellt.

Kann mir jemand die Vorgehensweise über die Reed-Kontakte erklären? Welche Reihenfolge?

Am Quell-Code muss ich keine Veränderungen vornehmen zum Uhrzeit einstellen? Abgesehen von der erwähnten Zeile 238 für den "13Uhr" - Fehler.