Arduino UNO - Rainbowduino und weitere (LED-Uhr)

Hallo zusammen,
ich versuche gerade mein erstes Projekt mit dem Arduino zu verwirklichen! Es sind zwar nicht meine ersten Erfahrungen mit einem MC aber die ersten ohne Basic :slight_smile:
Ich will in diesem Thread mal versuchen alle meine Fragen die ich habe nach und nach zu stellen. Es gehört ja alles irgendwie zusammen und ich muss ja nicht für jeden Pups einen neuen Beitrag eröffnen.

Und wir steigen gleich ein:

  1. Frage:
    Ich habe es geschafft auf dem Rainbow LEDs aus und an zu machen.
    Und mein eigentlicher Code läuft ja soweit auch.
    Jetzt will ich das zusammen führen und habe Problem.
    Ich habe mit Hilfe des Forums heraus bekommen wie man seinen Code in verschiedene Dateien packt.
    In meinem HauptSketch lese ich ein RTC-Modul über I2C aus -> Klappt
    Dann werte ich ein DCF77 aus und schreibe wenn es richtig war in die RTC und schalte das DCF-Modul aus -> Klappt
    Dann zeige ich ein paar Sachen auf einem LCD im 4Bit-Modus an -> Klappt

Nun will ich in Abhängigkeit der Sekunden LEDs an machen. Sobald ich aber etwas in der Sub mache geht gar nichts mehr!
Ich rufe also aus meinem HauptSketch die Initialisierung des Rainbow auf:

void setupRainbow() {
  RainbowCMD[0] = 'r';                              // Keine Ahnung
  sendCMD(0x10, CMD_SET_PAPER, 0, 0, 0);            // Inhalte löschen
  sendCMD(0x10, CMD_CLEAR_PAPER);
  sendCMD(0x10, CMD_SWAP_BUF);
  Serial.println("rainbow init");
}

Das geht auch noch!
Dann will ich im SekundenTakt folgendes machen:

void rainbowSecond(){
 sendCMD(0x10, CMD_CLEAR_PAPER);
 sendCMD(0x10, CMD_SET_INK, 0xF, 0x5, 0x5);
 sendCMD(0x10, CMD_DRAW_PIXEL,toByte(secondX[second()]),toByte(secondY[second()]));
 sendCMD(0x10, CMD_SWAP_BUF);
 Serial.println("rainbow second");
}

Kommentiere ich alle sendCMD aus wird der println ausgeführt und mein Programm läuft weiter.
Nehme ich aber einen sendCMD mit rein egal welchen geht nichts mehr.
Auch nicht mein Hauptprogramm.
Es werden keine Fehler angezeigt.

Wenn ich das richtig sehe ist die RTC auf Adresse 0x68 und der Rainbow auf 0x10.
Bussystem heißt doch einfach in reihe schalten oder ist das bei I2C anders?

Der Sekundentakt kommt von der RTC und ist über

 attachInterrupt(1, secTakt, FALLING);  // Pin3 Sekunden Interrupt

Eingebunden.

Habt ihr einen Tip für mich woran das liegen könnte.

Gruß
MueThoS

ps wenn nötig kann ich auch den kompletten Code posten allerdings ist der noch nicht sehr übersichtlich! (Viel Test-Kram und wenig Kommentiert)

attachInterrupt(1, secTakt, FALLING);

Die I2C library kann AFAIK nicht in einem interrupt laufen weil sie selbst interrupts benutzt.

Hab ich mich vielleicht blöd ausgedrückt.
Die Lib läuft nicht im interrupt.
Der Interrupt wird nur durch den Sekundentakt der RTC-Moduls ausgelößt
und startet dann ein paar sachen wie Display aktualisieren.
Die Lib läuft davon unberührt.

Wenn ich das richtig sehe ist die RTC auf Adresse 0x68 und der Rainbow auf 0x10.
Bussystem heißt doch einfach in reihe schalten oder ist das bei I2C anders?

Die Geräte müssen paralell geschaltet werden. Jedes bekommt am richtigen Anschluß SDA bzw SCL und Masse. Die Versorgungsspannung kann die gleiche für alle sein oder verschieden.
Hast Du jeweils einen 4,7kOhm Widerstand von SDA und SCL auf +5V geschaltet?

Ansonsten wenn das Problem ein SW-Fehler ist können wir ihn ohne den ganzen Kode nicht finden.

Grüße Uwe

so ein problem habe ich auch mit den arduino-tools die eingebunden werden.

die motorsteuerung von meinem roboter die den l293d antreibt setzt auch hin und wieder unregelmässig aus für ca 3-4/10 sekunden, weil irgendein interrupt vom tools geklaut/verstellt wurde obwohl der noch garnicht gebraucht wird.
wirst du bei deinen eigenen projekten oft merken.

es ist auch schwierig mit dem arduino-tool mehrere sachen reinzubringen die irgendetwas mit timer oder interrupt zu tun haben. :(.

gruss

4,7 kOhm hab ich nicht drinnen das werde ich dann mal ausprobieren. (einzelnd hat es aber auch ohne geklappt)

Und uwefed, Du hast natürlich recht es heißt paralell.

Leider habe ich jetzt nicht mehr so viel Zeit muß gleich weg.
Was ich aber nicht verstehe ist warum der setupRainbow geht. Wenns an den Wiederständen liegen würde dürfte das ja auch nicht gehen.

MueThoS: Was ich aber nicht verstehe ist warum der setupRainbow geht. Wenns an den Wiederständen liegen würde dürfte das ja auch nicht gehen.

uwefed: Ansonsten wenn das Problem ein SW-Fehler ist können wir ihn ohne den ganzen Kode nichts finden.

Ctrl-V mal dein Program hier...

paralell
nein...
parallel :slight_smile:

Hauptsketch

// RTC und System wird beim Booten durch DCF77 gesetzt
// DCF77 wird jeden Tag gestartet und synct die Zeit
// Log über seriel
// Sekundentakt über RTC Interrupt

#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <DCF77.h>
#include <LiquidCrystal.h>


int DCF77Pin=6;
int DCF77Strom=7;
int DCF77Status=0;
int joyPinHR = 0;                 // slider variable connecetd to analog pin 0
int joyPinRL = 1;                 // slider variable connecetd to analog pin 1
int joyButton = 2;                // button vom Joystick
int valueButton=0;                // Button Wert
int valueHR = 0;                  // variable to read the value from the analog pin 0
int valueRL = 0;                  // variable to read the value from the analog pin 1
int caliHR=0;                      // Variable zum Calibrieren des Joysticks
int caliRL=0;                      // Variable zum Calibrieren des Joysticks
String todo=0;                      // Usereingabe hoch, runter, rechts, links, button

int seconds=0;
int previousTime[6] ={0,0,0,0,0,0};
int daylength[7] = {7,6,8,8,10,7,7};
String weekdayNames[7] = {"Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Sammstag"};
int lastset=0;                    //Tagesdatum wann zuletzt per DCF77 gestellt wurde
short DN;                         //Nummer des Tages im Jahr 1-365
short WN;                         // Kalenderwoche
String  screen = "main";          // Welcher Screen soll angezeigt werden
DCF77 myDCF=DCF77(DCF77Pin);      //DCF77 initialisieren
LiquidCrystal lcd(8,9,10,11,12,13);      // Pins des LCD festlegen





byte CharLeft[8] = {   // Zeichen <
	B00011,
	B00111,
	B01111,
	B11111,
	B11111,
	B01111,
	B00111,
	B00011
};
byte CharRight[8] = {  // Zeichen >
	B11000,
	B11100,
	B11110,
	B11111,
	B11111,
	B11110,
	B11100,
	B11000
};




void setup()  {
  Serial.begin(9600);                    // Seriellen Port initialisieren
   lcd.begin(16, 2);                     // LCD initialisieren
  pinMode(DCF77Strom, OUTPUT);           // DCF77 Stromversorgung setzen
  pinMode(joyButton, INPUT);              // JoyButton auf Input setzen
  digitalWrite(joyButton, HIGH);
  
  attachInterrupt(1, secTakt, FALLING);  // Pin3 Sekunden Interrupt
  setSyncProvider(RTC.get);              // Funktion um die Zeit von der RTC zu bekommen
  if(timeStatus()!= timeSet){            // Wurde die Systemzeit gesetzt???
    Serial.println("Unable to sync with the RTC");
  }else{
    Serial.println("RTC has set the system time");
  }
  lcd.createChar(0, CharLeft);
  lcd.createChar(1, CharRight);
  // Joystick calibrieren (mittelstellung auf 0 rechnen)
  caliRL = 512 + (analogRead(joyPinRL)-512);
  caliHR = 512 + (analogRead(joyPinHR)-512);
  setupRainbow();

}



void loop(){
  todo = Joystick();                    // Joystick abfragen
  if (todo != "")   Serial.println(todo);
  
  
  if (lastset != day()){      // wenn zuletzt gesetzt ungleich heutiger Tag ist
    int DCFsignal = myDCF.scanSignal();
    if (DCF77Status == 0){   // wenn noch kein Strom dann jetzt machen
      digitalWrite(DCF77Strom, HIGH);
      DCF77Status=1;
      digitalClockDisplay();
      Serial.println(" DCF77 eingeschaltet ");
    }
    if (myDCF.valid == 1){
      Serial.println(" RTC wird gestellt"); 
      setTime(myDCF.hh,myDCF.mm,myDCF.ss,myDCF.day,myDCF.mon,myDCF.year);
      RTC.set(now());
      myDCF.valid = 0;
      digitalClockDisplay();
      Serial.print(" setze lastset auf ");
      Serial.println(day());
      lastset=day();
      digitalWrite(DCF77Strom, LOW);
      DCF77Status = 0;
      digitalClockDisplay();
      Serial.println(" DCF77 ausgeschaltet");
    }  
  }


  
  
}
void digitalClockDisplay(){
 Serial.print("  RTC Zeit: ");
  printDigits(hour());
  Serial.print(":");
 printDigits(minute());
  Serial.print(":");
  printDigits(second());
  Serial.print(" ");
 // Datum anzeigen
  printDigits(day());
  Serial.print(".");
printDigits(month());
  Serial.print(".");
  Serial.print(year());
 Serial.print(" ");
  // Wochentag anzeigen
  switch(weekday()) {
  case 1:
    Serial.print("Sonntag");
   break;
  case 2:
    Serial.print("Montag");
    break;
  case 3:
    Serial.print("Dienstag");
    break;
  case 4:
    Serial.print("Mittwoch");
    break;
  case 5:
    Serial.print("Donnerstag");
    break;
  case 6:
    Serial.print("Freitag");
    break;
  case 7:
    Serial.print("Samstag");
    break;
  }
}


void printDigits(int digits){
  // Einstellige Werte mit führender Null versehen
  if(digits < 10) {
    Serial.print('0');
  }
  Serial.print(digits);
}
void lcdDigits(int digits){
  // Einstellige Werte mit führender Null versehen
  if(digits < 10) {
    lcd.print('0');
  }
  lcd.print(digits);
}

void secTakt() {
  if (previousTime[0]!=hour()) newHour();
  if (previousTime[1]!=minute()) newMinute();
  if (previousTime[2]!=second()) newSecond();
  if (previousTime[3]!=day()) newDay();
  if (previousTime[4]!=month()) newMonth();
  if (previousTime[5]!=year()) newYear();
   previousTime[0] = hour();
   previousTime[1] =minute();
   previousTime[2] =second();
   previousTime[3] =day();
   previousTime[4] =month();
   previousTime[5] =year();
   
}

void newHour(){
  Serial.print("Stunde war: "); Serial.print(previousTime[0]); Serial.print(" ist jetzt: "); Serial.println(hour());
}
void newMinute(){
  Serial.print("Minute war: "); Serial.print(previousTime[1]); Serial.print(" ist jetzt: "); Serial.println(minute());
}
void newSecond(){
  Serial.print("Sekunde war: "); Serial.print(previousTime[2]); Serial.print(" ist jetzt: "); Serial.println(second());
  if (screen == "main"){
  mainScreen();
 rainbowSecond();
  }
}
void newDay(){
 // Serial.print("Tag war: "); Serial.print(previousTime[3]); Serial.print(" ist jetzt: "); Serial.println(day());
}
void newMonth(){
//  Serial.print("Monat war: "); Serial.print(previousTime[4]); Serial.print(" ist jetzt: "); Serial.println(month());
}
void newYear(){
//  Serial.print("Jahr war: "); Serial.print(previousTime[5]); Serial.print(" ist jetzt: "); Serial.println(year());
}

void mainScreen() {
  lcd.setCursor(0,0);
  lcd.write(0);
  lcd.setCursor(15,0);
  lcd.write(1);
  
  lcd.setCursor(8-daylength[weekday()]/2, 0);
  lcd.print(weekdayNames[weekday()-1]);
  DayWeekNumber(year(),month(),day(),weekday());
  lcd.setCursor(1, 1);
  lcdDigits(WN);
  lcd.setCursor(5, 1);
  lcdDigits(day());
  lcd.setCursor(8, 1);
  lcdDigits(month());
  lcd.setCursor(11, 1);
  lcdDigits(year());
  lcd.setCursor(7, 1);
  lcd.print(".");
  // Punktunkt zwischen Monat und Jahr
  lcd.setCursor(10, 1);
  lcd.print(".");

}

void DayWeekNumber(unsigned int y, unsigned int m, unsigned int d, unsigned int w){
  int days[]={0,31,59,90,120,151,181,212,243,273,304,334};    // Number of days at the beginning of the month in a not leap year.
//Start to calculate the number of day
  if (m==1 || m==2){
    DN = days[(m-1)]+d;			   //for any type of year, it calculate the number of days for January or february
  }				// Now, try to calculate for the other months
  else if ((y % 4 == 0 && y % 100 != 0) ||  y % 400 == 0){  //those are the conditions to have a leap year
    DN = days[(m-1)]+d+1;     // if leap year, calculate in the same way but increasing one day
  }
  else {					  //if not a leap year, calculate in the normal way, such as January or February
    DN = days[(m-1)]+d;
  }
// Now start to calculate Week number
  if (w==0){
    WN = (DN-7+10)/7;  	     //if it is sunday (time library returns 0)
  }
  else{
    WN = (DN-w+10)/7;	  // for the other days of week
  }
} 

String Joystick(){
  valueRL = analogRead(joyPinRL)-caliRL;
  valueHR = analogRead(joyPinHR)-caliHR;
  valueButton=!digitalRead(joyButton);
  String a;
  if (valueRL > 200 && valueHR < 200 && valueHR > -200 && valueButton == 0){
    a = "links";
  }else if (valueRL < -200 && valueHR < 200 && valueHR > -200 && valueButton == 0){
    a = "rechts";
  }else if (valueHR > 200 && valueRL < 200 && valueRL > -200 && valueButton == 0) {
    a = "hoch";
  }else if (valueHR < -200 && valueRL < 200 && valueRL > -200 && valueButton == 0) {
    a = "runter";
  }else if (valueRL > -200 && valueRL < 200 && valueHR < 200 && valueHR > -200 && valueButton == 1){
    a = "button";
  }else {
    a = "";
  } 
  
  delay(100);
  return a;
}

rainbow:

#include <stdio.h>
#include <avr/pgmspace.h>


// ############################ Befehlsstruktur definieren ###############################
#ifndef WireCommands_h
#define WireCommands_h
#define MAX_WIRE_CMD          0x80
#define CMD_NOP               0x00
#define CMD_SWAP_BUF          0x10
#define CMD_COPY_FRONT_BUF    0x11
#define CMD_SHOW_AUX_BUF      0x12
#define CMD_CLEAR_BUF         0x20
#define CMD_SET_PAPER         0x21
#define CMD_SET_INK           0x22
#define CMD_CLEAR_PAPER       0x25
#define CMD_DRAW_PIXEL        0x26
#define CMD_DRAW_LINE         0x27
#define CMD_DRAW_SQUARE       0x28
#define CMD_PRINT_CHAR        0x2A
#define CMD_DRAW_ROW_MASK     0x2B
extern unsigned char CMD_totalArgs[MAX_WIRE_CMD];
#endif
// ################### Argumentenanzahl für jeden Befehl speichern #######################
unsigned char CMD_totalArgs[MAX_WIRE_CMD] PROGMEM = {
//  0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F 
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    // 0 - 0x00 -> 0x0F
    0,  2,  1,  2,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,    // 1 - 0x10 -> 0x1F
    3,  3,  3,  0,  0,  0,  2,  4,  4,  0,  3,  3,  0,  0,  0,  0,    // 2 - 0x00 -> 0x2F
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    // 3 - 0x00 -> 0x3F
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    // 4 - 0x00 -> 0x4F
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    // 5 - 0x50 -> 0x5F
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    // 6 - 0x60 -> 0x6F
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0     // 7 - 0x70 -> 0x7F
//  0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F 
};
// ############################ sendCMD deklarieren ##############################
void sendCMD(byte address, byte CMD, ... );
// ########################### Krams vorbereiten (fest) ##########################
unsigned char RainbowCMD[20];
unsigned char State = 0;  
unsigned long timeout;
byte remoteAddr = 0x10;
// ########################## Krams vorbereiten (eigenes Zeug) ####################
int secondX[60] = {7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4,7,6,5,4};
int secondY[60] = {0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0,1,1,1,1,2,2,2,2};






void setupRainbow() {
  RainbowCMD[0] = 'r';                              // Keine Ahnung
  sendCMD(0x10, CMD_SET_PAPER, 0, 0, 0);            // Inhalte löschen
  sendCMD(0x10, CMD_CLEAR_PAPER);
  sendCMD(0x10, CMD_SWAP_BUF);
  Serial.println("rainbow init");
}



// ############################### Sekundentakt ##############################

void rainbowSecond(){
   RainbowCMD[0] = 'r';  
  //sendCMD(0x10, CMD_CLEAR_PAPER);
 //sendCMD(0x10, CMD_SET_INK, 0xF, 0x5, 0x5);
 //sendCMD(0x10, CMD_DRAW_PIXEL,toByte(secondX[second()]),toByte(secondY[second()]));
 //sendCMD(0x10, CMD_SWAP_BUF);
 Serial.println("rainbow second");

}
// ##################################################################


/*
sendCMD(0x10, CMD_CLEAR_PAPER);
  sendCMD(0x10, CMD_SET_INK, 0xD, 0xF, 0);
  sendCMD(0x10, CMD_DRAW_SQUARE, toByte(6), toByte(1), toByte(5), toByte(2));
  sendCMD(0x10, CMD_SWAP_BUF);
  sendCMD(0x10, CMD_CLEAR_PAPER);
   sendCMD(0x10, CMD_SWAP_BUF);
  sendCMD(0x10, CMD_DRAW_SQUARE, toByte(7), toByte(0), toByte(4), toByte(3));
    sendCMD(0x10, CMD_COPY_FRONT_BUF, toByte(0), toByte(-1));
    sendCMD(0x10, CMD_SET_INK, 0x3, 0x10, 0xF);
    sendCMD(0x10, CMD_DRAW_PIXEL,toByte(7),toByte(0));
    sendCMD(0x10, CMD_SWAP_BUF);
 int i=0;
 byte x = 0;
 byte y = 0;
 int green=0;
 int blue=0;
 int red=0;
 for (i= 0; i < 30; i++) {
 x = random(4, 7);
 y =random(0,4);
 green= random(0,25);
 red=random(0,255);
 blue = random(0,255);
 sendCMD(0x10, CMD_CLEAR_PAPER);
 sendCMD(0x10, CMD_SET_INK, red, green, blue);
 sendCMD(0x10, CMD_DRAW_PIXEL,toByte(x),toByte(y));
   sendCMD(0x10, CMD_SWAP_BUF);
   delay(100);
 }
 
 
 int i=0;
 for (i= 0; i < 16; i++) {
 sendCMD(0x10, CMD_CLEAR_PAPER);
 sendCMD(0x10, CMD_SET_INK, 0xF, 0x5, 0x5);
 sendCMD(0x10, CMD_DRAW_PIXEL,toByte(secondX[i]),toByte(secondY[i]));
 sendCMD(0x10, CMD_SWAP_BUF);
 Serial.print(i);
 delay(900);
 
 
 }
 
 
 

 sendCMD(0x10, CMD_COPY_FRONT_BUF, toByte(0), toByte(-1));
 sendCMD(0x10, CMD_CLEAR_PAPER);
 sendCMD(0x10, CMD_SET_INK, 0xF, 0xF, 0xF);
 sendCMD(0x10, CMD_DRAW_PIXEL,135,128);
 sendCMD(0x10, CMD_SWAP_BUF);
  Serial.println(toByte(secondX[0]),DEC);
 Serial.println(toByte(secondY[0]),DEC);
 
 delay(500);

 
 
  // for (x= 0; x < 255; x++) {
  // for (y=0; y<255;y++){
  //  } 
 //  }   
}
*/
unsigned char toByte(int i) {
  return map(i, -128, 127, 0, 255);
}




void sendCMD(byte address, byte CMD, ... ) {
  int i;
  unsigned char v;
  byte t;
  va_list args;                     // Create a variable argument list
  va_start(args, CMD);              // Initialize the list using the pointer of the variable next to CMD;
  
  RainbowCMD[1] = CMD;              // Stores the command name
  t = pgm_read_byte(&(CMD_totalArgs[CMD]))+2;  // Retrieve the number of arguments for the command
  for (i=2; i < t; i++) {
    v = va_arg(args, int);          // Retrieve the argument from the va_list    
    RainbowCMD[i] = v;              // Store the argument
  }
  
  sendWireCommand(address, t);      // Transmit the command via I2C
}




void sendWireCommand(int Add, byte len) {
  unsigned char OK=0;
  unsigned char i,temp;
  
  while(!OK)
  {                          
    switch (State)
    { 	

    case 0:                          
      Wire.beginTransmission(Add);
      for (i=0; i<len ;i++) Wire.send(RainbowCMD[i]);
      Wire.endTransmission();    
      delay(5);   
      State=1;                      
      break;

    case 1:
      Wire.requestFrom(Add,1);   
      if (Wire.available()>0) 
        temp=Wire.receive();    
      else {
        temp=0xFF;
        timeout++;
      }

      if ((temp==1)||(temp==2)) State=2;
      else if (temp==0) State=0;

      if (timeout>5000) {
        timeout=0;
        State=0;
      }

      delay(5);
      break;

    case 2:
      OK=1;
      State=0;
      break;

    default:
      State=0;
      break;
    }
  }
}

Aber nicht meggern wenns unübersichtlich ist schönheit kommt zum schluss und es ist sicher nicht alles sauber gelößt.
Bin ja noch am Anfang :sunglasses:

Edit:
Ich glaube der rest läuft auch nicht mehr richtig.
Die DCF-Zeit kommt falsch.
grrr ich muss los....

jetzt ist alles klar:

du rufts secTakt() mittels interrupt auf.
secTakt() ruft newSecond();
und newSecond() ruft rainbowSecond() auf, aber du bist dann immer noch schoen im interrupt state.

interrupt call:

secTakt-->
    newSecond-->
        rainbowSecond
        RET
    RET
RETI // return from interrupt

Ok, das sind die feinheiten die ich wohl noch lernen muß!
Deshalb wurde im origial RTC code auch in der routiene auch nur eine variable gesetzt die im loop geprueft und zurück gesetzt wurde.
das werde ich mal anpassen menn ich wieder zu hause bin

danke...

Juhuu,
schonmal Danke für die Tips zur ersten Frage!

Ich habe die 4,7kOhm Wiederstände eingebaut wie von uwefed empfohlen.
Und ich habe mal geschaut das ich nicht so tief in den interrupt rein springe.

Ich hoffe das ist der richtige Ansatz:

void secTakt() {
  Takt = 1; 
}

Und im loop hab ich folgendes gemacht:

  if (Takt == 1){
  if (previousTime[0]!=hour()) newHour();
  if (previousTime[1]!=minute()) newMinute();
  if (previousTime[2]!=second()) newSecond();
  if (previousTime[3]!=day()) newDay();
  if (previousTime[4]!=month()) newMonth();
  if (previousTime[5]!=year()) newYear();
  previousTime[0] = hour();
  previousTime[1] = minute();
  previousTime[2] = second();
  previousTime[3] = day();
  previousTime[4] = month();
  previousTime[5] = year()};
  Takt = 0;
  }

Gibt es eigentlich eine Möglichkeit das setzen von previousTime so zu schreiben?

previousTime[] = {hour(),minute(),second(),day(),month(),year()};

Da schimpft er immer mit mir.

Gibt es eigentlich eine Möglichkeit das setzen von previousTime so zu schreiben?
Code:

previousTime[] = {hour(),minute(),second(),day(),month(),year()};

Da schimpft er immer mit mir.

Nun sowas geht prinzipiell schon, aber nur wenn die Variable als lvalue deklariert wird (zum Beispiel auf dem Stack, also innerhalb eines Blockes).

int previousTime[6];

/*[...] 
*/
{
  int currentTime[6] = {hour(),minute(),second(),day(),month(),year()};
  if (currentTime[0]!=previousTime[0]) blabla(); /* [...] */
  /*
   * danach kannst du ja die Werte in einem Loop oder ueber memcpy umkopieren: 
   */
  memcpy(previousTime, currentTime, sizeof(currentTime));
}

HTH

OK, das ist aber ja nur eine Schönheitssache.

Ich habe aber noch eine Frage:
Ich benutze eine DCF77-Lib die alle 20ms das signal prüft.
Wenn ich danach suche finde ich auch immer nur die.
Weiß jemand wo es eine gibt die mit einem interrupt arbeitet.
Weil ich bekomme das Signal nicht mehr decodiert wenn ich zu viel drum herum
Auf der Seite wo ich die lib her habe steht das er das noch einbauen will aber das ist schon lange her.
Vielleicht suche ich auch nur falsch.

So, weiter gehts!
Ich schreibe gerade alles um auf ein Serielles LCD. (Pins sparen)
Leider komme ich da an einer stelle nicht weiter:

Folgendes mache ich:

// ############################ Initalisieren (klappt super)
#include <SoftwareSerial.h>
#define txPin 12                     // serLCD PIN
SoftwareSerial LCD = SoftwareSerial(0, txPin);   // init mit txPin (rx wird nicht benötigt)
pinMode(txPin, OUTPUT);                // serLCD PIN als OUTPUT einrichten
LCD.begin(9600);                       // Serielle Übertragung zum LCD starten
clearLCD();                            // LCD löschen


// ####################### wird jede Sekunde aufgerufen (klappt super)
void mainScreen(){
  goTo(1);                                                         //klappt auch
  lcdDigits(hour());                                             // hour() kommt von der systemzeit klappt auch
  
  LCD.print(weekdayNames[weekday()-1]);   // <--- klappt nicht!!!!!!
}

weekdayNames:

String weekdayNames[7] = {"   Sonntag    ","    Montag    ","   Dienstag   ","   Mittwoch   ","  Donnerstag  ","   Freitag    ","   Sammstag   "};

Fehlermedung:

serLCD_RTC_DCF77_Joy.cpp: In function 'void mainScreen()':
serLCD:4: error: no matching function for call to 'SoftwareSerial::print(String&)'
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:37: note: candidates are: void SoftwareSerial::print(char)
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:38: note:                 void SoftwareSerial::print(const char*)
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:39: note:                 void SoftwareSerial::print(uint8_t)
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:40: note:                 void SoftwareSerial::print(int)
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:41: note:                 void SoftwareSerial::print(unsigned int)
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:42: note:                 void SoftwareSerial::print(long int)
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:43: note:                 void SoftwareSerial::print(long unsigned int)
/Applications/Arduino.app/Contents/Resources/Java/libraries/SoftwareSerial/SoftwareSerial.h:44: note:                 void SoftwareSerial::print(long int, int)

Ich verstehe schon das er Probleme hat mit dem String, denke ich :sunglasses:
Nur bekomme ich nicht raus wie ich es schreiben muss.
Und irgendwie finde ich im Internet nur Beispiele mit "Text", das geht bei mir ja auch.

Und es sieht schon wieder so aus als ob die DCF77 Auswertung nicht klappt sobald ich auch was am Display ausgebe.
der Rainbow ist im mom deaktiviert.

Ersetze String mit char * NB: mit dem Sternchen
oder die objekt orientierte Loesung:

   char buffer[16];
   weekdayNames[1].toCharArray(buffer,sizeof(buffer));
   LCD.print(buffer);

Irgendwie sieht das mit dem * einfache aus!
Deshalb hab ich das mal genommen und es klappt.

Danke

Hmmm, also sieht ja schon mal ganz gut aus:
RTC klappt!
DCF77 klappt!
serLCD klappt!
Joystick klappt!

Aber:
Wenn ich den Rainbow dazu nehme dann schafft er es nicht mehr das DCF77 Signal auszuwerten.
Wenn ich das richtig verstehe mus der alle 15ms das signal abtasten.
Dafür scheint der schon zu viel anderen Kram zu machen.

Das DCF77-Modul wird einmal am Tag um 0 Uhr (also bei Tageswechsel) aktiviert.
Ich hätte auch kein Problem damit wenn zu dieser Zeit der Rainbow aus ist.
Habe das gerade mal zu Testzwecken gemacht.

Wenn DCF77Status == 0 (also aus) dann rainbowSecond() ausführen sonst halt nicht!

Irgendjemand einen Tip wie ich das sons regeln könnte?

Na, so ohne Kristallkugel ist das schwierig zu uebersehen!!
Bisschen Kode zum einschauen?