Zusamenfügung zweier Sketche

Hi,
ich habe den Überblick verloren, das aber total.

Ziel: Zwei Relais schalten :

  1. per Zeit, (Bsp.: 08.00 h Strom für 30 sec einschalten)

  2. manuell mit Tasten

  3. per WLAN

  4. übers Internet

Bisher ist mir in Einzelsketchen gelungen:

Punkt 1 und Punkt 2

Dann habe ich die Sketche wie folgt zusammengefügt:

Als Einleitung die Int und define zusammengefügt.

Aus den beiden setups ebenfalls durch zusammenlegen ein void setup erstellt.

Dann void loop (Punkt 1) umgennant in void Teil1
und void loop (Punkt2) umgennant in void Teil2

Daraus ein Void loop

mit Teil 1
und Teil2

gemacht.

Beim Kompilieren meckert Arduino 1.8.4 dann bei void Teil1 /Teil2 rum. Dann habe ich in dem Bereich einige Klammern entfernt wieder hingesetztkammern und mittlerweile den Überblick komplett verloren.

Zusätzlich habe ich es noch geschafft die beiden Einzelsketche mit der zusammengefassten Version zu überschreiben. Applaus, Applaus.

Würde sich einer erbarmen und mir unter die Arme greifen!

Wenn, dann meinen herzlichsten Dank dafür

Zsammenfassung_2_Sketche.ino (8.6 KB)

Stelle Deinen Sketch bitte in Codetags (</> oben links).

Beim Programmieren sind Backups / Versionsverwaltung unverzichtbar. Wo hattest Du denn die beiden Einzelsketche her? Da werden sie wohl noch sein.

Gruß Tommy

Ob du es glaubst oder nicht, in der Form gibt s die Sketche nicht. Zumindest habe ich sie nicht gefunden.

D.h. das ich tatsächlich Hirnschmalz investiert habe. Sehr wohl habe ich eine Vielzahl artverwndter Sketche angschaut, analysiert und mir daraus meine Vorstellung zusammengebastelt.

VG

void Teil1();

Ich sehe die Deklaration.
Aber wo ist die Definition?

void"Teil2"();

Diese Deklaration ist vollkommen kaputt.
Und auch hier fehlt die Definition

rogim:
Ob du es glaubst oder nicht, in der Form gibt s die Sketche nicht. Zumindest habe ich sie nicht gefunden.

D.h. das ich tatsächlich Hirnschmalz investiert habe. Sehr wohl habe ich eine Vielzahl artverwndter Sketche angschaut, analysiert und mir daraus meine Vorstellung zusammengebastelt.

Und warum postest du deine aktuelle Version nicht wie üblich hier im Forum in Code-Tags ?
Dann kann man den Sketch auch mit mobilen Geräten lesen.
Und damit hast du gleich mehr Helfende.

rogim:
Ob du es glaubst oder nicht, in der Form gibt s die Sketche nicht. Zumindest habe ich sie nicht gefunden.

D.h. das ich tatsächlich Hirnschmalz investiert habe. Sehr wohl habe ich eine Vielzahl artverwndter Sketche angschaut, analysiert und mir daraus meine Vorstellung zusammengebastelt.

VG

Dann sollte es doch nicht unmöglich sein, die wieder aufzuschreiben. Du hast sie ja wohl noch halbwegs frisch in Erinnerung.

Gruß Tommy

So kompiliert der Code schon mal.
Man kann die Uhrzeit einstellen und die Relais mit den Tastern (Achtung andere Pinnummern) kurz einschalten.
Ob die "Weckfunktion" läuft musst du selbst testen.
Außerdem werden jetzt die Taster auf LOW abgefragt, die müssen also nach GND schalten.
Es gab ein paar syntaktische Fehler (falsche Klammern, Strichpunkte etc).

const int Relais1 = 12;
const int Relais2 = 11;
const int taster = 6;
const int taster2 = 7;
int tasterstatus = 0;   //Das Wort „tasterstatus" steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.
int tasterstatus1 = 0;

#include <Wire.h>
//#include <RtcDateTime.h>    // wird anscheinend nicht gebraucht
//#include <RtcDS1307.h>      // detto
//#include <RtcDS3231.h>      // detto
//#include <RtcTemperature.h> // detto
//#include <RtcUtility.h>     // detto

#define EIN HIGH
#define AUS LOW
#define RTC_I2C_ADDRESS 0x68  // 0x68 für DS1307 u. DS3231

struct timerRelais1_t {
  byte pin;
  byte dauer;
  int timer1;
};

struct timerRelais2_t {
  byte pin;
  byte dauer;
  int timer2;
};

// Hier den Kurzzeittimer definieren
timerRelais1_t timerRelais1={Relais1, 30, 1202}; // Timer an seinem Pin für 30 Sekunden um 0830 und 2000 ??

void relaisTimer1NachZeit(int thishour, int thisminute) {
  int thisTime= thishour*100+thisminute;
  if (thisTime==timerRelais1.timer1) {
    Serial.println("Timer Start");
    digitalWrite(timerRelais1.pin,EIN);
    delay(timerRelais1.dauer*1000L);
    digitalWrite(timerRelais1.pin,AUS);
    Serial.println("Timer Stopp");
  }
}

timerRelais2_t timerRelais2={Relais2, 30, 1203};

void relaisTimer2NachZeit(int thishour, int thisminute) {
  int thisTime= thishour*100+thisminute;
  if (thisTime==timerRelais2.timer2)
  {
    Serial.println("Timer Start");
    digitalWrite(timerRelais2.pin,EIN);
    delay(timerRelais2.dauer*1000L);
    digitalWrite(timerRelais2.pin,AUS);
    Serial.println("Timer Stopp");
  }
}

// Schaltet Zeitschaltuhr ein und aus und setzt Ausgang entsprechend
void relaisSchaltenNachZeit(int thishour, int thisminute) {
  boolean state;
  // Aus aktueller Zeit e. Schaltzeit bilden
  int thisTime= thishour*100+thisminute;
}  

int jahre,monate,tage,stunden,minuten,sekunden;   // wochentag bleibt  unberücksichtigt

// aktuelle Zeit aus RTC auslesen
void rtcReadTime(int &jahre, int &monate, int &tage, int &stunden, int &minuten, int &sekunden)  {  
   Wire.beginTransmission(RTC_I2C_ADDRESS);  // Reset the register pointer
   Wire.write(0);
   Wire.endTransmission();
   Wire.requestFrom(RTC_I2C_ADDRESS, 7);
   // A few of these need masks because certain bits are control bits
   sekunden    = bcdToDec(Wire.read() & 0x7f);
   minuten     = bcdToDec(Wire.read());
   stunden     = bcdToDec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm
   /*wochentag   = */bcdToDec(Wire.read());
   tage        = bcdToDec(Wire.read());
   monate      = bcdToDec(Wire.read());
   jahre       = bcdToDec(Wire.read())+2000;  
}

// aktuelle Zeit in der RTC speichern
void rtcWriteTime(int jahre, int monate, int tage, int stunden, int minuten, int sekunden)  {  
  Wire.beginTransmission(RTC_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(sekunden)); // 0 to bit 7 starts the clock
  Wire.write(decToBcd(minuten));
  Wire.write(decToBcd(stunden))  // If you want 12 hour am/pm you need to set  bit 6 (also need to change readDateDs1307)
  Wire.write(decToBcd(0));  // Wochentag unberücksichtigt
  Wire.write(decToBcd(tage));
  Wire.write(decToBcd(monate));
  Wire.write(decToBcd(jahre-2000));
  Wire.endTransmission();  
}

// Convert decimal number to binary coded decimal. Hilfsfunktion f RTC
byte decToBcd(byte val) {
  return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to decimal number. Hilfsfunktion f RTC
byte bcdToDec(byte val) {
  return ( (val/16*10) + (val%16) );
}

// input: pointer to a char array
// returns an integer number from the string (positive numbers only!)
// num=1, returns 1st number from the string and so on
int getIntFromString (char *stringWithInt, byte num) {
  char *tail;
  while (num>0)
  {
    num--;
    
    while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)) stringWithInt++; // skip non-digits
    tail=stringWithInt;
    while ((isdigit(*tail))&&(*tail!=0)) tail++; // find digits
    if (num>0) stringWithInt=tail; // new search string is the string after that number
  }  
  return(strtol(stringWithInt, &tail, 10));
}  

void behandleSerielleBefehle() {
  char linebuf[30];
  byte counter;
  if (Serial.available()) {
    delay(100); // Warte a Eintreffen aller Zeichen
    memset(linebuf,0,sizeof(linebuf)); // Zeilenpuffer löschen
    counter=0;
    while (Serial.available()) {
      linebuf[counter]=Serial.read(); // Zeichen in Zeilenpuffer einf
      if (counter<sizeof(linebuf)-1) counter++;
    }
    // Ab hier ist die Zeile eingelesen
    if (strstr(linebuf,"set")==linebuf) {  // Prüfe auf Befehl set
      // Zahlen im String auslesen
      tage=getIntFromString (linebuf,1);
      monate=getIntFromString (linebuf,2);
      jahre=getIntFromString (linebuf,3);
      stunden=getIntFromString (linebuf,4);
      minuten=getIntFromString (linebuf,5);
      sekunden=getIntFromString (linebuf,6);
    }
    else {
      Serial.println("Befehl unbekannt.");
      return;
    }
    // Plausibilitätsprüfung d Werte:
    if (jahre<2000 || monate<1 || monate>12 || tage<1 || tage>31 || (stunden+minuten)==0) {
      Serial.println(linebuf);
      Serial.println("\r\nFehlerhafte Angabe im 'set' Befehl");
      Serial.println("\r\nBeispiel:");
      Serial.println("set 28.08.2013 10:54\r\n");
      return;
    }
    rtcWriteTime(jahre, monate, tage, stunden, minuten, sekunden);
    Serial.println("Zeit, Datum auf neue Werte gesetzt.");
  }
}


void setup() {
  pinMode(Relais1, OUTPUT);
  pinMode(Relais2, OUTPUT);
  pinMode(taster, INPUT_PULLUP);
  pinMode(taster2, INPUT_PULLUP);

  Wire.begin(); // initialisiert die Wire-Library
  Serial.begin(9600);
  while (!Serial); // wait for serial, needed for Leonardo only
  Serial.println("\r\nZeitschaltuhr- und Kurzzeittimer-Demo");
  Serial.println("Coded by Jurs for German Arduino Forum");
  Serial.println("Jede Minute wird die aktuelle Zeit im Seriellen Monitor angezeigt");
  Serial.println("Ebenso alle Ein- und Ausschaltungen und die Kurzzeittimer-Aktion");
  Serial.println();
  Serial.println("Zeit mit einem 'set' Befehl im Serial Monitor neu setzen.");
  Serial.println("\r\nBeispiel:");
  Serial.println("set 28.08.2013 10:54\r\n");
  
  digitalWrite(timerRelais2.pin,AUS);
  pinMode(timerRelais2.pin,OUTPUT);

  digitalWrite(timerRelais1.pin,AUS);
  pinMode(timerRelais1.pin,OUTPUT);
}


void loop() {
  tasterstatus=digitalRead(taster);
  tasterstatus1=digitalRead(taster2);
  
  //Verarbeitung: Wenn der taster gedrücktist (Das Spannungssignal ist niedrig)
  if (tasterstatus == LOW) {
    digitalWrite(Relais1, HIGH);
    delay (1000);
    digitalWrite(Relais1, LOW);
  }

  if (tasterstatus1 == LOW) {
    digitalWrite(Relais2, HIGH);
    delay (1000);     // war 10000
    digitalWrite(Relais2, LOW);
  }
  else {      //...ansonsten...
    digitalWrite(Relais1, LOW);
    digitalWrite(Relais2, LOW);
  }


  //  void"Teil2"() ===================================
  char buffer[30];
  static unsigned long lastMillis;
  static int lastMinute;
  int stunden, minuten, sekunden, dummy;
  if (millis()-lastMillis>1000) {   // nur einmal pro Sekunde
    lastMillis=millis();
    rtcReadTime(dummy, dummy, dummy, stunden, minuten, sekunden);
    if (minuten!=lastMinute) {   // die aktuelle Minute hat gewechselt
      lastMinute=minuten;
      snprintf(buffer,sizeof(buffer),"%02d:%02d Uhr",stunden,minuten);
      Serial.println(buffer);
      relaisSchaltenNachZeit(stunden,minuten);
      relaisTimer1NachZeit(stunden,minuten);
      relaisTimer2NachZeit(stunden,minuten);
    }
  }
  
  behandleSerielleBefehle();
}

Schaut nach zusammenkopiertem Code aus wo das Verständnis nicht zu 100% da ist, was jede Anweisung macht. Das ist eben zu Beginn so (war und ist bei mir genauso) und nicht zuletzt ist das auch ein Teil des Erfolgskonzeptes der Arduino-Gemeinde.
Ziel sollte aber sein, dass man doch so einigermaßen versteht was da so abläuft, sonst sind Änderungen und Anpassungen schwierig und man muss immer nachfragen. :slight_smile:

Hallo!

Meinen allerherzlichsten uxomm!!!
Somit kann ich meinen Versuch mit deiner Lösung vergleichen und schauen wo ich die Fehler gemacht habe.

((tommy: Dann sollte es doch nicht unmöglich sein, die wieder aufzuschreiben. Du hast sie ja wohl noch halbwegs frisch in Erinnerung.

Gruß Tommy

Kaum zu glauben: die Idee hatte ich auch, und noch unglaublicher: auch umgesetzt))

Ganz kurz zu meiner Intention. Ich bin 60 J. jung bzw. alt und habe eine ganz bestimmte Vorstellung wie eine Terrassentürrollade automatisch gesteuert werden soll bzw. muß.
Da ich am Markt keine für mich genügende, kaufbare Umsetzung finden konnte, bin ich beim Suchen im Internet auf den esp8266 gestoßen.
Fortan habe ich mich mit der Thematik beschäftigt und wurde von Tag zu Tag vertrauter mit der Materie.
Aber je mehr ich verstand, umso weniger blickte ich durch.

Ich gestehe, dass ich eine sehr zielgerichtete Lösung schnell finden möchte.
Dabei gehe ich natürlich nicht
in die Foren und frage wie geht das, könnt ihr nicht etc.

Ich habe stundenlang gesucht, getüftelt und und. Dies ist erst meine 2. Frage, die ich ins Netz gestellt habe.

Natürlich sind die von mir zusammengefügten 'Sketche Mustersketche aus dem Internet.

Allerdings habe ich sie m.E. schon sehr stark auf meine Bedürfnisse geändert.
Bei dem Tastersketch konntein der Grundversion nur eine LED geschaltet werden.

Meine Änderung ist die Ergänzung um einen weiteren Taster.

Bei der Zeitsteuerung habe ich einen Großteil des Sketches , der zu bestimmten Zeiten ein-ausschaltet, entfernt.

Für die Impulsschaltung wurde nur eine Möglichkeit angeboten.
Somit habe ich diesen Sketch um eine 2.Impulsschaltung erweitert.

Und alles hat im Einzelsketch funktioniert.

Es ist mir schon klar das ich momentan den 3. und 4. Schritt vor dem 1. und 2. mache.

Aber sobald das Ziel erreicht ist, werde ich die fehlenden Schritte nachholen. Es ärgert mich selber,
wenn da was steht was ich nicht deuten kann.

VG

Das sollte natülich heißen:

meinen allerherzlichsten DANK uxomm!!!

rogim:
Das sollte natülich heißen:

meinen allerherzlichsten DANK uxomm!!!

Dennoch solltest du auf alle Anmerkungen hier im Forum reagieren.
Dann hast du gleich mehr, die dir helfen.

Ignorieren ist immer ein schlechter Zug. :wink:

Sorry,

aber das mit den Code Tags habe ich tatsächlich übersehen.

Verspreche Besserung.

Einen schönen Abend noch!