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
  warum läuft der Timer 6min und nicht 5? Peff 27 1.605 19.06.2021 19:39
Letzter Beitrag: Tommy56
  Nano. Sketch kann nicht hochgeladen werden 4heiner 10 1.289 26.05.2021 20:56
Letzter Beitrag: Tommy56
  MoBaTools: Buttons am MCP23017 und Timer Nordlicht 60 4.793 27.04.2021 10:38
Letzter Beitrag: Tommy56
  Bibliothek einbinden funktioniert nicht Maxcruiser 5 732 18.04.2021 21:31
Letzter Beitrag: Tommy56
  Programm startet bei Neustart nicht Moritzzz 18 1.676 02.04.2021 14:06
Letzter Beitrag: Tommy56
  Arduino Ampelschaltung Taster funktioniert nicht fatihakan36 9 1.335 13.03.2021 22:06
Letzter Beitrag: N1d45
  Library Ethernet: Nicht zu compilieren GuaAck 5 844 22.02.2021 17:31
Letzter Beitrag: Tommy56
  von delay auf millis umgestellt, klappt nur nicht. Servo Geschwindigkeit einstellen. gutschy 8 1.358 21.02.2021 15:22
Letzter Beitrag: gutschy
  MMega2560-Clone läßt sich nicht programmieren kpc 8 1.044 08.02.2021 09:50
Letzter Beitrag: hotsystems
  If-Schleife wird nicht mehr durchlaufen LK2567 2 689 05.02.2021 21:20
Letzter Beitrag: LK2567

Gehe zu:


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