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
14.12.2019, 22:01
Beitrag #41
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(14.12.2019 20:32)Tommy56 schrieb:  Also erst noch mal in Ruhe nachdenken, was sonst noch sein könnte, damit es nicht ein Faß ohne Boden wird.
Gaaanz wichtig - siehe BER Big Grin

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2019, 23:14 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2019 09:01 von RobertLeRopp.)
Beitrag #42
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(14.12.2019 20:32)Tommy56 schrieb:  So hast Du es aber definiert: <500 = Tag

Es geht (fast) alles. Du musst es nur programmieren. Wenn Du aber aller Momente mit neuen Ideen kommst, kann es auch sein, dass alles neu gemacht werden muss.

Also erst noch mal in Ruhe nachdenken, was sonst noch sein könnte, damit es nicht ein Faß ohne Boden wird.

Gruß Tommy

Ich verstehe was du meinst, muss jedoch sagen dass ich von Anfang an meinen Code eins zu eins wie er ist umschreiben wollte, nur ohne delay eben. Und dort war und ist es auch so das der Intervall nachts kürzer ist plus die Pause.
Ist also keine neue Idee Smile

Ich habe dennoch über deine Worte nachgedacht und habe eine neue Big Grin Nein, ehrlich gesagt wollte ich das auch schon von Anfang an, und zwar am Tag ebenfalls eine kleine Pause einplanen. Ich habe das jetzt einige stunden probiert und präsentiere meine noch nicht ganz funktionierende Lösung.

Ich schaffe es so zwar am Tag auch eine Pause zu haben, die Relais bleiben in der Nacht trotz anderem Intervall, so lange an wie am Tag

Der versuch war ein zweites Arry ein zu bringen:

Code:
const int nachtinterval[ schrittZahl] = {1, 5, 1, 5, 1, 5, 1, 5};

und dann unten bei
Code:
if (istTag)
ein zu bauen

Code:
#include <Arduino.h>

// Schritte der Schrittkette mit der Pinnummern des angezogenen Relais, oder
// 255 wenn kein Relais aktiv ist ( Pausenschritt )
const byte relPin[] = {2, 255, 3, 255, 4, 255, 5, 255};
const byte schrittZahl = sizeof(relPin); // so einfach möglich, da relPin als byte definiert ist
// Zeitdauer des jeweiligen Schrittes
const int interval[ schrittZahl] = {5, 1, 5, 1, 5, 1, 5, 1}; // Intervall für den Tag
const int nachtinterval[ schrittZahl] = {1, 5, 1, 5, 1, 5, 1, 5}; // Intervall für die Nacht
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
boolean istTag = true;   //  Merker ob es gerade hell oder dunkel ist

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

int sensorValue;

void setup() {
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  Serial.begin(9600 );
  delay (500);
  while (!Serial);
  for (int i = 0; i < schrittZahl; i++) {
    pinMode(relPin[i], OUTPUT);
  }
}

void loop() {
sensorValue = analogRead(A0);
  // 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;
    aktIntervall = 1000L * interval[neuerSchritt]; // Zeit für nächsten Schritt setzen

    if ( relPin[schrittNr] < 255  ) {
      //im aktuellen Schritt ist eine Relais an: -> ausschalten
      digitalWrite( relPin[schrittNr], LOW );
      //Serial.print( "Relais "); Serial.print( relPin[schrittNr] ); Serial.println(" AUS");
    }
    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 {
      // im Folgeschritt ist KEIN Relais eingetragen ( Pause )
      // hier kann gegebenenfalls geprüft werden, ob der Schritt übersprungen werden soll
      // ( Tag/Nacht Umschaltung )
      if ( istTag ) {      
       // Zeit für nächsten Schritt setzen
        // keine Pause
       aktIntervall = 1000L * interval[neuerSchritt]; //<-------- Tages Intervall
        Serial.print("");
        Serial.print( "Keine Pause, "); Serial.print("Sensorwert " ); Serial.println( sensorValue ); //Seriella Ausgabe des Sensorwertes
      } else {
        aktIntervall = 1000L * nachtinterval[neuerSchritt]; //<-------- Nacht Intervall
        Serial.print("");
        Serial.print( "Pause, "); Serial.print("Sensorwert " ); Serial.println( sensorValue );  
      }
    }
    schrittNr = neuerSchritt;           // Schrittnummer aktualisieren

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

  // Prüfen ob es hell oder dunkel ist, und das Flag 'istTag' entsprechend setzen
    
  if (sensorValue > 500) {
    istTag = true;
  }
  else if (sensorValue < 550) {
    istTag = false;
  }

}

Noch eine Frage zum Seriellen Monitor, eventuell kennt ja jemand hier die Lösung.

Das ganze läuft bei mir auf einem Raspberry Pi, ich habe hier jedoch nicht die Auswahl mir den Zeitstempel anzeigen zu lassen, ist für mich jedoch eine der wichtigsten Funktionen. Hat dazu jemand eine Idee ?


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2019, 09:08 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2019 09:21 von MicroBahner.)
Beitrag #43
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(14.12.2019 23:14)RobertLeRopp schrieb:  Ich schaffe es so zwar am Tag auch eine Pause zu haben, die Relais bleiben in der Nacht trotz anderem Intervall, so lange an wie am Tag
Klar, weil Du die Unterscheidung zwischen den beiden Arrays ja auch nur in der Pause machst.

Die Lösung ist eigentlich einfach. Hier
Code:
if ( neuerSchritt >= schrittZahl ) neuerSchritt = 0;
aktIntervall = 1000L * interval[neuerSchritt]; // Zeit für nächsten Schritt setzen
wird das Zeitintervall für den nächsten Schritt bereits bestimmt, und zwar unabhängig davon, ob Pause oder Relais schalten. Und deshalb musst Du dann auch die Unterscheidung Tag/Nacht hier machen. Die ganze Abfrage auf Tag/Nacht weiter unten im else-Zweig kannst Du dir dann sparen ( brauchst Du nur noch für die Ausgabe auf der seriellen Schnittstelle). Da darfst Du auch nicht mehr die Intervallzeit ändern. Das machst Du nur einmal an der oben gezeigten Stelle:
Code:
if ( neuerSchritt >= schrittZahl ) neuerSchritt = 0;
if ( istTag ) {      
  aktIntervall = 1000L * interval[neuerSchritt]; //<-------- Tages Intervall
} else {
  aktIntervall = 1000L * nachtinterval[neuerSchritt]; //<-------- Nacht Intervall
}

und im else-Zweig unten nur noch
Code:
} else {
      // im Folgeschritt ist KEIN Relais eingetragen ( Pause )
        Serial.print( "Pause, "); Serial.print("Sensorwert " ); Serial.println( sensorValue );  
    }

-----------------------------------
Edit: Deine Änderung bei der Tag-Nacht Erkennung ist auch nicht korrekt. Du darfst da nicht einfach < und > vertauschen, da dann die Hysterese nicht mehr funktioniert. Wie ich im letzten Post geschrieben habe, musst Du das Setzen des Flags entsprechend abändern, die < bzw. > müssen bleiben wie sie sind ( oder Du musst auch die Vergleichswerte entsprechend anpassen ).

Zum Zeitstempel: Du könntest die aktuellen millis() - gegebenenfalls /1000 als Sekunden ) mit ausgeben. Dann hast Du zwar keine absolute Zeit, aber immerhin eine relative, an der Du die Intervallzeiten siehst.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2019, 11:01
Beitrag #44
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Langsam könnte man über Structs (Pin,RelaisTag,RelaisNacht,PauseTag,PauseNacht) mit Konstruktor, init() und run() nachdenken.

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
15.12.2019, 11:05
Beitrag #45
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Ehrlich gesagt glaube ich nicht, dass er schon so weit ist Wink

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2019, 11:07
Beitrag #46
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(15.12.2019 11:05)MicroBahner schrieb:  Ehrlich gesagt glaube ich nicht, dass er schon so weit ist Wink
Ja, das befürchte ich auch. Dann evtl. als Anregung für Version 2.

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
15.12.2019, 12:53 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2019 12:55 von RobertLeRopp.)
Beitrag #47
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
(15.12.2019 11:05)MicroBahner schrieb:  Ehrlich gesagt glaube ich nicht, dass er schon so weit ist Wink

Ganz ehrlich, das glaube ich auch hahah. Oh man, ich bezweifle aktuell wirklich ob mein vorhaben mit Display und einem Menü für mich überhaupt realisierbar ist...

Ich versuche mich immer wieder in alle Befehle und Funktionen ein zu lesen, ich mache das meistens hier: https://www.arduino.cc/reference/en/

Könnt Ihr mir noch weitere Lernhilfen (Bücher etc) empfehlen um weiter ins Thema ein zu steigen ?
Es ist einfach unmöglich weiter zu machen mit meinen aktuellen (nicht vorhandenen) "skills" Confused
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2019, 12:59 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2019 12:59 von Tommy56.)
Beitrag #48
RE: Sich wiederholende Intervalle ohne Delay Verzweiflung
Dann schaue doch mal in die Rubrik Tutorials und Literatur hier im Forum.

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  for-schleife, delay, millis, interrupt Harry 5 75 Heute 19:49
Letzter Beitrag: Tommy56
  Denkanstoß gesucht - in Schrittkette delay() ersetzen SpaghettiCode 18 322 Heute 15:58
Letzter Beitrag: Tommy56
  delay-millis()-while-Sensorenabfrage RCudino 21 708 Gestern 20:23
Letzter Beitrag: Fips
  Menu funktioniert ohne Serial.println nicht GSA1150 7 121 Gestern 18:26
Letzter Beitrag: Tommy56
  Stepper Motor mit zwei Taster bedienen / Fehler ohne Fehlermeldung Milano 6 237 21.03.2020 16:06
Letzter Beitrag: MicroBahner
  Arduino IDE 1.8.11 , lassen sich keine Sketch.zip hinzufügen Christian_Moba-Arduino 4 479 23.02.2020 13:18
Letzter Beitrag: Christian_Moba-Arduino
  Scrollpausen im Oled Display ohne Delay Alter Fritz 7 430 25.01.2020 13:22
Letzter Beitrag: Alter Fritz
  Millis anstatt delay ThorstenP 25 1.995 29.11.2019 16:34
Letzter Beitrag: Tommy56
  Programm hängt sich auf Jonas Meier 3 473 13.11.2019 11:12
Letzter Beitrag: MicroBahner
  Schleife nur 1x durchlaufen ohne for... Hanibal_Smith 3 675 01.10.2019 19:44
Letzter Beitrag: Tommy56

Gehe zu:


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