Forum: Mikrocontroller und Digitale Elektronik Arduino Display Timeout


von Tobias M. (tobi100)


Lesenswert?

Hallo,
ich habe ein Sketch für den Arduino zum Temperatur messen mit dem DHT11 
geschrieben. Die gemessenen Daten werden nun auf einem LCD Display 
(hd44780) angezeigt. So weit so Gut. Nun möchte ich aber das diese 
Schaltung Energiesparend betrieben wird. Also soll die 
Hintergrundbeleuchtung vom Display mit einem Taster ein geschaltet 
werden und denn nach 5 Sekunden wieder von alleine ausgehen. Und da ist 
auch schon mein Problem, ich kriege es nicht hin den Sketch so 
umzuschreiben das dies so Funktioniert.

LG Tobi

Hier ist noch der Sketch:

#include <dht11.h>
#include <LiquidCrystal.h>

dht11 DHT11;
#define DHT11PIN 8

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


void setup()
{
  lcd.begin(16, 2);
  lcd.print("DHT 11");
  delay(1000);
  lcd.clear();
}

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

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

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

  delay(2000);
}

von Falk B. (falk)


Lesenswert?

@  Tobias Mohr (tobi100)

>Hintergrundbeleuchtung vom Display mit einem Taster ein geschaltet
>werden und denn nach 5 Sekunden wieder von alleine ausgehen. Und da ist
>auch schon mein Problem, ich kriege es nicht hin den Sketch so
>umzuschreiben das dies so Funktioniert.

Dazu muss man etwas ähnliches wie eines Statemachine machen, wenn 
gleich auf sehr einfachem Niveau.
Und wenn man es wirklich gut machen will, nimmt man einen Timer und 
Multitasking.
Aber erstmal der einfache Ansatz, das ist schon ein Quantensprung für 
die meisten Arduino-User ;-)

1
#include <dht11.h>
2
#include <LiquidCrystal.h>
3
4
dht11 DHT11;
5
#define DHT11PIN 8
6
#define TASTER 1
7
#define LICHT 2
8
9
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
10
11
void setup()
12
{
13
  lcd.begin(16, 2);
14
  lcd.print("DHT 11");
15
  delay(1000);
16
  lcd.clear();
17
  // Eingangpin definieren, mit int. Pull Up!!! TODO
18
  pinmode(TASTER, INPUT_PULLUP);
19
  pinmode(LICHT, OUTPUT);
20
}
21
22
void loop()
23
{
24
  static int cnt, timeout, taster_alt;
25
  int chk, taster;
26
  
27
  cnt++;
28
  if (cnt == 200) {
29
      cnt = 0;
30
      chk = DHT11.read(DHT11PIN);
31
      lcd.setCursor(0, 0);
32
      lcd.print("Temp: ");
33
      lcd.print((float)DHT11.temperature, 2);
34
      lcd.print(" C");
35
    
36
      lcd.setCursor(0, 1);
37
      lcd.print("RelF: ");
38
      lcd.print((float)DHT11.humidity, 2);
39
      lcd.print(" %");
40
  }
41
42
  // Taster einlesen und Flanke erkennen
43
  taster = digital_read(TASTER);
44
  if (!taster && taster_alt) {
45
    timeout = 500;
46
    // Licht einschalten
47
    digital_write(LICHT, HIGH);
48
  }
49
  taster_alt = taster; 
50
51
  if (timeout) {
52
    timeout--;
53
  } else {
54
    // Licht ausschalten
55
    digital_write(LICHT, LOW);
56
  }
57
58
  delay(10);
59
}

von Tobias M. (tobi100)


Lesenswert?

Vielen Dank schon mal für die Antwort. Doch beim Hochladen wird mir eine 
Fehlermeldung angezeigt.

 Arduino: 1.6.6 (Windows 10), Board: "Arduino Nano, ATmega328"

C:\Users\tobi\AppData\Local\Temp\arduino_8f0661d10a68cfa89a36d4a98991d82 
e\sketch_mar31c.ino:  In function 'void setup()':

sketch_mar31c:18: error: 'pinmode' was not declared in this scope

   pinmode(TASTER, INPUT_PULLUP);

                               ^

C:\Users\tobi\AppData\Local\Temp\arduino_8f0661d10a68cfa89a36d4a98991d82 
e\sketch_mar31c.ino:  In function 'void loop()':

sketch_mar31c:43: error: 'digital_read' was not declared in this scope

   taster = digital_read(TASTER);

                               ^

sketch_mar31c:47: error: 'digital_write' was not declared in this scope

     digital_write(LICHT, HIGH);

                              ^

sketch_mar31c:55: error: 'digital_write' was not declared in this scope

     digital_write(LICHT, LOW);

                             ^

exit status 1
'pinmode' was not declared in this scope

Ungültige Bibliothek C:\Program Files 
(x86)\Arduino\libraries\dht11-master in C:\Program Files 
(x86)\Arduino\libraries\dht11-master gefunden
Ungültige Bibliothek C:\Program Files 
(x86)\Arduino\libraries\dht11-master in C:\Program Files 
(x86)\Arduino\libraries\dht11-master gefunden

  Dieser Report hätte mehr Informationen mit
  "Ausführliche Ausgabe während der Kompilierung"
  aktiviert in Datei > Einstellungen.

von Falk B. (falk)


Lesenswert?

@  Tobias Mohr (tobi100)

>Vielen Dank schon mal für die Antwort. Doch beim Hochladen wird mir eine
>Fehlermeldung angezeigt.

>sketch_mar31c:18: error: 'pinmode' was not declared in this scope

Ja mein Gott, ich hab das einfach im Editor getippt und NICHT im 
Compiler geprüft. Und ich programmiere auch nur gelegentlich 
Arduino-Style.

>   pinmode(TASTER, INPUT_PULLUP);

Es heißt

pinMode(TASTER, INPUT_PULLUP);

                               ^
>   taster = digital_read(TASTER);

   taster = digitalRead(TASTER);

                               ^

>     digital_write(LICHT, HIGH);

     digitalWrite(LICHT, HIGH);


>    digital_write(LICHT, LOW);

    digitalWrite(LICHT, LOW);
                             ^

von Tobias M. (tobi100)


Lesenswert?

Konnte es jetzt doch zum laufen kriegen. Und nochmal vielen Dank für den 
Sketch. :D

LG Tobi

von Jan L. (ranzcopter)


Lesenswert?

Falk B. schrieb:
> Aber erstmal der einfache Ansatz, das ist schon ein Quantensprung für
> die meisten Arduino-User ;-)

:)
Und wenn man statt "cnt++" einfach "millis()" benutzt, bekommt man noch 
so eine Art einfachen Zeitbezug mit rein; also zumindest ein ungefähres 
"nach 5 Sekunden" o.ä.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.