Big Clock: Zeitanzeige auch in Sekunden

hallo, ich habe ein kleines problem mit einer grossen uhr. nun ich habe im internet ein project gefunden um eine grosse uhr zu bauen. diese habe ich nachgebaut und es funktioniert prima. http://www.instructables.com/id/Big-auto-dim-room-clock-using-arduino-and-WS2811/

ich moechte diese software umschreiben, dass sie mir stunden, minuten und sekunden anzeigt. wenn ich ab zeile 90 stunden als minuten und minuten als sekunden definiere funktioniert die anzeige der minuten und sekunden jedoch fehlt dann stunden. int GetTime(){ tmElements_t Now; RTC.read(Now); int hour=Now.Hour; int minutes=Now.Minute;

//int hour=Now.Minute; //int minutes=Now.Second;

int second =Now.Second;

obwohl schon sekunden definiert sind, werden diese nicht angezeigt. (ich habe die anzeige schon auf 6 digit erweitert) vielleicht kann mir jemand helfen, dass ich stunden, minuten und sekunden angezeigt bekomme.

jetzt schon vielen dank fuer jegliche bemuehungen.

danke mfg selli

Und wie soll die Hilfe funktionieren, ohne den gesamten Sketch (das Programm;)) zu sehen?

Gruß

MiReu

Hier mal der Originalsketch:

#include <DS3232RTC.h>
#include <Time.h> 
#include <Wire.h> 
#include "FastLED.h"
#define NUM_LEDS 29 // Number of LED controles (remember I have 3 leds / controler
#define COLOR_ORDER BRG  // Define color order for your strip
#define DATA_PIN 6  // Data pin for led comunication

CRGB leds[NUM_LEDS]; // Define LEDs strip
byte digits[10][7] = {{0,1,1,1,1,1,1},  // Digit 0
                     {0,1,0,0,0,0,1},   // Digit 1
                     {1,1,1,0,1,1,0},   // Digit 2
                     {1,1,1,0,0,1,1},   // Digit 3
                     {1,1,0,1,0,0,1},   // Digit 4
                     {1,0,1,1,0,1,1},   // Digit 5
                     {1,0,1,1,1,1,1},   // Digit 6
                     {0,1,1,0,0,0,1},   // Digit 7
                     {1,1,1,1,1,1,1},   // Digit 8
                     {1,1,1,1,0,1,1}};  // Digit 9 | 2D Array for numbers on 7 segment
bool Dot = true;  //Dot state
bool DST = false; //DST state
int ledColor = 0x0000FF; // Color used (in hex)
void setup(){ 
//  Serial.begin(9600); 
//  Wire.begin(); 
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // Set initial brightness
  pinMode(2, INPUT_PULLUP); // Define DST adjust button pin
  pinMode(4, INPUT_PULLUP); // Define Minutes adjust button pin
  pinMode(5, INPUT_PULLUP); // Define Hours adjust button pin
} 
// Get time in a single number, if hours will be a single digit then time will be displayed 155 instead of 0155
int GetTime(){
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object 
  int hour=Now.Hour;
  int minutes=Now.Minute;
  int second =Now.Second;
  if (second % 2==0) {Dot = false;}
    else {Dot = true;};
  return (hour*100+minutes);
  };

// Check Light sensor and set brightness accordingly
void BrightnessCheck(){
  const byte sensorPin = 3; // light sensor pin
  const byte brightnessLow = 5; // Low brightness value
  const byte brightnessHigh = 255; // High brightness value
  int sensorValue = digitalRead(sensorPin); // Read sensor
  if (sensorValue == 0) {LEDS.setBrightness(brightnessHigh);}
  else {LEDS.setBrightness(brightnessLow);}  
  };
  
// Convert time to array needet for display 
void TimeToArray(){
  int Now = GetTime();  // Get time
  int cursor = 29;
  
//  Serial.print("Time is: ");Serial.println(Now);
  if (DST){   // if DST is true then add one hour
   Now+=100;
//   Serial.print("DST is ON, time set to : ");Serial.println(Now);
  }; 
  if (Dot){leds[14]=ledColor;}
    else {leds[14]=0x000000;
    };
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // get last digit in time
    if (i==1){
//      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor =22;
      for(int k=0; k<=6;k++){ 
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    else if (i==2){
//      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor -=14;
      for(int k=0; k<=6;k++){ 
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    else if (i==3){
//      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =7;
      for(int k=0; k<=6;k++){ 
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    else if (i==4){
//      Serial.print("Digit1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =0;
      for(int k=0; k<=6;k++){ 
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    Now /= 10;
  }; 
};
void DSTcheck(){
   int buttonDST = digitalRead(2);
//   Serial.print("DST is: ");Serial.println(DST);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
//      Serial.print("Switching DST to: ");Serial.println(DST);
      }
      else if (!DST){
        DST=true;
//        Serial.print("Switching DST to: ");Serial.println(DST);
      };
   delay(500);   
   };
  }

void TimeAdjust(){
  int buttonH = digitalRead(5);
  int buttonM = digitalRead(4);
  if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
      if (buttonH == LOW){
        if (Now.Hour== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
    RTC.write(Now); 
    }
  }
void loop()  // Main loop
{ 
  BrightnessCheck(); // Check brightness
  DSTcheck(); // Check DST
  TimeAdjust(); // Check to se if time is geting modified
  TimeToArray(); // Get leds array with required configuration
  FastLED.show(); // Display leds array
}

Stell doch mal deinen geänderten ein, damir wir sehen können was Du gemacht hast.
So, wie ich das gesehen habe, musst Du noch mehr ändern. Z.B. in GetTime musst Du die Sekunden zurückliefern (ungetested: return (hour10000+minutes100+second); )

Vermutlich musst Du noch mehr ändern (TimeToArray auf 6 Stellen erweitern)

hallo

nun ich habe den sketch auf 6 digit erweitert habe auch die anzeige erweitert.
bekomme aber nix vernuenftiges angezeigt.

ja bei GetTime muss was geaendert werden damit schon die sekunden mit im
seriellen monitor erscheinen :slight_smile:
ca. zeile 190
Serial.print("Time is: ");Serial.println(Now);

es werden nur stunden und minuten geliefert.
die anzeige liefert immer an den ersten beiden stellen eine 0
3. stelle zeigt die 10er stelle der stunden
4. stelle bleibt dunkel
5. stelle und 6. stelle zeigt korrekt die minuten

Brightness Low
Time is: 1101
Digit 6 is : 1 000011111000000000000001111
Digit 5 is : 0 000011111111111111111111111
Digit 4 is : 1 000011111000000000000001111
Digit 3 is : 1 000011111000000000000001111
Digit 2 is : 0 000011111111111111111111111
Digit 1 is : 0 000011111111111111111111111

mfg selli

uhr_023-4x7x6-ok.ino (10.3 KB)

Hast Du ein 10A Netzteil?

hallo

ja da haengt ein PC netzteil mit 5V 21A dran und ist auch eingeschaltet :-))

mfg selli

hallo

der tipp von Moko war schon richtig.
(ungetested: return (hour10000+minutes100+second); )

ich habe nun mal:
return (hour*100);
gesetzt.
anzeige: 00:13.00 also voellig korrekt.

setze ich:
return (hour*100+second);
anzeige: 00:13.55 also auch wieder korrekt

wenn ich:
return (hour*10000);
eintrage bekomme ich nur muell zurueck.
d.h. 1 und 2 stelle eine 0 und der rest undefiniertes LED-leuchten.

hier sollte doch 13:00.00 angezeigt werden.

warum geht das nicht

im anhang nochmal der SKETCH

danke fuer jegliche hilfe.

mfg selli

clock_001.ino (7.95 KB)

Ich finde, die LED Dichte ist bei diesem Stripe recht gering. Sieht man dann auch auf den Bildern. Entweder man mag es, oder man braucht noch Streuscheiben/Folien. Ich habe ein ähnliches Projekt mit einfarbigem Stripe vor ein paar Jahren realisiert. Da muß jedes Segment wie bei einer konventionellen 7 Segementanzeige angesteuert werden, dafür ist mit 120 LEDs p. Meter die LED Dichte 4x so hoch. Damit ist die Segmentlänge homogener ausgeleuchtet. Trotzdem langt für die LEDs ein 12V 2A Netzteil völlig. Im Gegenteil, ich dimme per PWM die Segmente recht stark herunter. Hier ist der Link auf meine Uhr ;) http://forum.arduino.cc/index.php?topic=207948.new#new

hallo

hallo nix_mehr_frei

ich habe bewusst das projekt ausgewaehlt. 1. vorgefertigte module (nano, RTC, Lichtsensor) 2. variable LED-strip 30, 60, 144

ich habe erstmal 60 LED/m verwendet. kann man auch dichter machen und mehrfach.

einfacher aufbau.

danke trotzdem fuer den hinweis. werde mir das projekt mal anschauen :-))

mfg selli

wenn ich: return (hour*10000); eintrage bekomme ich nur muell zurueck. d.h. 1 und 2 stelle eine 0 und der rest undefiniertes LED-leuchten.

Das dünkt mich nach einem Variablenüberlauf. Welchen Datenrückgabetyp hat die Funktion in der das retun steht?

Auch solltest Du return (hour*10000L); schreiben damit die Berechnung mit einer LONG Variablen gemacht wird.

Grüße Uwe

Die Zeile

   int GetTime() { ...

muss natürlich auch erstmal geändert werden. Und alles was damit zusammenhängt ;)

hallo
hallo uwe

der tip mit der LONG Variablen ist richtig habe ich gesehen, da int nur
von -32,768 to 32,767 definiert ist.
da ich nun nicht der freak im programmieren bin, habe ich mal versucht das problem zu
loesen.

unsigned long GetTime(){  
 tmElements_t Now;
 RTC.read(Now);
 unsigned long hour=Now.Hour;
 unsigned long minutes=Now.Minute;
 unsigned long second =Now.Second;
 
 if (second % 2==0) {Dot = false;}
   else {Dot = true;};

return (hour*10000+minutes*100+second);
 };

und in der

void TimeToArray(){
 unsigned long  Now = GetTime();

jedenfalls funktionierts.
vielleicht schaut mal jemand drueber und hat noch verbesserungsvorschlaege. :slight_smile:

wuerde mich auf ein re freuen

aber erst mal vielen vielen vielen dank fuer die kompetente und schnelle hilfe
hier im forum. das haette ich so nicht erwartet. zeitnah

DANKE

mfg ralf

hab mal ein bild angehaengt vom aufbau - test

Ja, so geht es. Da hour, minutes und second allerdings nur Werte zwischen 0 und 59 haben können, müssten die nicht unbedingt als long deklariert werden. Wären sie byte oder int, müsstest die die return Zeile etwas ändern   return (hour*10000L+minutes*100+second); // Die kleinste Änderung   return ((long)hour*10000+minutes*100+second); // oder so.

jedenfalls funktionierts.

Herzlichen Glückwunsch

Hi

Sieht 'fett' aus - denke, so was bastel ich mir auch Mal! (Ein Mensch-Ärgere-Dich-Nicht wollte ich Mal machen, aber da kann der Arduino dann auch ganz alleine spielen, also wieder verworfen)

MfG