Probleme mit Delay

Hallo zusammen,

mit meinem Arduino Uno habe ich mittlerweile schon ein paar Spielereien hinter mir aber beim meinem aktuellen Bastelprojekt stehe ich gerade voll auf dem Schlauch.

Es geht um eine kleine Temperatur und Luftfeuchtigkeitsanzeige. Das ganze funktioniert auch ganz gut. Mein Problem ist , dass die Beleuchtung des LCD Displays durch einen Taster eingeschaltet werden und dann 10 Sekunden leuchten soll.

Dadurch dass der Temperatursensor aber nur alle 5 Sekunden abgefragt werden soll habe ich derzeit das Problem, dass ich den Taster teilweise 5 Sekunden lang gedrückt halten muss damit die Beleuchtung angeht, und nach 5 Sekunden ist das Licht dann schon wieder aus.

Ich muss irgendwie das Delay da wegkriegen, den “Blink without delay” habe ich mir auch schon angeschaut, aber irgendwie komme ich nicht auf die richtige Lösung.

#include <Bounce2.h>      // Libraries einbinden
#include <dht11.h>
#include <LiquidCrystal.h>
dht11 DHT11;
#define DHT11PIN 8

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int ledPIN = 6;                     // Mit Pin 6 wird die LED des LCD Displays bezeichnet
int TasterPIN = 7;                  // Taster auf PIN 7
int TasterStatus;                   // Variable für Tasterstatus
Bounce  bouncer  = Bounce();


void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  pinMode(ledPIN, OUTPUT);          // ledPIN als Ausgang
  pinMode(TasterPIN, INPUT);        // TasterPIN als Eingang deklarieren
  digitalWrite(TasterPIN, HIGH);    //Pullup widerstand aktivieren
  bouncer .attach( TasterPIN );     // Entprellen des Tasters
  bouncer .interval(5);
}

void loop()
{
  int chk = DHT11.read(DHT11PIN);

  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print((float)DHT11.temperature + 2, 1);
  lcd.print(" C");

  lcd.setCursor(0, 1);
  lcd.print("RelF: ");
  lcd.print((float)DHT11.humidity, 1);
  lcd.print(" %");
  delay(5000);

  TasterStatus = digitalRead(TasterPIN);
  if (TasterStatus == LOW)       //Abfrage des Tasterstatus
    digitalWrite(ledPIN, HIGH);    //Einschalten der LCD LED
  else
    digitalWrite(ledPIN, LOW);     //Ausschalten der LCD LED


}

Gruß Jens

Schau dir das BlinkWithoutDelay Beispiel in der IDE an. Da siehst du wie du Verzögerungen einbaust ohne den Prozessor anzuhalten

wie oben schon geschrieben hab ich mir das Beispiel schon angeschaut und bin daraus für mein Problem nicht schlauer geworden.

const int INTERVAL = 1000;  //Delay-Zeit in ms

void setup() 
{
  Serial.begin(9600);

}

void loop() 
{
  static unsigned long previousMillis;
  
  if (millis() - previousMillis > INTERVAL)
  {
    previousMillis = millis();
    
    //wird alle 1 Sekunde ausgeführt
    Serial.println("Test");
  }


  //Code hier läuft ständig durch. z.B. Taster abfragen

}

millis() liefert die Zeit seit dem Einschalten in Millisekunden. previousMillis enthält die Zeit beim letzten Ausführen (Am Anfang 0). Wenn man also die Differenz daraus bildet hat man die Zeit seit dem letzten Ausführen des Blocks. Diese kann man mit einem Intervall vergleichen.

Der Rest läuft ständig durch. D.h. man kann in loop() Dinge tun die öfters passieren müssen

postfrosch: wie oben schon geschrieben hab ich mir das Beispiel schon angeschaut und bin daraus für mein Problem nicht schlauer geworden.

Hast du den Code aber VERSTANDEN ?

postfrosch: wie oben schon geschrieben hab ich mir das Beispiel schon angeschaut und bin daraus für mein Problem nicht schlauer geworden.

Anleitung: Endlicher Automat mit millis()

Da läuft die Ampel unabhängig vom Blaulichtblinker. Der endliche Automat mit switch/case macht den Ablauf.

Alternative 1: [Projekt] INTERVAL

Alternative 2: Beispiel für meine TaskMacros

Alternative 3: every(ms) aus ALib0

Könnte auch noch alle(ms) hinzufügen, für Leute die's lieber auf Deutsch mögen ;-)

Anwendung:

  every(5000) { //alle 5 Sekunden ausführen
    //hier Code für Ausgabe der Temperatur und Feuchtigkeit einfügen
  }

Link zur ALib0 korrigiert :)

Danke für die Korrektur :-)

Wieso läuft diese Tage bei mir alles schief? :-(

Vielen Dank für die vielen Antworten und Lösungsmöglichkeiten.

Ich werde mich jetzt erst mal durch die ganzen Möglichkeiten durchbeissen. als Anfänger ist das Lesen des Codes manchmal sehr schwierig aber ich hoffe mal das wird mit der Zeit besser.

Ich tue mein bestes....

So, ich habe es geschafft, wenn ich jetzt den Taster drücke geht die Beleuchtung für 5 Sekunden an.

vielen Dank für Eure Hilfe.

Jetzt muss ich das ganze nur auch noch für die Abfrage des Temperatursensors hinkriegen damit der nicht ständig am Abfragen ist.

Der Code sieht jetzt so aus. Verbesserungsvorschläge sind natürlich immer herzlich willkommen :grinning:

#include <Bounce2.h>      // Libraries einbinden
#include <dht11.h>
#include <LiquidCrystal.h>
dht11 DHT11;
#define DHT11PIN 8

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int ledPIN = 6;                     // Mit Pin 6 wird die LED des LCD Displays bezeichnet
int TasterPIN = 7;                  // Taster auf PIN 7
int TasterStatus;                   // Variable für Tasterstatus
Bounce  bouncer  = Bounce();
unsigned long ledBeleuchtung;
int ledStatus = LOW;

void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  pinMode(ledPIN, OUTPUT);          // ledPIN als Ausgang
  pinMode(TasterPIN, INPUT);        // TasterPIN als Eingang deklarieren
  digitalWrite(TasterPIN, HIGH);    //Pullup widerstand aktivieren
  bouncer .attach( TasterPIN );     // Entprellen des Tasters
  bouncer .interval(5);
 
}

void loop()
{
  int chk = DHT11.read(DHT11PIN);

  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print((float)DHT11.temperature + 2, 1);
  lcd.print(" C");

  lcd.setCursor(0, 1);
  lcd.print("RelF: ");
  lcd.print((float)DHT11.humidity, 1);
  lcd.print(" %");


  TasterStatus = digitalRead(TasterPIN);
  if (TasterStatus == LOW) {      // Abfrage des Tasterstatus
    digitalWrite(ledPIN, HIGH);    //Einschalten der LCD LED
    ledBeleuchtung = millis();
    ledStatus = HIGH;
  }
  else
  { if (millis() - 5000 > ledBeleuchtung)
      digitalWrite (ledPIN, LOW);
    ledStatus = LOW;
  }
}
if (millis() - 5000 > ledBeleuchtung)

Du solltest die Differenz der zwei Zeiten bilden. Und abfragen ob diese größer als das Intervall ist

postfrosch: Jetzt muss ich das ganze nur auch noch für die Abfrage des Temperatursensors hinkriegen damit der nicht ständig am Abfragen ist.

Das sollte jetzt aber eine einfache Übung werden. Wenn du das dann auch mit millis() hingekriegt hast, sieh dir INTERVAL.h an.

Dann solltest du auch nicht in jedem loop das LCD aktualisieren und auch nicht den DHT11 auslesen