Wortuhr programier problem

Hallo zusammen !
ich bn ein absoluter Neueinsteiger (mit ein wenig Programmierkenntnissen)

Ich komm aber nicht weiter :confused:
… Habe eine wortuhr mit dem arduino gebaut
nach der Anleitung von
[Arduino + Neopixel Word Clock - Super Make Something Episode 6 ]](Arduino + Neopixel Word Clock - Super Make Something Episode 6 - YouTube)

funktioniert alles soweit, auch eine Umsetztung auf 120 Ws2318B Led ins Deutsche klappte,
nur bekomme ich hier ein Problem mit der Zeitdarrstellung :

Im Script ist irgendwo ‚Äú25 nach voll " und 25 vor voll‚ÄĚ definiert,ich m√∂chte, das es aber ‚Äúf√ľnf vor halb‚ÄĚ und ‚Äúf√ľnf nach halb‚ÄĚ heisst und dargestellt wird .

Ist das möglich ?

Ich weiss das es irgendwie möglich ist …
gibt es hier jemanden der sich das mal anscheun kann und
mir netterweie dabei helfen kann ?

Code hab ich mal angehangen

Danke im vorraus

LG
Andy

wordClockCodeAndy-10x12.ino (10.3 KB)

Ich habe schon zwei Verschieden Wortuhren gebaut die zweite auch mit WS2812B. Schaue mal hier >KLICK< da habe ich alles dokumentiert.
Dort ist auch der Sketch incl. aller Definitionen

Gruß
DerDani

Danke ! die hatte ich mir angeschaut und zum nachbauen vorgemerkt tolles Teil ! und Danke f√ľr die Anleitung in die Sketche.

Es dauert noch ein wenig bis einige der Teile da sind!
Solange hab ich mich an die Lösung ohne DS3231 RTC Modul gemacht, seint alles stabil zu laufen.
leider mit dem oben beschriebenen Problem,wäre zuviel verlangt das mir dabei einer hilft?

Zumindset ist der Ansatz f√ľr ein WE Projekt nicht uninteresant.
Es kommt mir zwwar nicht auf den Euro an, den man sparen kann, aber wenn es auch ohne läuft
Ist es f√ľr Anf√§nger vielleicht genau das richtige :wink:

Danke f√ľr deine Hilfe

LG Andy

,wäre zuviel verlangt das mir dabei einer hilft?

Noch ein bisschen Geduld deine Frage ist erst 8h online und die meisten Arbeiten ja.
Gruß
DerDAni

aldikiller:
Code hab ich mal angehangen

Wenn es möglich ist (also der Code nicht zu lang ist), setze bitte Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *).
Das kannst Du auch noch nachträglich durch Editieren tun.
Der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

Gruß Tommy

Danis Uhr kann gar nicht "F√úNFUNDZWANZIG" sondern nur "F√úNF VOR HALB".
Ich verstehe dein Problem also nicht.

@DerDAni :Sorry Dani ! das war als kleine Bitte gedacht…will nicht aufdringlich sein… Danke :slight_smile: freu mich ja das ich Hilfe bekomme !

@michael_x- Today: Danis Code ist nicht das Problem ich hab keinen "DS3231 RTC Modul " und wollte das nur mit dem Arduino machen und da passte der Code nicht. ich hab doch einen anderen Code siehe unten …trotzdem Danke

@ Tommy56 : Danke
Hier der gew√ľnschte Code

#include <Time.h>
#include <TimeLib.h>

#include <Time.h>
#include <TimeLib.h>

/* 
  
*/
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#include "Time.h"

// Which pin on the Arduino is connected to the NeoPixels?
#define PIN           6


#define NUMPIXELS     120


Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);


#define MINUSFIVEMINS 4
#define PLUSFIVEMINS  5

//Declare pins for addition button 5V/GND sources
#define BUTTONLEDMINUS_GND1 8
#define BUTTONLEDMINUS_GND2 9
#define BUTTONLEDPLUS_GND1 10
#define BUTTONLEDPLUS_GND2 11

#define BUTTONLEDMINUS_5V1 A0
#define BUTTONLEDMINUS_5V2 A1
#define BUTTONLEDPLUS_5V1 A2
#define BUTTONLEDPLUS_5V2 A3

// Current and previous states for button pins -- in setup initialize all to HIGH
int minusPrevState=HIGH;
int minusCurrState=HIGH;
int plusPrevState=HIGH;
int plusCurrState=HIGH;

// Time variables
int h;
int m;
int s;

// RGB color variables
int red=0;
int green=0;
int blue=255;

void setup()
{

  pinMode(MINUSFIVEMINS, INPUT_PULLUP); 
  pinMode(PLUSFIVEMINS, INPUT_PULLUP); 
  pinMode(BUTTONLEDMINUS_GND1, OUTPUT); 
  pinMode(BUTTONLEDMINUS_GND2, OUTPUT); 
  pinMode(BUTTONLEDPLUS_GND1, OUTPUT);
  pinMode(BUTTONLEDPLUS_GND2, OUTPUT); 
  pinMode(BUTTONLEDMINUS_5V1, OUTPUT); 
  pinMode(BUTTONLEDMINUS_5V2, OUTPUT); 
  pinMode(BUTTONLEDPLUS_5V1, OUTPUT); 
  pinMode(BUTTONLEDPLUS_5V2, OUTPUT);
  
  digitalWrite(BUTTONLEDMINUS_GND1, LOW);
  digitalWrite(BUTTONLEDMINUS_GND2, LOW); 
  digitalWrite(BUTTONLEDPLUS_GND1, LOW); 
  digitalWrite(BUTTONLEDPLUS_GND2, LOW); 
  digitalWrite(BUTTONLEDMINUS_5V1, HIGH); 
  digitalWrite(BUTTONLEDMINUS_5V2, HIGH); 
  digitalWrite(BUTTONLEDPLUS_5V1, HIGH); 
  digitalWrite(BUTTONLEDPLUS_5V2, HIGH); 
  
 setTime(4,17,0,1,5,2017); //Initialize current time as Midnight/noon 08/31/2015
  pixels.begin();
  Serial.begin(9600);
  
}

void loop()
{
  
  //Declare integer array with size corresponding to number of Neopixels in chain
  int individualPixels[NUMPIXELS]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  
  /* Check for button presses & reset time if necessary */
  minusCurrState=digitalRead(MINUSFIVEMINS); //Get current state of MINUSFIVEMINS button
  /* If current state is different from previous state and value is now LOW, subtract five minutes from current time */
  if ((minusCurrState!=minusPrevState) && (minusCurrState==LOW)){
    adjustTime(-5*60); //Shift time five minutes backwards
    minusPrevState=minusCurrState;
  }
  else{
   minusPrevState=minusCurrState; 
  }
  
  plusCurrState=digitalRead(PLUSFIVEMINS); //Get current state of PLUSFIVEMINS button
  /* If current state is different from previous state and value is now LOW, add five minutes from current time */
  if ((plusCurrState!=plusPrevState) && (plusCurrState==LOW)){
    adjustTime(5*60); //Shift time five minutes forwards
    plusPrevState=plusCurrState;
  }
    else{
   plusPrevState=plusCurrState; 
  }
    
  /* Get current time */
  h=hourFormat12();    // Returns the hour of current time between 1-12
  m=minute();        // Returns the minute of current time
  s=second();        // Returns the second of current time (not used, included for completeness)
  
  Serial.print(h);
  Serial.print(":");
  Serial.print(m);
  Serial.print(":");
  Serial.println(s);

  /* Parse time values to light corresponding pixels */
  individualPixels[11]=1; //Light "E"
  individualPixels[10]=1; //Light "S" 
  individualPixels[8]=1; //Light "I"
  individualPixels[7]=1; //Light "S"
  individualPixels[6]=1; //Light "T"
 
  
  /* Minutes between 0-5 - Light "O CLOCK" */
  if ((m>=0 && m<5)){
    individualPixels[95]=1;
    individualPixels[94]=1;
    individualPixels[93]=1;
  }
  
  /* Minutes between 5-10 or 55-60 - Light "FIVE," "MINUTES" */
  if ((m>=5 && m<10) || (m>=55 && m<60)){
    individualPixels[32]=1;
    individualPixels[33]=1;
    individualPixels[34]=1;
    individualPixels[35]=1;
  }
  
  /* Minutes between 10-15 or 50-55 - Light "TEN," "MINUTES" */
  if ((m>=10 && m<15) || (m>=50 && m<55)){
    individualPixels[19]=1;
    individualPixels[20]=1;
    individualPixels[21]=1;
    individualPixels[22]=1;
  }
  
  /* Minutes between 15-20 or 45-50 - Light "VIERTEL" */
  if ((m>=15 && m<20) || (m>=45 && m<50)){
    individualPixels[12]=1;
    individualPixels[13]=1;
    individualPixels[14]=1;
    individualPixels[15]=1;
    individualPixels[16]=1;
    individualPixels[17]=1;
    individualPixels[18]=1;
  }
  
  /* Minutes between 20-25 or 40-45 - Light "ZWANZIG," "MINUTES" */
  if ((m>=20 && m<25) || (m>=40 && m<45)){
    individualPixels[29]=1;
    individualPixels[28]=1;
    individualPixels[27]=1;
    individualPixels[26]=1;
    individualPixels[25]=1;
    individualPixels[24]=1;
    individualPixels[30]=1;
  }  
  
/* Minutes between 25-30 or 35-40 - Light "zwanzig," "fuenf," "MINUTEn" */
  if ((m>=25 && m<30) || (m>=35 && m<40)){
    
    individualPixels[32]=1;
    individualPixels[33]=1;
    individualPixels[34]=1;
    individualPixels[35]=1;
    individualPixels[29]=1;
    individualPixels[28]=1;
    individualPixels[27]=1;
    
    individualPixels[26]=1;
    individualPixels[25]=1;
    individualPixels[24]=1;
    individualPixels[30]=1;
    individualPixels[31]=1;
  }
 
  /* Minutes between 30-35 - Light "Halb" */
  if ((m>=30 && m<35)){
    individualPixels[0]=1;
    individualPixels[1]=1;
    individualPixels[2]=1;
    individualPixels[3]=1;
  }
  
  /* Minutes between 5-35 - Light "nach" */
  if ((m>=5) && (m<35)){
    individualPixels[36]=1;
    individualPixels[37]=1;
    individualPixels[38]=1;
    individualPixels[39]=1;
  }
  
  /* Minutes between 35-60 - Light "vor" & MODIFY CURRENT HOUR VALUE */
  if (m>=35){
    individualPixels[40]=1;
    individualPixels[41]=1;
    individualPixels[42]=1;
    h++; //Add 1 from current hour
    /*Set time to twelve for hour around midnight, noon */
    if (h==0){
      h=12; 
    }
    /*Corner case for 12:35-12:59 */
    if (h==13){
      h=1;
    }
  }

  /* Hour=1 - Light "eins" */
  if (h==1){
    individualPixels[45]=1;
    individualPixels[46]=1;
    individualPixels[47]=1;
  }
  
  /* Hour=2 - Light "zwei" */
  if (h==2){
    individualPixels[43]=1;
    individualPixels[44]=1;
    individualPixels[45]=1;
    individualPixels[46]=1;
  }
  
usw

aldikiller:
@michael_x- Today: Danis Code ist nicht das Problem ich hab keinen "DS3231 RTC Modul " und wollte das nur mit dem Arduino machen und da passte der Code nicht. ich hab doch einen anderen Code siehe unten ..trotzdem Danke

Dann w√ľrde ich eine RTC dran machen sonst hast du nicht lange Spa√ü mit der Uhr.

Warum ? die Uhr funktioniert doch muss nur immer am strom sein ? geht der Arduino etwa falsch ?

Nun, so besonders "genau" ist der Arduino nicht.
Bei einer Uhr, die, wie die Wortuhr, die Zeit nur in 5-Minuten-Intervallen anzeigt, fällt das vielleicht nicht so schnell auf, aber nach einiger Zeit wird auch hier die Uhrzeit "aus dem Tackt" laufen - vielleicht nach ein paar Tagen.
Wenn das f√ľr dich OK ist, dann brauchst du wirklich kein Real-Time-Clock-Modul.

Mein Großvater, er war Schneider, hat noch jeden Morgen die Uhr in seiner Werkstatt nach der Uhr am Kirchturm gestellt ("synchronisiert"). Um die Uhr am Kirchturm zu sehen musste er ein paar Schritte vor das Haus machen. Die Werkstattuhr ging jeden Tag um ein paar Minuten falsch, aber das lag damals, Ende der 1960er Jahre, anscheinend noch voll innerhalb der "Toleranzgrenze" :slight_smile:

Die ersten Quarzuhren zu vern√ľnftigen Preisen, gab es ja erst ein paar Jahre sp√§ter.
Heute sind sehr genaue Uhren der Standard und so etwas Ungenaues wie diese Werkstattuhr w√ľrden wahrscheinlich die wenigsten von uns akzeptieren. :slight_smile:

Ein Real Time Clock Modul mit DS3231 ist eine wirklich feine Sache:

  • Sie geht pro Jahr nur wenige Sekunden falsch.
  • Hat eine Backup-Batterie, die daf√ľr sorgt, dass die Uhr auch ohne externe Stromversorgung weiterl√§uft.
  • Die Backup-Batterie h√§lt sehr lange (mehrere Jahre).

Kleine Korrektur die Wortuhr zeigt Zeiten Minuten genau an. Meine erste Variante hatte eine RTC DS1307 und die ging im Monat bis zu 1 Minute falsch und es war mir nervig das man alle 2-3 Monate "ran" musste in der heutigen Zeit. Deswegen ist eine DS3231 reingekommen.
Die Alternative ist einen ESP8266-01 zu nehemen die mit eriner NTP (NetworkTimeProtocol) Software zu flashen und in deinem WLAN Anmelden und dann 1-2 mal am Tag sync'en dann kannst du auch ohne RTC.

Komplett ohne Uhr Modul musst nach jedem Strom weg neu stellen.

Gruß
DerDani

@ uxomm :Danke f√ľr die kleine Erkl√§rung ! Kann ich mir deinen Grossvater mal ausleihen ... der gef√§llt mir !

na klar will ich die uhr nicht immer stellen .. teile sind ja auch schon geordert ..dauert nur ein wenig...

@ DerDani nen ESP8266-01 hab ich sogar hier . aber wie ich den programieren soll weiss ich noch nicht ...

kennst du da ein Tutorial oder hast f√ľr mich nen link ?

Danke euch

HIER ist alles was du brauchst incl wie man das umsetzten muss.
Gruß
DerDani