Verstellbare Zeitschaltuhr

Hallo liebe Experten :slight_smile:

ich plane gerade für unsere Futterraufe eine Arduino-Zeitschaltuhr zu verwirklichen.
Der Clou an der Sache ist für mich die Manuelle Zeitverstellung, sprich auch ein DAU (Dümmster Anzunehmender User) soll über Tasten die Auslösezeiten verändern können.

In Stichworten zusammengefasst:

  • Arduino hat permanent Strom (Notstromversorgung über Akku-Pack)
  • RTC ermöglicht relativ genaue Uhrzeit
  • Eingabe der Auslösezeit (in meinem Fall Kiste öffnen) und Dauer (z.B. 1 Stunde, dann schließen)
  • max. 10 Auslösezeiten
  • Auslösezeit (und bei Schließen) steuert für eine Fix definierte Zeit (ca. 40 Sekunden) ein Relais an
  • externer Knopf ermöglicht Vorgang Öffnen oder Schließen zu jedem Gewünschten Zeitpunkt (Auffüllen)

Ja, das ganze ist z.B. mit einer Siemens Logo möglich - macht aber bei weitem nicht solchen Spaß :wink:

In der Vergangenheit habe ich bereits einige kleinere Projekte realisiert aber stoße mit der Manuellen Zeitverstellung ganz klar an meine Grenzen.
Hat jemand von euch vielleicht etwas ähnliches bereits probiert oder kann mir ein Codebeispiel nennen?

Besten Dank für eure Zeit und die Mühen!
MasterRed

Hallo,

sowas hatten wir vor ein paar Wochen schon mal hier. Wie willst Du denn die Zeiten eingeben können. Du schreibst über Taster. Dann brauchst Du noch eine Anzeige dazu damit du was siehst. Mit den Tastern must du halt eine Menue-Sruktur aufbauen. Normal werden dazu 3 -4 Taster benötigt.
Dann gibt es noch die oneButon Lib mit der kann man 3 Funktionen auf einen Taster legen.

kurz drücken, doppel drücken, lang drücken.

Mit der RTC hast Du die aktuelle Uhrzeit und das Datum. Die Uhrzeit must Du halt mehr oder weniger ständig abfragen und dann deine Schaltvorgänge ein / aus duchführen.

Hallo,
für eine Zeitschaltuhr (als RTC Cronodot) reicht ein Rotary-Encoder mit Taster.
Der Rest ist Hirn...
Gruß und Spaß
Andreas

Schreibe die Zeitvorgaben ins Eprom und lese sie bei jedem Start, dann kannst du auf die Notstromversorgung verzichten.
Dann noch ein Watchdog und er kann nicht im Nirvana hängen bleiben.

Besten Dank für die schnellen und hilfreichen Antworten!

@Rentner
Diesen Topic habe ich wohl übersehen, sorry!
Danke für den Tipp mit der oneButton Lib, war mir noch nicht bekannt.

@SkobyMobil
Rotary-Encoder sind eine Spitzen Idee!
Werd mir das durch den Kopf gehen lassen...

@Hausknecht
Watchdog? Ist das ein extra Bauteil?
Geschieht das öfter das sich der Arduino aufhängt?

Nochmals vielen Dank!!

Hallo MasterRed,

für den Wachhund braucht es keine weiteren Bauteile. Nur jeweils eine Zeile am Anfang und am Ende vom Programm. Lies dich einfach mal ein.
Ich habe Watchdog immer im Sketch stehen, da jedes Programm mal ins straucheln kommen kann.

Gruß

MiReu

Hallo MiReu,

danke für die Aufklärung!
Werde mich da einlesen - erst rechts wenn´s so einfach zu bewerkstelligen ist :wink:

Gruaß
MasterRed

MasterRed:
Watchdog? Ist das ein extra Bauteil?

Das kann, muß aber nicht.

Ein Lokführer muß regelmäßig eine Taste drücken, sonst wird der Zug automatisch durch den Wachhund gebremst. Je brisanter die zu schaltenden Aufgaben sind, desto wichtiger ist diese Überprüfungsfunktionalität.

Hallo Leute,

es war gerade eine stressige Zeit, da blieb einfach wenig Zeit sich zu vertiefen... >:(

Ich habe nun eine Vorab-Variante für die Zeitschaltuhr, noch mit fixen Zeiten.

Die besagte Kiste öffnet sich zu einer bestimmten Zeit (Relais aktiv für 20 sek.) und schließt sich zu gegebener Zeit.
Die Bewegung ist auch per Knopfdruck möglich (auf, zu, stop).

Was mich quält ist die Aktivzeit der Relais - das will einfach nicht!

Bitte seid so nett und schaut euch meine den Code mal an...!

Vielen vielen Dank!

Gruaß
MasterRed

//Erklärung zu Relais - diese sind bei HIGH offen und bei LOW geschlossen

#include <Wire.h>
#include <DS3231.h>

// Ralais Ansteuerung-Pin festlegen
const int Relay_1 = 2;
const int Relay_2 = 3;
const int Relay_3 = 4;
const int Relay_4 = 5;


// Taster Pin und Status
const int Taster_stop = 7;
const int Taster_auf = 8;
const int Taster_zu = 9;
int Taster_stop_status = 0;
int Taster_auf_status = 0;
int Taster_zu_status = 0;

DS3231  rtc(SDA, SCL);
Time t;


// Zeiten 1
const int OnHour1 = 6; //Zeit öffnen (24 HOUR FORMAT)
const int OnMin1 = 0;
const int OffHour1 = 7; //Zeit schließen
const int OffMin1 = 0;

// Zeiten 2
const int OnHour2 = 10; //Zeit öffnen (24 HOUR FORMAT)
const int OnMin2 = 0;
const int OffHour2 = 11; //Zeit schließen
const int OffMin2 = 0;

// Zeiten 3
const int OnHour3 = 14; //Zeit öffnen (24 HOUR FORMAT)
const int OnMin3 = 0;
const int OffHour3 = 15; //Zeit schließen
const int OffMin3 = 0;

// Zeiten 4
const int OnHour4 = 18; //Zeit öffnen (24 HOUR FORMAT)
const int OnMin4 = 00;
const int OffHour4 = 19; //Zeit schließen
const int OffMin4 = 00;

// Zeiten 5
const int OnHour5 = 22; //Zeit öffnen (24 HOUR FORMAT)
const int OnMin5 = 00;
const int OffHour5 = 23; //Zeit schließen
const int OffMin5= 00;


// Wie lange benötigt die Kiste für einen Vorgang
unsigned long StartMillis;
unsigned long currentMillis;
const unsigned long period = 20000;   // Millisekunden bis Relais abschaltet


// Funktion schliessen
void schliessen()
{
  digitalWrite(Relay_1,HIGH);  // schalte andere Relais sicherheitshalber ab
  digitalWrite(Relay_2,HIGH);
  digitalWrite(Relay_3,LOW);
  digitalWrite(Relay_4,LOW);
  Serial.println("Kiste schliesst");

unsigned long currentMillis = millis();
  if (currentMillis - StartMillis >= period)
   {
      StartMillis = currentMillis;
      Serial.print("Fertig ");
      alles_aus();
    }  
  }

  
// Funktion öffnen
void oeffnen()
{
  digitalWrite(Relay_1,LOW);
  digitalWrite(Relay_2,LOW);
  digitalWrite(Relay_3,HIGH);  // schalte andere Relais sicherheitshalber ab
  digitalWrite(Relay_4,HIGH);
  Serial.println("Kiste öffnet");
  
unsigned long currentMillis = millis();
  if (currentMillis - StartMillis >= period)
   {
      StartMillis = currentMillis;
      Serial.print("Fertig ");
      alles_aus();
    }   
}

void alles_aus()
{
  digitalWrite(Relay_1,HIGH);
  digitalWrite(Relay_2,HIGH);
  digitalWrite(Relay_3,HIGH);
  digitalWrite(Relay_4,HIGH);
  Serial.println("Alles Aus - Vorgang beendet");
}


void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_2, OUTPUT);
  pinMode(Relay_3, OUTPUT);
  pinMode(Relay_4, OUTPUT);
  pinMode(Taster_stop, INPUT);
  pinMode(Taster_auf, INPUT);
  pinMode(Taster_zu, INPUT);
  digitalWrite(Relay_1, HIGH);
  digitalWrite(Relay_2, HIGH);
  digitalWrite(Relay_3, HIGH);
  digitalWrite(Relay_4, HIGH);

  StartMillis = millis();  //initial start time
}

void loop() {
  
  t = rtc.getTime();

  unsigned long currentMillis = millis();  //get the current time
  delay (300);


// Taster
Taster_stop_status=digitalRead(Taster_stop);
if (Taster_stop_status == HIGH){
  alles_aus();
}

Taster_auf_status=digitalRead(Taster_auf);
if (Taster_auf_status == HIGH){
  oeffnen();
}
    
Taster_zu_status=digitalRead(Taster_zu);
if (Taster_zu_status == HIGH){
  schliessen();
}
  
// Öffnen nach Zeiten
   if(t.hour == OnHour1 && t.min == OnMin1 && t.sec == 0 ||
    t.hour == OnHour2 && t.min == OnMin2 && t.sec == 0 ||
    t.hour == OnHour3 && t.min == OnMin3 && t.sec == 0 ||
    t.hour == OnHour4 && t.min == OnMin4 && t.sec == 0 ||
    t.hour == OnHour5 && t.min == OnMin5 && t.sec == 0){
    oeffnen();
  }

// Schliessen nach Zeiten
  if(t.hour == OffHour1 && t.min == OffMin1 && t.sec == 0 ||
    t.hour == OffHour2 && t.min == OffMin2 && t.sec == 0 ||
    t.hour == OffHour3 && t.min == OffMin3 && t.sec == 0 ||
    t.hour == OffHour4 && t.min == OffMin4 && t.sec == 0 ||
    t.hour == OffHour5 && t.min == OffMin5 && t.sec == 0){
    schliessen();
    }
  }

was willst du mit
delay (300);

im loop erreichen?

Gernell:

deine Zeit-Abfragen sind eine Sekunde lang true.
Du verzögerst jetzt zwar mit delay(300) - das kann aber immer noch dazu führen, dass deine IF's 3 mal je Sekunde ausgeführt werden. Das sollst du beheben.

z.B. da du eh nur Schaltzeiten im Minuten-Auflösung hast brauchst du auch nur einmal je Minute überprüfen ob etwas zu ändern ist.

Generell würde ich für die Schaltzeiten ein Array verwenden.
Wenn dir die Aufteilung Stunde/Min wirklich gefällt vieleicht sogar ein struct.

ich würde das mit einer state machine Endlicher Automat – Wikipedia machen

ein enum mit:
idle // warten auf tastendruck oder Zeitsteuerung
Kiste_oeffnen
warten_nach_oeffnen // warten auf tastendruck oder Zeitsteuerung
Kiste_schliessen

oder so wie auf Wikipedia:
bei dir ist halt statt dass ein Sensor meldet "Zeitablauf"

(Bildlink auf svg nicht möglich ... )

Hallo noiasca,

besten Dank für den Input!

delay(300); war gedacht um bei Tastendruck nicht mehrmals auszulösen.
Wenn ich das im bestehenden Sketch jede Minute mache, muss ich im blödsten Fall 1 min drücken :slight_smile:

Den Array z.B. wie folgt?
Int kann wohl nur ganze Zahlen, ist dabei auch ein float möglich?

// Stunde Öffnen, Minute Öffnen, Dauer in Stunden
int Zeit1[3] = {6,0,1};

Der Endliche Automat klingt gut....nur weiß ich auch nach mehreren Beispiel nicht was warum und wie zusammengehört...meinst du so in etwa?

enum OEFFNEN (IDLE, Kiste_oeffnen, warten_nach_öffnen)

Kannst du mir das vielleicht mit einem Beispielcode unterlegen?

Vielen Dank für deine Mühen und vor allem die Geduld :wink:
MasterRed

Sodala....ich hab die Endliche Maschine nicht wirklich zum laufen gebracht...

Kann sich mal jemand die Mühe machen meinen alternativ-Code anzusehen?
Das Gerät muss mitte nächster Woche laufen - mir rennt hier leider die Zeit davon! :o

Er funktioniert einige male Tadellos und plötzlich fängt das Relais an zu Brummen - wird wohl pulsierend angefahren und der Timer greift nicht mehr. >:(
Als ob sich der Arduino aufhängt!

Woran liegt das bzw. kann ich dem mit einem WatchDog entgegen wirken?

Besten Dank!

#include <Wire.h>
#include <DS3231.h>

//Erklärung zu Relais - diese sind bei HIGH offen und bei LOW geschlossen

// Ralais Ansteuerung-Pin festlegen
const int Relay_1 = 2;
const int Relay_2 = 3;
const int Relay_3 = 4;
const int Relay_4 = 5;

// Taster Pin
const int Taster_stop = 7;
const int Taster_auf = 8;
const int Taster_zu = 9;


DS3231  rtc(SDA, SCL);
Time t;

int milliaktuell = millis();

//Zeit Öffnen - Stunde, Minute, Dauer in h
float Zeit1[3] = {6,0,1};
float Zeit2[3] = {10,0,1};
float Zeit3[3] = {14,0,1};
float Zeit4[3] = {18,0,1};
float Zeit5[3] = {22,0,1};

//Dauer Bewegung
const int bewegung = 10000;

void schliessen()
{ 
  digitalWrite(Relay_1,HIGH);  // schalte andere Relais sicherheitshalber ab
  digitalWrite(Relay_2,HIGH);
  digitalWrite(Relay_3,LOW);
  digitalWrite(Relay_4,LOW);
  Serial.println("Kiste schliesst");
 }

void oeffnen()
{
  digitalWrite(Relay_1,LOW);
  digitalWrite(Relay_2,LOW);
  digitalWrite(Relay_3,HIGH);  // schalte andere Relais sicherheitshalber ab
  digitalWrite(Relay_4,HIGH);
  Serial.println("Kiste öffnet");
}

void alles_aus()
{
  digitalWrite(Relay_1,HIGH);
  digitalWrite(Relay_2,HIGH);
  digitalWrite(Relay_3,HIGH);
  digitalWrite(Relay_4,HIGH);
  Serial.println("Alles Aus - Vorgang beendet");
}


void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_2, OUTPUT);
  pinMode(Relay_3, OUTPUT);
  pinMode(Relay_4, OUTPUT);
  pinMode(Taster_stop, INPUT_PULLUP);
  pinMode(Taster_auf, INPUT_PULLUP);
  pinMode(Taster_zu, INPUT_PULLUP);
  digitalWrite(Relay_1, HIGH);
  digitalWrite(Relay_2, HIGH);
  digitalWrite(Relay_3, HIGH);
  digitalWrite(Relay_4, HIGH);
}


void loop() {
t = rtc.getTime();

if (digitalRead(Taster_auf) == 1) {
    oeffnen();
    timer();
  }

if (digitalRead(Taster_zu) == 1) {
    schliessen();
    timer();
  }

if (digitalRead(Taster_stop) == 1) {
    alles_aus();
  }

if (t.hour == Zeit1[0] && t.min == Zeit1[1] ||
    t.hour == Zeit2[0] && t.min == Zeit2[1] ||
    t.hour == Zeit3[0] && t.min == Zeit3[1] ||
    t.hour == Zeit4[0] && t.min == Zeit4[1] ||
    t.hour == Zeit5[0] && t.min == Zeit5[1]) {
      oeffnen();
      timer();
    }
    
if (t.hour == (Zeit1[0]+Zeit1[2]) && t.min == Zeit1[1] ||
    t.hour == (Zeit2[0]+Zeit2[2]) && t.min == Zeit2[1] ||
    t.hour == (Zeit3[0]+Zeit3[2]) && t.min == Zeit3[1] ||
    t.hour == (Zeit4[0]+Zeit4[2]) && t.min == Zeit4[1] ||
    t.hour == (Zeit5[0]+Zeit5[2]) && t.min == Zeit5[1]) {
      schliessen();
      timer();
    }
}

void timer() 
{
    milliaktuell = millis();
    while(millis() < milliaktuell + bewegung){
      if (digitalRead(Taster_stop) == 1) {
      alles_aus();
      break;
  }
    }
    alles_aus();
}

a)versieh deine IF's mit Serial.Println damit du siehst was dein Programm macht.

b) welche lib ist das:

#include <DS3231.h>

bitte genaue Angabe/Link

c)watchdog ist die letzte Variante. Wenn alles funktioniert kann man den aktivieren. Aber einen wissentlichen Bug damit mit der Hammermethode zu umgehen ist imho ein nogo.

Hallo noiasca,

a) Ich hab überall Ausgaben angehängt, biss auf den Timer :roll_eyes:

Und wer ist der Übeltäter? Der Timer..... pfffff

Die Funktion startet ordnungsgemäß und beendet dann nicht - ab diesem Moment brummt das Relais bei einem Tastendruck!

b) #include <DS3231.h>

Verwendet wird die Lib von Rinky-Dink Electonics

http://www.rinkydinkelectronics.com/library.php?id=73

c) Schande über mein Haupt - du hast natürlich absolut recht!

Der Vorschlag kam aus tiefster Frustration :frowning:

Gibt es einen Fall in dem der Timer Aussetzer hat? Den kann ich doch auch mit wenigen Sekunden Abstand nutzen - oder?

ich weis zwar nicht warum du ausgerechnet diese uralte lib verwendest und nicht eine aus der IDE, aber ok.

ungeprüft, da ich momentan keinen DS anschließen wollte:

/*

  - Arduino hat permanent Strom (Notstromversorgung über Akku-Pack)
  - RTC ermöglicht relativ genaue Uhrzeit
  - Eingabe der Auslösezeit (in meinem Fall Kiste öffnen) und Dauer (z.B. 1 Stunde, dann schließen)
  - max. 10 Auslösezeiten
  - Auslösezeit (und bei Schließen) steuert für eine Fix definierte Zeit (ca. 40 Sekunden) ein Relais an
  - externer Knopf ermöglicht Vorgang Öffnen oder Schließen zu jedem Gewünschten Zeitpunkt (Auffüllen)

   http://forum.arduino.cc/index.php?topic=603373.0

   by noiasca

 * */


#include <Wire.h>
#include <DS3231.h>  // http://www.rinkydinkelectronics.com/library.php?id=73

//Erklärung zu Relais - diese sind bei HIGH offen und bei LOW geschlossen

// Ralais Ansteuerung-Pin festlegen
const int Relay_1 = 2;
const int Relay_2 = 3;
const int Relay_3 = 4;
const int Relay_4 = 5;

// Taster Pin
const int Taster_stop = 7;
const int Taster_auf = 8;
const int Taster_zu = 9;


DS3231  rtc(SDA, SCL);
Time t;

uint32_t milliaktuell = millis();                   //change:

const byte no_of_programs = 5;                   // wie viele Schaltprogramme sollen vorgesehen werden

struct {
  byte hour;
  byte min;
  byte open;
} zeit[no_of_programs];                          // jedes Zeitprogramm besteht aus 3 Elementen, daher ein struct, insgesamt brauchen wir dann mehrere Programme daher ein Array von diesem Struct

//Dauer Bewegung
const uint16_t bewegung = 10000;                  //change: hier brauchst kein signed int

uint32_t old_minute = 0 - 1;                      //speichert die Minute, wann die Zeitprogramme das letzte mal kontrolliert wurden

uint32_t previous_started = 0;                    //speichert wann die Motoren gestartet wurden
uint32_t previous_opend = 0;                      //speichert wann die Kiste geöffnet wurde, im Prinzip könnte man den letzten previous_started auch nehmen.

enum states {
  idle,   // warten auf tastendruck oder Zeitsteuerung
  kiste_oeffnen,
  kiste_schliessen
} state;


void schliessen()
{
  digitalWrite(Relay_1, HIGH); // schalte andere Relais sicherheitshalber ab
  digitalWrite(Relay_2, HIGH);
  digitalWrite(Relay_3, LOW);
  digitalWrite(Relay_4, LOW);
  Serial.println(F("Kiste schliesst"));
  state = kiste_schliessen;
}


void oeffnen()
{
  digitalWrite(Relay_1, LOW);
  digitalWrite(Relay_2, LOW);
  digitalWrite(Relay_3, HIGH); // schalte andere Relais sicherheitshalber ab
  digitalWrite(Relay_4, HIGH);
  Serial.println(F("Kiste öffnet"));
  state = kiste_oeffnen;
}

void alles_aus()
{
  digitalWrite(Relay_1, HIGH);
  digitalWrite(Relay_2, HIGH);
  digitalWrite(Relay_3, HIGH);
  digitalWrite(Relay_4, HIGH);
  Serial.println(("Alles Aus - Vorgang beendet"));
  state = idle;
}


void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_2, OUTPUT);
  pinMode(Relay_3, OUTPUT);
  pinMode(Relay_4, OUTPUT);
  pinMode(Taster_stop, INPUT_PULLUP);
  pinMode(Taster_auf, INPUT_PULLUP);
  pinMode(Taster_zu, INPUT_PULLUP);
  digitalWrite(Relay_1, HIGH);
  digitalWrite(Relay_2, HIGH);
  digitalWrite(Relay_3, HIGH);
  digitalWrite(Relay_4, HIGH);


  // wahrscheinlich willst du die Zeiten aus einem EEPROM auslesen, hier mal hardcoded:

  zeit[0].hour = 6; zeit[0].min = 0; zeit[0].open = 1;
  zeit[1].hour = 10; zeit[1].min = 0; zeit[1].open = 1;
  zeit[2].hour = 14; zeit[2].min = 0; zeit[2].open = 1;
  zeit[3].hour = 18; zeit[3].min = 0; zeit[3].open = 1;
  zeit[4].hour = 22; zeit[4].min = 0; zeit[4].open = 1;


  Serial.println(F("Kiste Steuerung"));

  state = idle;
}


void loop() {

  //t = rtc.getTime();    // noiasca: hab nur ich auskommentiert weil ich diese Hardware nicht angeschlossen habe und die Lib kein failover macht
  //Serial.println(t.min);

  switch (state)
  {
    case idle:
      break;
    case kiste_oeffnen:
      if (millis() - previous_started > bewegung)
      {
        alles_aus();
        state = idle;
        Serial.println(F("D124 öffnen beendet"));
      }
      break;
    case kiste_schliessen:
      if (millis() - previous_started > bewegung)
      {
        alles_aus();
        state = idle;
        Serial.println(F("D132 schließen beendet"));
      }
      break;
  }


  // Taster starten eine Aktion und setzen eventuell einen neuen Status

  if (!digitalRead(Taster_auf)) {
    oeffnen();
    previous_started = millis();
    state = kiste_oeffnen;
  }

  if (!digitalRead(Taster_zu)) {
    schliessen();
    previous_started = millis();
    state = kiste_schliessen;
  }

  if (!digitalRead(Taster_stop)) {
    alles_aus();
    state = idle;
  }


  // einmal pro Minute die Schaltprogramme kontrollieren ob etwas zu tun ist
  uint32_t current_minute = millis() / 60000;
  if (old_minute != current_minute)
  {
    Serial.print(F("D164 Schaltprogramme durchgehen ")); Serial.println(t.min);
    old_minute = current_minute;
    for (byte i = 0; i < no_of_programs; i++)
    {
      if (t.hour == zeit[i].hour && t.min == zeit[i].min)
      {
        oeffnen();
        state = kiste_oeffnen;
      }
      if (t.hour == zeit[i].hour + zeit[i].open && t.min == zeit[i].min)
      {
        schliessen();
        state = kiste_schliessen;
      }
    }
  }
}

da du nun die Öffnungsdauer in der Automatik hast, ist die State Machine langweilig. Ich habe es aber dennoch mal so gelassen.

ob du die States in den Aktionen oder in den Auslösern änderst, ist aktuell redundant. Nicht schön. Konnte mich aber nicht festlegen wo ich es hingeben soll. Tendenziell würde ich es eher zu den Tastern/den Auslösern geben und aus den funktionen eher wegnehmen.

Naja, soll ja nur so als Idee sein.

Ich wiederhole: Ist mangels Hardware ungeprüft!!!

noiasca, du bist der Hit :wink:

Ein Thema habe ich aber noch....

Wenn die Relais für mehr als 65 sek. geschlossen sein sollen, funktioniert der "bewegung" Wert nicht mehr...kannst du mir sagen wieso?
Ich benötige ev. sogar Öffnungszeiten von 80 sek.!

Info: Wird "öffnen" über die Uhrzeit gestartet, fehlt ein previous_started = millis();
Hab´s in den Code integriert, nun funktioniert´s bestens :slight_smile:

Vielen Vielen Dank für deine Hilfe und Unterstützung!!

Hi

const uint16_t bewegung = 10000;

Das wird daran liegen, daß ein 16-Bit-Wert maximal 65535 annehmen kann - und in ms sind Das knapp über 65 Sekunden.
Denke, wenn Du statt uint16_t uint32_t machst, wird's etwas länger dauern dürfen.
(wären dann 4294967295ms, = 4294967s, = 71582min, = 1193h, =49,7 Tage - ziemlich genau die Zeit, nachdem auch millis() überläuft, also wieder bei 0 anfängt)

MfG

Danke postmaster-ino !

Das war natürlich der richtige Tipp :slight_smile:

Vielen Dank!!

MasterRed:
Wenn die Relais für mehr als 65 sek. geschlossen sein sollen,

... dann hätte dein ursprüngliches int auch nicht funktioniert. :wink:

wenn du mit allen Änderungen fertig bist, dann entferne die Kommentare die dir nun klar sind und stell deine Endversion herein.

noiasca, stimmt :wink:

Stand der Dinge: die Futterraufe läuft im Testbetrieb und funktioniert bestens!

Ich werde die Hardware noch mit einem Bildschirm versehen um darüber die Werte anpassen zu können.

Das dauert mit Sicherheit ein wenig und vielleicht brauche ich nochmals eure Hilfe :smiley:

In weiterer Folge werde ich den vollständigen Code hier posten.

Nochmals Danke an alle fleißigen Helfer und natürlich besonders an noiasca für die seeehr umfangreiche Hilfe!!