INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 2 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Sich wiederholende Intervalle ohne Delay Verzweiflung
11.12.2019, 17:25 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2019 17:27 von RobertLeRopp.)
Beitrag #9
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(11.12.2019 17:06)Tommy56 schrieb:  Und woher weist Du, ob es Tag oder Nacht ist?
Sind die Nachtpausen gleich lang?

Wir warten dann mal auf die Skizze.

Gruß Tommy

Danke für deine Bemühungen es zu verstehen.

Ich weis leider nicht wie ich euch anhand meines Falles eine Skizze zeichnen soll.

Wie lange die Relais und in welchem Abstand zueinander sie laufen sollen habe ich ja bereits erklärt.

Aber hier nochmals:
Relai1 5 Minuten an, nach Ablauf der 5 Minuten aus
Relai2 5 Minuten an, nach Ablauf der 5 Minuten aus
Relai3 5 Minuten an, nach Ablauf der 5 Minuten aus
Relai3 5 Minuten an, nach Ablauf der 5 Minuten aus
Und nun wie auch immer, einen endlosen Replay der ganzen Sache.
Wie gesagt, jedes Relai nacheinander, nicht gleichzeitig.

Ob es Tag oder Nacht ist wird bei mir über den Wert einer Photodiode festgestellt.

Code:
const int threshold = 100;

void loop() {

int sensorValue = analogRead(A0);

if (sensorValue > threshold) {
//mache etwas
}
else {
//mache etwas anderes
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 17:34 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2019 17:35 von Tommy56.)
Beitrag #10
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Da solltest Du eine Hysterese einbauen, sonst flattert das am Umschaltpunkt:
Code:
bool isNacht = false;
int sensorValue = analogRead(A0);

if (sensorValue > threshold + 10) {
  isNacht = false;
}
else if (sensorValue < threshold - 10) {
  isNacht = true;
}
Oder umgekehrt, je nach Schaltung.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 17:50
Beitrag #11
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Das was Du willst ist einfach eine kleine Ablaufsteuerung/Schrittkette. Das Ablaufen der Zeit ist der 'Trigger' um den nächsten Schritt auszuführen. Du musst dir in einer Variable merken in welchem Schritt Du gerade bist, damit Du beim Zeitablauf dann die entsprechenden Aktionen ausführen kannst (Relais aus/ein ) und zum nächsten Schritt schaltest..
Da alles immer nacheinander abläuft, brauchst Du auch nur einen Zeitzähler.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 18:29 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2019 18:37 von MicroBahner.)
Beitrag #12
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
hier ein Ansatz, den Du dann aufbohren kannst:
Code:
const byte relPin[] = {2, 3, 4, 5};
const byte relZahl = sizeof(relPin); // so einfach, da relPin als byte definiert ist
unsigned long previousMillis;
unsigned long aktIntervall;
int interval[] = {3000, 6000, 9000, 12000};
byte schrittNr = relZahl - 1;

void setup() {

  for (int i = 0; i < relZahl; i++) {
    pinMode(relPin[i], OUTPUT);
  }
}

void loop() {
  if (millis() - previousMillis >= aktIntervall) {
    previousMillis = millis();
    byte neuerSchritt = schrittNr+1;
    if ( neuerSchritt >= relZahl ) neuerSchritt = 0;
    digitalWrite( relPin[schrittNr], LOW );
    digitalWrite( relPin[neuerSchritt], HIGH );
    schrittNr = neuerSchritt;
    aktIntervall = interval[schrittNr];
  }
}

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 21:07 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2019 21:10 von MicroBahner.)
Beitrag #13
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Hallo,
jetzt etwas verallgemeinert und mit Kommentaren. Ich hoffe, Du verstehst den Ablauf damit etwas besser. Der Sketch enthält jetzt auch den Ansatz für die Pausenintegration. Falls noch was unklar ist, kannst Du auch gleich hier fragen. Eventuell interessiert es ja auch den einen oder andern Mitleser.
Code:
// Schritte der Schrittkette mit der Pinnummern des angezogenen Relais, oder
// 255 wenn kein Relais aktiv ist ( Pausenschritt )
const byte relPin[] = {2, 255, 3, 4, 5};
const byte schrittZahl = sizeof(relPin); // so einfach möglich, da relPin als byte definiert ist
// Zeitdauer des jeweiligen Schrittes
const int interval[] = {3000, 1000, 2000, 2000, 5000};
byte schrittNr = schrittZahl - 1;   // Nummer des aktiven Schrittes ans Ende setzen
// beim ersten Start von loop wird dann auf den ersten Schritt (Index 0 )
// umgeschaltet

// Variable für die Zeitsteuerung
unsigned long previousMillis = 0;
unsigned long aktIntervall = 0;

void setup() {

  for (int i = 0; i < schrittZahl; i++) {
    pinMode(relPin[i], OUTPUT); // hier könnte man noch prüfen, ob es eine 'echte' Pinnummer ist, aber eigentlich macht pinMode das schon.
  }
}

void loop() {
  // vvvvvvvvvvvvvv  zeitgesteuerte Schrittkette  vvvvvvvvvvvvvvv
  if (millis() - previousMillis >= aktIntervall) {
    // Zeitdauer des aktuellen Schrittes ist abgelaufen
    previousMillis = millis();
    // Index des nächsten Schrittes berechnen, bei Überlauf wieder von vorn
    byte neuerSchritt = schrittNr + 1;
    if ( neuerSchritt >= schrittZahl ) neuerSchritt = 0;

    if ( relPin[schrittNr] < 255  ) {
      //im aktuellen Schritt ist eine Relais an: -> ausschalten
      digitalWrite( relPin[schrittNr], LOW );
    }
    if ( relPin[neuerSchritt] < 255 ) {
      // im Folgeschritt soll ein Relais eingeschaltet werden
      digitalWrite( relPin[neuerSchritt], HIGH );
    } else {
      // im Folgeschritt ist KEIN Relais eingetragen ( Pause )
      // hier kann gegebenenfalls geprüft werden, ob der Schritt übersprungen werden soll
      // ( Tag/Nacht Umschaltung )
    }
    schrittNr = neuerSchritt;           // Schrittnummer aktualisieren
    aktIntervall = interval[schrittNr]; // Zeit für aktuellen Schritt setzen

  } // ^^^^^^^^^^^^^^^ Ende Schrittkette ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  // Hier können Dinge erledigt werden, die von der Schrittkette unabhängig sind.
}

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 22:14
Beitrag #14
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Hallo MicroBahner, tausend dank für deine Zeit Heart

Ich versuche das nun alles zu verstehen und lese mich in die von dir benutzen Funktionen ein.

Was mir noch unklar ist aber sehr wichtig wäre, ist die Serielle Ausgabe, eben die Info welches Relai gerade an ist. Ich habe das schon geschafft aber nur so das der Monitor durchgehen mit der Ausgabe vom aktuellen Relai geflutet wird.

Gibt es die Möglichkeit, pro geschaltetem Relai immer nur die jeweilige Ausgabe einmal zu machen ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 22:33 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2019 22:34 von MicroBahner.)
Beitrag #15
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Wenn Du die seriellen Ausgaben in der Schrittkette dort machst, wo auch die digitalen Ausgänge geschaltet werden, dann werden sie auch immer nur zum Schaltzeitpunkt einmalig ausgegeben.
z.B.
Code:
if ( relPin[neuerSchritt] < 255 ) {
      // im Folgeschritt soll ein Relais eingeschaltet werden
      digitalWrite( relPin[neuerSchritt], HIGH );
      Serial.print( "Relais "); Serial.print( relPin[neuerSchritt] ); Serial.println(" EIN");
    } else {

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2019, 22:50
Beitrag #16
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(11.12.2019 22:33)MicroBahner schrieb:  Wenn Du die seriellen Ausgaben in der Schrittkette dort machst, wo auch die digitalen Ausgänge geschaltet werden, dann werden sie auch immer nur zum Schaltzeitpunkt einmalig ausgegeben.
z.B.
Code:
if ( relPin[neuerSchritt] < 255 ) {
      // im Folgeschritt soll ein Relais eingeschaltet werden
      digitalWrite( relPin[neuerSchritt], HIGH );
      Serial.print( "Relais "); Serial.print( relPin[neuerSchritt] ); Serial.println(" EIN");
    } else {

Super das klappt.

Ich habe jetzt einige Versuche mit der Variante

Code:
if ( relPin[schrittNr] < 255  ) {
      //im aktuellen Schritt ist eine Relais an: -> ausschalten
      digitalWrite( relPin[schrittNr], LOW );
    }
    if ( relPin[neuerSchritt] < 255 ) {
      // im Folgeschritt soll ein Relais eingeschaltet werden
      digitalWrite( relPin[neuerSchritt], HIGH );
    } else {
      // im Folgeschritt ist KEIN Relais eingetragen ( Pause )
      // hier kann gegebenenfalls geprüft werden, ob der Schritt übersprungen werden soll
      // ( Tag/Nacht Umschaltung )

durchgespielt aber bekomme die Pause absolut nicht ordentlich zum laufen und habe auch keine Idee, wie ich den Tag und Nacht Fall bei
Code:
else
einbauen kann Huh
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Nextion an Arduino und umgekehrt ohne Bibliothek night022 23 327 17.09.2020 04:59
Letzter Beitrag: night022
  Fehler bei delay über 32767 Kleingärtner 5 592 07.05.2020 18:51
Letzter Beitrag: Kleingärtner
Question Sketch compilieren und testen ohne hochladen? Triax16 18 1.656 02.05.2020 12:48
Letzter Beitrag: Bitklopfer
  SoftwareSerial.h und SD.h vertragen sich nicht sowerum 25 2.053 25.04.2020 10:46
Letzter Beitrag: hotsystems
  Wie bekomme ich DIESES Delay weg. DO3GE 9 943 18.04.2020 12:44
Letzter Beitrag: Fips
  delay-millis()-while-Sensorenabfrage RCudino 22 2.011 01.04.2020 06:46
Letzter Beitrag: RCudino
  Denkanstoß gesucht - in Schrittkette delay() ersetzen SpaghettiCode 19 1.484 31.03.2020 21:31
Letzter Beitrag: MicroBahner
  for-schleife, delay, millis, interrupt Harry 8 978 31.03.2020 21:02
Letzter Beitrag: Harry
  Menu funktioniert ohne Serial.println nicht GSA1150 7 727 30.03.2020 18:26
Letzter Beitrag: Tommy56
  Stepper Motor mit zwei Taster bedienen / Fehler ohne Fehlermeldung Milano 6 814 21.03.2020 16:06
Letzter Beitrag: MicroBahner

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste