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:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Timer läuft nicht so, wie ich wohl will
02.01.2021, 17:40
Beitrag #1
Timer läuft nicht so, wie ich wohl will
Servus,

mein Problem ist, dass meine Schaltung nicht immer so läuft, wie ich es gerne hätte.

Manchmal schon, meist aber auch nicht.

Es geht darum, ein Ausgang soll wenn es dunkel wird einschalten, ein anderer dann ausschalten.
Wiederum sollen wenn es wieder hell wird, die Eingänge wieder andersherum geschaltet werden.

Das ganze soll mit einer Zeitverzögerung passieren.

Alles klappt auch, nur manchmal "greift" die Zeitverzögerung (interval2) nicht, sondern es schaltet direkt durch. Der andere Wert (interval) klappt aber immer. Ich war mir nicht sicher, ob ich "now" für beide als Wert hernehmen kann, deshalb habe ich now2.

Die Schaltung habe ich mit zwei LEDs an 9 und 10, sowie einem LDR an A5 mit einem Uno aufgebaut zum simulieren.
Später wird das ganze mit einer Relais Karte laufen und schaltet einen Motor. Die Werte für die Helligkeit sind bewusst variabel gehalten, damit es Abends und Morgens getrennt geregelt werden kann. Auch die Zeit soll variabel addiert werden können.

Hier mal der Code:

Code:
#define Relais_ab 9
#define Relais_auf 10
int LDR = A5;
int ldr_state = 0;
int debug = 1; // KEINE ANZEIGE der Werte mehr im Seriellen Monitor bei 0
int moving = 0;                                                                                  
unsigned long zeitStempel=0;
unsigned long zeitStempel2=0;
const unsigned long interval = 40000UL;   // Verzögerung hell/dunkel      
const unsigned long interval2 = 5000UL;   // Verzögerung dunkel/hell

void setup () {
if (debug == 1) Serial.begin(9600);
pinMode (Relais_auf, OUTPUT);
pinMode (Relais_ab, OUTPUT);
pinMode (LDR, INPUT);
}

void loop () {
unsigned long now = millis();
unsigned long now2 = millis();
ldr_state=analogRead(LDR);
    if  (ldr_state <= 250) {          // Schaltpunkt: Klappe ZU fahren
       if (now - zeitStempel >= interval) {
            zeitStempel = now;
            moving = LOW;  
            }
    }
   else if  (ldr_state >= 750)  {  // Schaltpunkt: Klappe AUF fahren
       if (now2 - zeitStempel2 >= interval2) {
            zeitStempel2 = now2;
            moving = HIGH;
            }
    }
    digitalWrite(Relais_ab, moving);    
    digitalWrite(Relais_auf, !moving);

if (debug == 1) {                      
Serial.print("LDR: ");                                              
Serial.print(ldr_state);                            
Serial.print(" Move: ");
Serial.print(moving);
Serial.print(" ");
Serial.print(now);
Serial.print(" ");
Serial.print(zeitStempel);
Serial.print(" ");
Serial.print(now2);
Serial.print(" ");
Serial.print(zeitStempel2);
Serial.print(" ");
Serial.println();
delay(1000);
}
}

Danke für eure Anregungen.

Gruß
Claus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.01.2021, 17:50
Beitrag #2
RE: Timer läuft nicht so, wie ich wohl will
Evtl. wäre es auch gut, wenn Du uns in Deinem anderen Thread über den Stand informierst.

Bitte formatiere Deinen Code ordentlich (<Strg>+T in der IDE hilft Dir dabei). Das erhöht die Lesbarkeit.

now brauchst Du nur 1 Mal.
Wenn Du eine Verzögerung willst, musst Du auch eine solche programmieren.

Pseudocode:
Code:
if  (ldr_state <= 250) {
  startwert setzen
  wenn (now - startwert >= intervall) -> schalten
}

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
02.01.2021, 17:58
Beitrag #3
RE: Timer läuft nicht so, wie ich wohl will
Und noch ein kleiner Tipp.
Einen analogen Eingangspin brauchst du nicht als Eingang zu definieren, der kann nur Eingang.
Auch ist der Pin A5 ungünstig.
Nimm A0 bis A3, da A4 und A5 die Pins für I2C sind und du dann evtl. alles umstellen musst, falls es gebraucht wird.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2021, 09:43
Beitrag #4
RE: Timer läuft nicht so, wie ich wohl will
Danke Dieter.

Das sieht dann so aus:

Code:
#define Relais_ab 9
#define Relais_auf 10
int LDR = A0;
int ldr_state = 0;
int debug = 1; // KEINE ANZEIGE der Werte mehr im Seriellen Monitor bei 0
int moving = 0;
unsigned long zeitStempel = 0;
unsigned long zeitStempel2 = 0;
const unsigned long interval = 40000UL;   // Verzögerung hell/dunkel
const unsigned long interval2 = 5000UL;   // Verzögerung dunkel/hell

void setup () {
  if (debug == 1) Serial.begin(9600);
  pinMode (Relais_auf, OUTPUT);
  pinMode (Relais_ab, OUTPUT);
  //pinMode (LDR, INPUT);
}

void loop () {
  unsigned long now = millis();
  //unsigned long now2 = millis();
  ldr_state = analogRead(LDR);
  if  (ldr_state <= 250) {      // Schaltpunkt: Klappe ZU fahren
    zeitStempel = now;
    if (now - zeitStempel >= interval) {
      //zeitStempel = now;
      moving = LOW;
    }
  }
  else if  (ldr_state >= 750)  {  // Schaltpunkt: Klappe AUF fahren
    zeitStempel2 = now;
    if (now - zeitStempel2 >= interval2) {
      //zeitStempel2 = now2;
      moving = HIGH;
    }
  }
  digitalWrite(Relais_ab, moving);
  digitalWrite(Relais_auf, !moving);

  if (debug == 1) {
    Serial.print("LDR: ");
    Serial.print(ldr_state);
    Serial.print(" Move: ");
    Serial.print(moving);
    Serial.print(" ");
    Serial.print(now);
    Serial.print(" ");
    Serial.print(zeitStempel);
    Serial.print(" ");
    Serial.print(zeitStempel2);
    Serial.print(" ");
    Serial.println();
    delay(1000);
  }
}

JETZT ists klar.Weil die Bedingung erst einmal erfüllt sein musste, bevor die Variable gefüllt wurde. Logisch eigentlich, wenn man darauf gestoßen wird.

Danke. Perfekt.
Das andere Thema ist WIP, das Update kommt.

Gruß
Claus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2021, 19:26 (Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2021 19:32 von Raging Ender.)
Beitrag #5
RE: Timer läuft nicht so, wie ich wohl will
Jetzt habe ich deine Tips (hoffentlich alle) eingebunden und noch einen button hinzugefügt.
Damit soll der Motor hochfahren, dann nach einer Zeit wieder zufahren.

Code:
#define relais_ab 9
#define relais_auf 10
#define button_auf 11
int ldr = A0;
int ldr_state = 0;
int buttonstate = 0;
int lastbuttonstate = 0;
int moving = 0;
unsigned long zeitstempel = 0;
unsigned long zeitstempel2 = 0;
unsigned long zeitstempel3 = 0;
const unsigned long interval = 40000UL;   // Verzögerung hell/dunkel
const unsigned long interval2 = 5000UL;   // Verzögerung dunkel/hell
const unsigned long interval3 = 50000UL;  // Verzögerung nach Button
int debug = 1; // KEINE ANZEIGE der Werte mehr im Seriellen Monitor bei 0

void setup () {
  if (debug == 1) Serial.begin(9600);
  pinMode (relais_auf, OUTPUT);
  pinMode (relais_ab, OUTPUT);
  pinMode (button_auf, INPUT_PULLUP);
}

void loop () {
  unsigned long now = millis();
  ldr_state = analogRead(ldr);
  buttonstate = digitalRead(button_auf);
  if  (ldr_state <= 250) {                            // Schaltpunkt: Klappe ZU fahren
    zeitstempel = now;
    if (now - zeitstempel >= interval) {
      moving = LOW;
    }
  } else if  (ldr_state >= 750)  {                    // Schaltpunkt: Klappe AUF fahren
    zeitstempel2 = now;
    if (now - zeitstempel2 >= interval2) {
      moving = HIGH;
    }
  } else if (buttonstate == HIGH || lastbuttonstate == HIGH) {
    lastbuttonstate = buttonstate;
    moving = HIGH;
    zeitstempel3 = now;
    if (now - zeitstempel3 >= interval3) {
      lastbuttonstate = LOW;
    }
  }
  digitalWrite(relais_ab, moving);
  digitalWrite(relais_auf, !moving);

  if (debug == 1) {
    Serial.print("LDR: ");
    Serial.print(ldr_state);
    Serial.print(" Move: ");
    Serial.print(moving);
    Serial.print(" ");
    Serial.print(buttonstate);
    Serial.print(" ");
    Serial.print(now);
    Serial.print(" ");
    Serial.print(zeitStempel);
    Serial.print(" ");
    Serial.print(zeitStempel2);
    Serial.print(" ");
    Serial.print(zeitStempel3);
    Serial.print(" ");
    Serial.println();
    delay(1000);
  }
}

Danke schön, für die Tips. Ich hoffe, dass jetzt der Groschen gefallen ist.

LG
Claus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Zähler zählt nicht wonk 14 283 Gestern 20:26
Letzter Beitrag: wonk
  Die && Verknuepfung von zwei Schaltern auf ESP8266 will nicht. gutschy 2 91 Gestern 13:44
Letzter Beitrag: Tommy56
  Methode wird nicht aufgerufen rrobbyy 7 139 19.01.2021 15:59
Letzter Beitrag: katsumi_s
  LiquidCrystal.h nicht gleichzeitig mit DAC_MCP49xx.h? fanwander 9 270 18.01.2021 21:30
Letzter Beitrag: fanwander
  HC-SR04 Alarmsketch läuft nicht richtig auf Digispark tapsi 9 395 31.12.2020 13:53
Letzter Beitrag: hotsystems
  Wetterstation mal anders - Funktionsaufrufe werden nicht „abgearbeitet“ kunstelch 12 820 21.12.2020 16:51
Letzter Beitrag: kunstelch
  Motor über L298N Bridge drehen funktioniert nicht mt14516 3 410 10.11.2020 21:04
Letzter Beitrag: mt14516
  Simple if Bedingung funktioniert nicht (Anfänger) Maxcruiser 12 919 22.09.2020 16:12
Letzter Beitrag: hotsystems
  Hochladen eines Sketches funktioniert nicht otti123 29 4.016 05.09.2020 15:33
Letzter Beitrag: hotsystems
  Probleme mit millis(); timer basteldin 3 629 01.09.2020 19:04
Letzter Beitrag: basteldin

Gehe zu:


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