Anfängerfehler im Code

Hallo, ich bin ein Arduino Neuling und hab in meinem Sketch einige Fehler die ich nicht verstehe.
Ich denke es ist nichts großes, aber ich seh den Wald vor lauter Bäumen nicht mehr.

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

#define PinLampe_1 30
#define EIN LOW
#define AUS HIGH

int Timer_1[2]; // Timer Lampe 1

void setup()
{  
  Serial.begin(9600);
  setSyncProvider(RTC.get);
  // Nur zur Kontrolle:
  if(timeStatus()!= timeSet) // wenn Status geaendert
  {
     Serial.println("Synchronisation fehlgeschlagen"); // bei Fehler
  }
  else
  {
     Serial.println("Synchronisation erfolgreich"); // alles ok
  }

  pinMode(PinLampe_1, OUTPUT);
}

void loop()
{
  if(weekday()==1) {
    // Sonntags später, da man gerne mal ausschläft ohne Licht an
    Timer_1[0] = 1000;
    Timer_1[1] = 1400;
    Serial.println("Sonntag");
    }
  else {
    Timer_1[0] = 730;
    Timer_1[1] = 1200;
    Serial.println("Wochentag");
    }
  
  Serial.println(">>-->>-->>-->>");
  Serial.print("Timer1[0] ");
  Serial.println(Timer_1[0]);
  Serial.print("Uhrzeit: ");
  Serial.println(uhrzeit());
  Serial.println("<<--<<--<<--<<");
  
  digitalUhrAnzeige(); // Aktuelle Uhrzeit anzeigen
  
  ZeitBisAn(Timer_1[0],Timer_1[1]); // Gibt aus wie lange das Licht schon an ist und wann es aus geht 
  // Wenn es aus geschalten ist wird die Zeit ausgegeben bis wann sie wieder eingeschalten wird
  Serial.println("-------");


  Serial.print("Pin Status ");
  Serial.print(PinLampe_1);
  Serial.print(": ");
  Serial.println(digitalRead(PinLampe_1));
  // Wie kann man das besser zusammen schreiben? Wenn ich es mit + verknüpfe bekomme ich Fehler
  
// In diesem auskommentierten Segment sind viele Fehler
/*  if((uhrzeit()>=Timer_1[0] and uhrzeit()<Timer_1[1]) {
    // Lampe 1 sollte gestartet sein
    if(digitalRead(PinLampe_1)==1) {
    // Wenn der Pin von der Lampe 1 noch aus ist dann jetzt einschalten
      digitalWrite(PinLampe_1, EIN);
      Serial.println("");
      Serial.println("Lampe 1 wird eingeschaltet");
      Serial.println("");
      }
  }
  else {
    // Lampe 1 sollte ausgeschaltet sein
    if(digitalRead(PinLampe_1)==0) {
      // Wenn sie noch eingeschaltet ist dann jetzt ausschalten
      digitalWrite(PinLampe_1, AUS);
      Serial.println("");
      Serial.println("Lampe 1 wird ausgeschaltet");
      Serial.println("");
      }
    }
    */
    delay(5000);
}

float uhrzeit() {
  //float zahl;
  int zahl = (hour()*100) + minute();
  Serial.print(".........");
  Serial.print(zahl);
  Serial.print(".........");
  return zahl;
  // Return wirft Fehler
  }


void ZeitBisAn(int timerAn, int timerAus) {
  int verbleibend = uhrzeit()-timerAn;
  Serial.println("Zeit Bis An START >>>>>>>>>>>>>>>>>>>>");
  Serial.println("Timer1: ")+timerAn;
  Serial.println("Uhrzeit: ")+uhrzeit();
  Serial.println("Verbleibend: ");
  Serial.println(verbleibend); // fuegen Freizeichen ein
  Serial.println("Zeit Bis An Ende <<<<<<<<<<<<<<<<<<<<<");
  }






// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// ab hier wird nur zur schöneren Ansicht verwendet
void digitalUhrAnzeige() // definieren Subroutine
{
   // digitale Anzeige der Zeit
   printZiffernGenulltOhnePunkt(hour()); // rufen Subroutine auf
   printZiffernGenulltmitPunkt(minute()); // rufen Subroutine auf
   printZiffernGenulltmitPunkt(second()); // rufen Subroutine auf
   Serial.print(" "); // fuegen Freizeichen ein
   printZiffernGenulltOhnePunkt(day()); // rufen Subroutine auf
   Serial.print("."); // fuegen Freizeichen ein
   printZiffernGenulltOhnePunkt(month()); // rufen Subroutine auf
   Serial.print("."); // fuegen Freizeichen ein
   Serial.println(year());; // Zeilenvorschub
}

void printZiffernGenulltOhnePunkt(int zahl) // definieren Subroutine
{
  // verschoenern Anzeige, indem wir ...
  if(zahl < 10) // wenn kleiner als 10 ...
   {
     Serial.print(""); // fuehrende 0 einfuegen
   }
   Serial.print(zahl); // Ausgabe auf serieller Konsole
}

void printZiffernGenulltmitPunkt(int zahl) // definieren Subroutine
{
  // verschoenern Anzeige, indem wir ...
  Serial.print(":"); // trennende ":" einfuegen
  if(zahl < 10) // wenn kleiner als 10 ...
  {
     Serial.print('0'); // fuehrende 0 einfuegen
  }
  Serial.print(zahl); // Ausgabe auf serieller Konsole
}

Ich habe Probleme die "uhrzeit()" aufzurufen und die Timer an "ZeitBisAn" zu übergeben.

float uhrzeit() {
  int zahl = (hour()*100) + minute();
...
  return zahl;

Die Funktion soll float als Rückgabewert haben, zahl ist aber Integer. So sollte es gehen:

int uhrzeit() {
  int zahl = (hour()*100) + minute();
...
  return zahl;

Ah Super! Jetzt sieht schon alles ganz anders aus.

Wie kann man ein int teilen? Ich bekomme nun das Ergebnis in hhmm (bzw hmm) zurück, das würde ich gerne besser leslich darstellen.

int ZeitBisAn(int timerAn, int timerAus) {
  int verbleibend = uhrzeit()-timerAn;
  Serial.println("Zeit Bis An START >>>>>>>>>>>>>>>>>>>>");
  Serial.print("Timer1: ");
  Serial.println(timerAn);
  Serial.print("Uhrzeit: ");
  Serial.println(uhrzeit());
  Serial.print("Verbleibend: ");
  Serial.println(verbleibend);

  if(verbleibend<1000) {
    Serial.println("3-Stellig");
    Serial.print("HMM: ");
    Serial.println(verbleibend);
    }
  else {
    Serial.println("4-Stellig");
    Serial.print("HHMM: ");
    Serial.println(verbleibend);
    }  
  
  Serial.println("Zeit Bis An Ende <<<<<<<<<<<<<<<<<<<<<");
  return verbleibend;
  }

Ich habe schon gesehen wie man einen String zerteilt, also erste zwei stellen und letzte zwei stellen ausgeben, aber wie kann man das bei int machen? Oder muss man das Int zu einem String zuerst umwandeln?

Geht es um verbleibend? Steht da 145 drin, es soll als 1:45 angezeigt werden? Dann möglicherweise so:

 byte x = 145;
  Serial.print(x / 100);
  Serial.print(":");
  Serial.println(x % 100);

Im moment ist verbleibend 4-Stellig "1114", also 11 Stunden, 14 Minuten
Es kann jedoch auch 3 stellig sein, wenn es z.B. "830", also 8 Stunden, 30 Minuten sind.

Mit dem Beispiel von dir gibt er mir "0:90" aus.

int ZeitBisAn(int timerAn, int timerAus) {
  int verbleibend = uhrzeit()-timerAn;
  Serial.println("Zeit Bis An START >>>>>>>>>>>>>>>>>>>>");
  Serial.print("Timer1: ");
  Serial.println(timerAn);
  Serial.print("Uhrzeit: ");
  Serial.println(uhrzeit());
  Serial.print("Verbleibend: ");
  Serial.println(verbleibend);

  if(verbleibend<1000) {
    Serial.println("3-Stellig");
    Serial.print("HMM: ");
    Serial.println(verbleibend);
    }
  else {
    Serial.println("4-Stellig");
    Serial.print("HHMM: ");
    Serial.println(verbleibend);
    }
  byte x = verbleibend;
  Serial.print(x / 100);
  Serial.print(":");
  Serial.println(x % 100);
  
  Serial.println("Zeit Bis An Ende <<<<<<<<<<<<<<<<<<<<<");
  return verbleibend;
  }

Wenn die Zahl auch sooooo groß werden kann, daß sie nicht in ein Byte paßt, muß man es passend machen:

  unsigned int x = 1114;
  Serial.print(x / 100);
  Serial.print(":");
  Serial.println(x % 100);

Super, danke! So klappts!

Dan82:
// Wie kann man das besser zusammen schreiben? Wenn ich es mit + verknüpfe bekomme ich Fehler

Schau mal "Formatierung bei sprintf()" als Anregung.

Wenn man keine Formatierung auf konstante Breite braucht reicht auch die Streaming Library:
http://arduiniana.org/libraries/streaming/

Die überlädt den << Operator so dass man einen C++-artigen Ouput Stream hat. Und der Code der dabei rauskommt ist der gleiche, da im Hintergrund auch nur print() gemacht wird