Arduino LCD - Display zeitgesteuert schalten und Betriebsspannung messen

Hallo,
ich habe Momentan ein kleines Problem mit meinem Arduino UNO.

Ich möchte mit einem Reflexsensor die Entfernung zu einem Gegenstand messen und diese soll dann auf einem LCD-Display angezeigt werden.
Das klappt soweit schon sehr gut.
Mein Problem ist aber, dass ich das LCD-Display über einen Taster anschalten möchte und es nach einer Minute automatisch wieder ausgeht. Beschaltet werden soll aber nur die Hintergrundbeleuchtung des Displays.
Ich habe es bereits mit millis() versucht, allerdings bekomme ich es nicht hin, dass das LCD-Display dann auch eine gewisse Zeit an bleibt. Ein Beispiel Sketch würde mir hier sehr helfen, da ich dazu nichts (außer BlingwithoutDelay, was mich nicht weiterbringt) finden konnte.

Dann möchte ich auch noch die Versorgungsspannung meines Reflexsensors messen und auf dem LCD-Display anzeigen lassen.
Arbeite ich hier zu am besten mit einem Spannungsteiler oder habt ihr da bessere Vorschläge.

Besten Dank schon mal

Hi

Nunja - das einzige Bauteil, was hier halbwegs bekannt sein dürfte, wird der Uno sein.
Reflex-Sensoren gibt's 'wie Sand am Meer'.
LCD's sind nun auch nicht ganz so selten anzutreffen - da gibt's sogar Typen, da wird die Helligkeit auf der Rückseite mit einem Schraubendreher an einem Poti eingestellt.

... Du willst jetzt also einen Getriebemotor Umgebungslicht- und Zeitabhängig antreiben, daß Dieser Dir das Poti verdreht?

Wenn doch nicht ganz so verquer ... Links zu Deinen Bauteilen wären schon Mal ein Anfang.
Deine Versuche, das Problem selber zu lösen, dürfen hier auch rein.
Schreibe dazu bitte, was Du Dir dabei erwartet hattest, und, was Du statt Dessen bekommen hast.

MfG

PS: Informiere Dich bitte über CODE-TAG und URL-TAG(=Link)

marius_1408:
außer BlingwithoutDelay, was mich nicht weiterbringt

Dann hast Du es nicht verstanden. Es bringt Dich weiter, sobald Du es verstehst. Schau Dir mal dazu die Nachtwächtererklärung und diese Erklärung an.

marius_1408:
Dann möchte ich auch noch die Versorgungsspannung meines Reflexsensors messen und auf dem LCD-Display anzeigen lassen.
Arbeite ich hier zu am besten mit einem Spannungsteiler oder habt ihr da bessere Vorschläge.

Das kommt auf dessen Versorgungsspannung an, die Du geheim hälst.

Gruß Tommy

Hi,

als LCD nutze ich das "LCD 1602 Module" (LCD1602 Module - Wiki).
Der Reflexsensor ist ein HC-SR04 (Ultrasonic Ranging Module HC-SR04 - ITEAD Wiki).

Und meine Absicht ist es, dass ich über einen normalen Taster die Hintergrundbeleuchtung des Displays anschalten kann, diese dann für eine Minute anbleibt und danach alleine wieder ausgeht.

Dann soll auch noch die Betriebsspannung des Sensors auf dem Display angezeigt werden, was allerdings nebensächlich wäre.

Mein bisheriger Code ist:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10,11,12);

int Echo = 6;
int Trigger = 5;
int Taster = 4;
int Screen = 3;

unsigned long start = 0;
unsigned long dauer = 0;

void setup() {
// put your setup code here, to run once:

lcd.begin(16, 2);
lcd.setCursor (0,0);
lcd.print (" Marius");

pinMode (Screen, OUTPUT);
pinMode (Taster, INPUT);

}

void loop() {
// put your main code here, to run repeatedly:

long dauer, cm;

pinMode (Trigger, OUTPUT);
digitalWrite (Trigger, LOW);
delayMicroseconds (2);
digitalWrite (Trigger, HIGH);
delayMicroseconds (10);
digitalWrite (Trigger, LOW);

pinMode (Echo, INPUT);
dauer = pulseIn(Echo, HIGH);
cm = dauer / 29 / 2;

lcd.setCursor (0,1);
lcd.print ( " Abstand ");
lcd.print ( cm, DEC);
lcd.print ( " cm ");

{
if (digitalRead (Taster)==HIGH){
start = millis();
}
if (digitalRead (Taster)==LOW){
dauer = millis() - start;
}
}

if (dauer >60000){
digitalWrite (Screen, LOW);
}

{
if (digitalRead(Taster)==HIGH){
digitalWrite(Screen, HIGH);

} else {
digitalWrite(Screen, LOW);
}
}
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Der Sensor arbeitet auch mit 5V, die kannst Du direkt mit dem Arduino messen.

Gruß Tommy

Schade, das du die Beiträge hier nicht richtig liest.
Du wurdest gebeten, Links zu posten, keine URL.
Und Code-Tags.

Und warum willst du die Spannung für den Ultraschall-Sensor (richtige Bezeichnung) messen ?

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10,11,12);

int Echo = 6;
int Trigger = 5;
int Taster = 4;
int Screen = 3;

int ScreenStatus = LOW;
int TasterStatus = LOW;
unsigned long timer;


void setup() {
  // put your setup code here, to run once:

lcd.begin(16, 2); 
  lcd.setCursor (0,0);  
  lcd.print (" Marius");


pinMode (Screen, OUTPUT);
pinMode (Taster, INPUT);

pinMode (Echo,INPUT);
pinMode (Trigger, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

 long dauer, cm;

 
  digitalWrite   (Trigger, LOW);
  delayMicroseconds   (2);
  digitalWrite  (Trigger, HIGH);
  delayMicroseconds  (10);
  digitalWrite  (Trigger, LOW);

 
  dauer = pulseIn(Echo, HIGH);
  cm = dauer / 29 / 2; 

  
  lcd.setCursor (0,1);
  lcd.print ( " Abstand ");
  lcd.print ( cm, DEC);
  lcd.print ( " cm ");

{
  TasterStatus=digitalRead(Taster);
  {
   if (TasterStatus == HIGH) {
    digitalWrite (Screen, HIGH);
    timer = millis();
    ScreenStatus = HIGH;
   }
  } 
 
  
    if (millis() - timer > 3000){
      digitalWrite (Screen, LOW);
      ScreenStatus = LOW;
    
  }
}
{
  if (digitalRead(Taster)==HIGH){
  digitalWrite(Screen, HIGH);
   
} else {
  digitalWrite(Screen, LOW);
}
}
}

Setze mal die Pinmodes für den US-Sensor in das Setup.

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int Echo = 6;
int Trigger = 5;
int Taster = 4;
int Screen = 3;
int ScreenStatus = LOW;
int TasterStatus = LOW;
unsigned long timer;

void setup() {
  // Dauerhafte Zeile auf dem Bildschirm
  lcd.begin(16, 2);
  lcd.setCursor (0, 0);
  lcd.print (" Marius");

  // Ein- und Ausgänge definieren
  pinMode (Screen, OUTPUT);
  pinMode (Taster, INPUT);
  pinMode (Echo, INPUT);
  pinMode (Trigger, OUTPUT);

}
void loop() {
  // Einheit definieren, Messdauer und Häufigkeit festlegen

  long dauer, cm;

  digitalWrite   (Trigger, LOW);
  delayMicroseconds   (2);
  digitalWrite  (Trigger, HIGH);
  delayMicroseconds  (10);
  digitalWrite  (Trigger, LOW);

  dauer = pulseIn(Echo, HIGH);
  cm = dauer / 29 / 2;

  //wechselnde Werte auf Display

  lcd.setCursor (0, 1);
  lcd.print ( " Abstand ");
  lcd.print ( cm, DEC);
  lcd.print ( " cm ");

  //gedrückter Taster

  { TasterStatus = digitalRead(Taster);
  { if (TasterStatus == HIGH) {
        digitalWrite (Screen, HIGH);
        timer = millis();
        ScreenStatus = HIGH;
      }
    }

    //Timer zur Bildschirmabschaltung

    if (millis() - timer > 30000) {
      digitalWrite (Screen, LOW);
      ScreenStatus = LOW;
    }
  }
}

Dann solltest du die auch aus der loop löschen.

Und bitte ändere das im schon geposteten Sketch, nicht nochmal posten.

Beachte auch, dass pulseIn blockiert. Während das wartet, kann der Prozessor nichts anderes tun, also auch nicht auf Tasten reagieren und die Ausschaltzeit überwachen.
Du solltest dabei wenigstens einen sinnvollen Timeout setzen, da der Defaultwert von 1 Sekunde wohl etwas lang ist.

Gruß Tommy

Vielen Dank für die ganzen Tipps.
Ich habe es nun hinbekommen. Mein Fehler war, dass ich noch eine alte Programmzeile drinne hatte, welche meine Zeitabschaltung verhinderte.

MFG
Marius

Hi

Du darfst auch auf die Dir gestellten Fragen antworten - noch sind wir hier ganz lieb!
Woher hast Du die Klammern in den Zeilen 51,64 und 65,72?

Bevor Du den Sketch aus der IDE kopierst, drücke dort Mal STRG+T, Das formatiert den Code, rückt die Befehle je Klammerebene entsprechend ein. Liest sich besser.
Dann noch die unnötigen Leerzeilen raus, zur Trennung reicht EINE, keine zwölf.

Auch schaden Kommentare nicht.
Dabei muß nicht jeder Kleinkram kommentiert werden bzw. mit Sinn und Verstand.
byte a=5; // Variable a, Typ Byte, bekommt 5 zugewiesen
braucht Keiner, da Das genau in dieser Zeile zu sehen ist. Was aber Keiner sieht: Was macht das 'a'?
Oder man gibt den Variablen von vorne herein sprechende Namen.

Da in dem Post hier drüber nicht die meisten Fragen stehen, hast Du so weit Funktion?

MfG

PS: Schön, daß Du Deinen Fehler selber finden konntest.
Den 'Rest' darfst Du Dir trotzdem zu Herzen nehmen.
Spätestens in einer Woche wird Dir dieser Sketch ziemlich fremd und eigenartig vorkommen und Du wirst Dir jede Zeile wirklich ansehen müssen, damit Du verstehst, was Da passiert.
Mit Kommentaren kommst Du Da dann schneller durch.

Danke,
habe deinen Rat befolgt und Erklärungen hinzugefügt und an der Formatierung noch ein bisschen gefeilt.

LG
Marius