Hallo, ich bin nicht firm in Sachen Programmierung und wurstel mich so durch.
Dieses Projekt von Dan Master
Dan_Master
habe ich nun endlich soweit bekommen, dass die LEDs leuchten.
Leider startet die Uhr nicht. Über die Taster "stellen", "plus" und "minus" bekomme ich da etwas geändert. Mehr aber auch nicht. Ich gehe davon aus, dass es nicht am Programmcode liegt.
Vielen Dank für Eure Unterstützung
Vielleich liest ja Dan Masters das auch.
Einmal alles was mit "serial" zu tun hat einkommentieren, un dann mal auf den Seriellen Monitor schauen.
Hast du das EEPROM initialisiert?
Hallo Werber,
ein das habe ich nicht. Ich hatte die Anleitung so interpretiert, dass es nach dem update nicht mehr erfolgen muss. Ich teste mal.
Das mit dem "serial" habe ich nicht verstanden.
Grüße
"Serial einkommentieren" bedeutet, dass „//“ vom Anfang der Zeilen entfernt wird, die sich auf Serial.print beziehen.
Hier, z. B.
if (sec==true&& once==false){
// Serialprint("Setmode: ");
// Serialprint(setmode);
// Serialprint("P:");
// Serialprint(Plus);
// Serialprint("M:");
// Serialprint(Minus);
// Serialprint(" Zeit: ");
// Serialprint(hh);
// Serialprint(":");
// Serialprint(mm);
// Serialprint(":");
// Serialprintln(ss);
// Serialprintln(hhdisplay);
once=true;
Ich suche noch.
Das ist in dem Tab C_RTCFunktion
Ja, läuft aber nicht. Irgendwie verstehe ich das nicht, da wird doch kein Sketch veröffentlicht damit andere noch basteln müssen.
Wie dem auch sei, woher bekommt die Uhr Ihre Basiszeit? Doch bestimmt von der ersten Einstellung und dann müsste es einen Tritt geben, so meine Vorstellung.
Dank Euch, ich wurstel weiter.
Hast du die zwei zusätzliche .ino mit eingebunden? Der Sketch Ordner soll so aussehen

in der C_RTCFunktion ist die Möglichkeit die Uhr sich anzeigen lassen in dem man
//Serial.println("Stundenlesen");
die zwei // löscht
Serial.println("Stundenlesen");
mit Serial monitor sich das anzeigen lassen.
Ich habe deine Teile nicht jedoch kompiliert für Nano R3 sauber.
Noch was Die RTC muss die Batterie haben sonst verliert die die eingestellte Zeit, nach trennen der Versorgung
Wie ist die RTC angeklemmt?
Braucht man seit dem Update nicht mehr; macht das Programm im setup() selbst:
Rpointer=EEPROM.read(0);
Gpointer=EEPROM.read(1);
Bpointer=EEPROM.read(2);
if (Rpointer>=24||Gpointer>=24||Bpointer>=24){
EEPROM.write(0, 20);
EEPROM.write(1, 20);
EEPROM.write(2, 20);
}
Wenn Du die serielle Ausgabe aktivierst, musst Du auch noch in Zeile 78 die serielle Schnittstelle initialisieren:
// Serialbegin(115200);
Da ist allerdings ein kleiner Fehler drin - es fehlt ein Punkt.
// Serial.begin(115200);
Das Setzen der Stunden und Minuten erfolgt über die Reed-Kontakte. Man kommt in den Setting-Modus - wenn ich dem Kommentar glauben darf - durch "langen Tastendruck" (Zeile 111):
if (druck==false&&ldruck==true){ // Longress >750ms change to setmode 3+4 to set Hours an Minutes
Das eigentliche Setzen der RTC erfolgt dann in Zeile 128:
RTC_Set();
Die Uhr läuft selbst.
Der SQW ist ein Ausgang der Uhr, der auf einen Eingang am Nano geführt wird:
#define RTCIN 4 // SQW Output of RTC connected here
...
pinMode(RTCIN,INPUT); // SQW Output of RTC connected here
digitalWrite(RTCIN,HIGH);
// Das könnte man auch durch diese Zeile ersetzen:
// pinMode(RTCIN,INPUT_PULLUP);
...
sec=digitalRead(RTCIN); // Read the RTC SQWPulse
Nimm doch eine RTC Lib und teste damit ob die OK ist. Dort sind auch Beispiele für deine Uhr
#include <Wire.h>
#include <EEPROM.h>
#include "FastLED.h"
#include <avr/wdt.h>
#include <RTClib.h>
#define RTC_ADDRESS 0x68 // I2C Address of RTC 0x68
#define STELLEN 8 // REED STELLEN Pin
#define MINUS 9 // REED MINUS
#define PLUS 10 // REED PLUS
#define SEKUNDEN 11 // REED SEKUNDEN
#define RTCIN 4 // SQW Output of RTC connected here
#define TIME 750 // Split time between short and lognpress
#define DATA_PIN 3
#define NUM_LEDS 114
#define CHIPSET WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
unsigned long ptime;
unsigned long start;
boolean druck=false;
boolean ldruck=true;
boolean M_minus=false;
boolean FM_minus=true;
boolean M_plus=false;
boolean FM_plus=true;
boolean M_sek=false;
boolean FM_sek=true;
//boolean tasterlesen=true;
boolean update,last=true;
boolean sec=false;
boolean lsec=false;
boolean save,one=false;
boolean Minus,Plus=false;
boolean once=false;
boolean done=false;
boolean M_timeout=false;
byte setmode=0;
byte timeout=0;
//byte lm=0; // 0=Normal 1=Display Seconds 2=Set minutes 3=Set hours
//byte lCase=0;
byte ss,mm,lmm,hh,hhdisplay,mmset,lmmset,hhset,lhhset,mm5er,mm5erRest=0; // Save Variables for time
byte R=0,G=0,B=0; // Farbe für den Start alles weis
byte Rpointer,Gpointer,Bpointer;
byte PWMArray[23]={
2,7,10,15,20,25,30,35,40,50,60,70,80,90,100,120,140,160,180,200,220,240,255};
void setup() {
wdt_enable(WDTO_2S);
pinMode(RTCIN,INPUT); // SQW Output of RTC connected here
pinMode(STELLEN,INPUT_PULLUP); // Taster Eingang
pinMode(MINUS,INPUT_PULLUP);
pinMode(PLUS,INPUT_PULLUP);
pinMode(SEKUNDEN,INPUT_PULLUP);
digitalWrite(RTCIN,HIGH);
digitalWrite (STELLEN,HIGH); // internal Pullup
FastLED.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
Serial.begin(115200);
Wire.begin(); // Start I2C Kommunikation
Wire.beginTransmission(RTC_ADDRESS); // Beginn Kommunikation auf Adresse 0x68
Wire.write(0x0E); // Pointer auf Control Register 0x07
Wire.write(0x00); // Controlbyte for RTC to set the sqw Output to 1Hz
Wire.endTransmission(); // Beenden der I2C Kommunitkation
update=true;
Rpointer=EEPROM.read(0);
Gpointer=EEPROM.read(1);
Bpointer=EEPROM.read(2);
if (Rpointer>=24||Gpointer>=24||Bpointer>=24){
EEPROM.write(0, 20);
EEPROM.write(1, 20);
EEPROM.write(2, 20);
}
TimeRead();
RTC_Start();
}
// Start Main Loop
void loop() {
wdt_reset(); // Watchdog timer falls sich der Controller mal aufhängt
/*=>Routine OneButton Control<=*/
druck=digitalRead(STELLEN);
M_minus=digitalRead(MINUS);
M_plus=digitalRead(PLUS);
M_sek=digitalRead(SEKUNDEN);
R=PWMArray[Rpointer];
G=PWMArray[Gpointer];
B=PWMArray[Bpointer];
/*One Button End*/
if (druck==false&&ldruck==true){ // Longress >750ms change to setmode 3+4 to set Hours an Minutes
if (setmode<=1){
setmode=2;
}
else
setmode++;
if (setmode==2){ // Setmode 2 Hour Setting
hhset=hh;
}
if (setmode==3){ // Setmode 3 Minutes Setting
mmset=mm;
}
if (setmode==4){ // Save the changes and go backt mode 0 (normal operation)
if(save==true){
hh=hhset;
mm=mmset;
ss=0;
RTC_Set();
save=false;
update=true;
}
}
if (setmode==7){ // Save Values
EEPROM.write(0, Rpointer);
EEPROM.write(1, Gpointer);
EEPROM.write(2, Bpointer);
setmode=0;
}
ldruck=false;
one=false;
FastLED.show();
}
if (druck==true&&ldruck==false){ // Zurücksetzten der Merker
ldruck=true;
}
// Minus
if (M_minus==false&&FM_minus==true){
Minus=true;
FM_minus=false;
}
if (M_minus==true&&FM_minus==false){
FM_minus=true;
}
// Plus
if (M_plus==false&&FM_plus==true){
Plus=true;
FM_plus=false;
}
if (M_plus==true&&FM_plus==false){
FM_plus=true;
}
if (M_sek==false&&FM_sek==true){
setmode=1;
}
if (M_sek==true&&FM_sek==false){
FM_sek=true;
}
sec=digitalRead(RTCIN); // Read the RTC SQWPulse
digitalWrite(13,sec);
if (sec==true && lsec==false){
++ss; // Sekunden Zähler aufadieren
if (ss==60){ // Bei 60 Sekunden eine Minute weiter
ss=0;
mm=mm+1;
}
if (setmode==1){ // Im Setmode=1 werden hier die Sekunden angezeigt
++timeout;
FastLED.clear();
print_numbers(ss); // Sekunden Anezige Funktion mir übergabe der Sekunden
FastLED.show();
if (timeout>=15){
setmode=0;
timeout=0;
update=true;
}
}
lsec=true;
}
if (setmode==0){ // Im Modus 0 (normale Anzeige)
if(mm!=lmm||update==true){ // Wenn die Miunten nicht gleich der Minuten letzten durchlauf sind oder der update Merker gesetzt
FastLED.clear();
TimeRead(); // RTC auslesen
update=false; // Hilfsmerker zurücksetzten
mm5erRest=mm%5; // Mit Modulo die 5er "überhang" auswerten
mm5er=mm-mm5erRest; // den 5er Teiler berechen 0,5,10,15,20....55 etc.
if (hh>=13){ // Bei Stunden über 13 Uhr zurück auf 13=1 14=2 etc.
hhdisplay=hh-12;
}
if (mm5erRest==1) P_EINS(); // Reste der Fünfer 1-4 die entsprechenden "Ecken" anmachen
else if (mm5erRest==2) P_ZWEI();
else if (mm5erRest==3) P_DREI();
else if (mm5erRest==4) P_VIER();
/* Zeitanzeigeausgabe in Worten */
W_ESIST();
if (mm5er==5||mm5er==25||mm5er==35||mm5er==55){
M_FUENF();
}
if (mm5er==10||mm5er==50){
M_ZEHN();
}
if (mm5er==15||mm5er==45){
M_VIERTEL();
}
if (mm5er==20||mm5er==40){
M_ZWANZIG();
}
if (mm5er==25||mm5er==30||mm5er==35){
M_HALB();
}
if (mm5er==0){
W_UHR();
}
if (mm5er==5||mm5er==10||mm5er==15||mm5er==20||mm5er==35){
W_NACH();
}
if (mm5er==25||mm5er==40||mm5er==45||mm5er==50||mm5er==55){
W_VOR();
}
hhdisplay=hh;
if (mm>=25){ // ab der 25 Minuten ist es immer "vor" der nächsetn Stunde
if (hh==0||hh==12){ // bei 12 Uhr vor "Ein" Uhr
hhdisplay=1;
}
else
hhdisplay=hh+1;
}
if (hhdisplay==1&&mm5er==0) H_EIN(); // Bei Voller Stunde ohne Minute "Ein" Uhr
else if (hhdisplay==1||hhdisplay==13) H_EINS(); // Normale "Stunden" Auswahl
else if (hhdisplay==2||hhdisplay==14) H_ZWEI();
else if (hhdisplay==3||hhdisplay==15) H_DREI();
else if (hhdisplay==4||hhdisplay==16) H_VIER();
else if (hhdisplay==5||hhdisplay==17) H_FUENF();
else if (hhdisplay==6||hhdisplay==18) H_SECHS();
else if (hhdisplay==7||hhdisplay==19) H_SIEBEN();
else if (hhdisplay==8||hhdisplay==20) H_ACHT();
else if (hhdisplay==9||hhdisplay==21) H_NEUN();
else if (hhdisplay==10||hhdisplay==22) H_ZEHN();
else if (hhdisplay==11||hhdisplay==23) H_ELF();
else if (hhdisplay==12||hhdisplay==24||hhdisplay==0) H_ZWOELF();
}
lmm=mm;
FastLED.show();
}
if (sec==false && lsec==true){ // Flankenerkenung des Sekunden Impusles
lsec=false;
}
if (setmode==2){ // Stunden stellen und anzeige des Zahlenwertes
TimeRead(); // aktuelle zeit auslesen
FastLED.clear();
print_numbers(hhset);
hhset=INCDEC(hhset);
Serial.print("Std: ");
Serial.println(hhset);
leds[110].setRGB( R, G, B); // OL
leds[113].setRGB( R, G, B); // OL
lhhset=hhset;
FastLED.show();
one=true;
save=true;
}
if (setmode==3){ // Minuten stellen
TimeRead();
FastLED.clear();
print_numbers(mmset);
mmset=INCDEC(mmset);
Serial.print("Min: ");
Serial.println(mmset);
leds[111].setRGB( R, G, B); // OL
leds[112].setRGB( R, G, B); // OL
lmmset=mmset;
FastLED.show();
one=true;
save=true;
}
if(setmode==4){ // Farbe Rot einstellen
FastLED.clear();
leds[113] = CRGB( 128,0,0);
leds[112] = CRGB( 128,0,0);
Rpointer=INCDEC(Rpointer);
for (int x=0; x<Rpointer; x++){
leds[x] = CRGB( 128,0,0);
}
}
if (setmode==5){ // Farbe Grün einstellen
FastLED.clear();
leds[113] = CRGB( 0,128,0);
leds[112] = CRGB( 0,128,0);
Gpointer=INCDEC(Gpointer);
for (int x=0; x<Gpointer; x++){
leds[x] = CRGB( 0,128,0);
}
}
if (setmode==6){ // Farbe Blau einstellen
FastLED.clear();
leds[113] = CRGB( 0,0,128);
leds[112] = CRGB( 0,0,128);
Bpointer=INCDEC(Bpointer);
for (int x=0; x<Bpointer; x++){
leds[x] = CRGB( 0,0,128);
}
}
if (setmode==4||setmode==5||setmode==6){
for (int x=88; x<NUM_LEDS-4; x++){
leds[x] = CRGB( R,G,B);
}
FastLED.show();
}
if (sec==true&& once==false){
// Serialprint("Setmode: ");
// Serialprint(setmode);
// Serialprint("P:");
// Serialprint(Plus);
// Serialprint("M:");
// Serialprint(Minus);
// Serialprint(" Zeit: ");
// Serialprint(hh);
// Serialprint(":");
// Serialprint(mm);
// Serialprint(":");
// Serialprintln(ss);
// Serialprintln(hhdisplay);
once=true;
}
if (sec==false && once==true)
once=false;
}
// End Main Loop
void print_numbers(byte num){ // Funktion zum Dartellen von Dezimalzahlen auf der Matrix
byte num10;
byte num1;
num1=num%10;
num10=(num-num1)/10;
switch (num10){ // Zehner stelle ausgeben
case 0:
L_ZERO();
break;
case 1:
L_ONE();
break;
case 2:
L_TWO();
break;
case 3:
L_THREE();
break;
case 4:
L_FOUR();
break;
case 5:
L_FIVE();
break;
}
switch (num1){ // Einer Stelle ausgeben
case 0:
R_ZERO();
break;
case 1:
R_ONE();
break;
case 2:
R_TWO();
break;
case 3:
R_THREE();
break;
case 4:
R_FOUR();
break;
case 5:
R_FIVE();
break;
case 6:
R_SIX();
break;
case 7:
R_SEVEN();
break;
case 8:
R_EIGHT();
break;
case 9:
R_NINE();
break;
}
}
byte INCDEC(byte Wert){
if (Minus==true){
if((setmode==4||setmode==5||setmode==6)&&Wert>=1){
Wert--;
}
if(setmode==3){
Wert--;
if (Wert>60)
Wert=59;
}
if(setmode==2){
Wert--;
if (Wert>24)
Wert=23;
}
Minus=false;
}
if (Plus==true){
if((setmode==4||setmode==5||setmode==6)&&(Wert<=21)){
Wert++;
}
if(setmode==3){
Wert++;
if (Wert>59)
Wert=0;
}
if(setmode==2){
Wert++;
if (Wert>23)
Wert=0;
}
Plus=false;
}
return Wert;
}
Ich habe mal den sketch hochgeladen.
Hier das Anschlussbild
Wenn ich jetzt den Taster "stellen" drücke (D8) dann zeigt mir der serial Monitor eine Stunde und beim nächsten Tastendruck eine Minute an. Aber die Zeit läuft nicht ab.
Funktioniert die RTC?
Im testskech ja, jetzt schaue ich mal ob die eingebunden ist. Ich versuche es zumindest.
Danke
Läuft nicht im Uhr skech
