Display problem

Hallo, Ich hab habe einen Arduino Uno mit einem Display.
Ich möchte damit Folgendes machen:

Beim Einschalten soll er "Hallo" ausgeben. Kurze Zeit später dazu auffordern auf den Taster zu drücken.
Nach dem Taster druck soll er von 4 Digitalen Eingängen einlesen ob sie auf High oder Low stehen.
Je nach dem soll er verschiedene Texte ausgeben.

Ich hab damit ziemliche Schwierigkeiten :frowning:
Ein großes Problem ist es das der Text " Zum starten drücken" flackert.
Ich denke das liegt daran das bei jedem Schleifendurchlauf der Text neu ausgegeben wird.

Könnt ihr mir bitte helfen?

#include <LiquidCrystal.h>

const int Taster = 8;   // Beim Tasten HIGH
const int ein1 = 9;     // Entweder HIGH oder LOW
const int ein2 = 10;    // Entweder HIGH oder LOW
const int ein3 = 11;    // Entweder HIGH oder LOW
const int ein4 = 12;    // Entweder HIGH oder LOW

int a;
int b;
int c;
int d;
int e;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() 
{ 
  pinMode(Taster, INPUT);
  pinMode(ein1, INPUT);
  pinMode(ein2, INPUT);
  pinMode(ein3, INPUT);
  pinMode(ein4, INPUT);
  
   lcd.begin(16, 2);
   lcd.print("Hallo");
   delay(1000);
}

void loop() 
{

  a = digitalRead(Taster);
  b = digitalRead(ein1);
  c = digitalRead(ein2);
  d = digitalRead(ein3);
  e = digitalRead(ein4);
  
  lcd.begin(16, 2);
  lcd.print("Zum Starten Taster drücken");

 if(a == LOW)
 {
   if(b == HIGH,c == HIGH, d == HIGH, e == HIGH)
   lcd.begin(16, 2);
   lcd.print("Fall 1");
   delay(1000);
  
 if(a == HIGH)
 {
   if(b == HIGH,c == HIGH, d == HIGH, e == LOW)
   lcd.begin(16, 2);
   lcd.print("Fall 2");
   delay(1000);
   
    if(a == LOW)
 {
   if(b == HIGH,c == HIGH, d == LOW, e == HIGH)
   lcd.begin(16, 2);
   lcd.print("Fall 3");
   delay(1000);
    if(a == LOW)
 {
   if(b == HIGH,c == HIGH, d == LOW, e == LOW)
   lcd.begin(16, 2);
   lcd.print("Fall 4");
   delay(1000);
    if(a == LOW)
 {
   if(b == HIGH,c == LOW, d == HIGH, e == HIGH)
   lcd.begin(16, 2);
   lcd.print("Fall 5");
   delay(1000);
    if(a == LOW)
 {
   if(b == HIGH,c == LOW, d == HIGH, e == LOW)
   lcd.begin(16, 2);
   lcd.print("Fall 6");
   delay(1000);
  {
   if(b == HIGH,c == LOW, d == LOW, e == HIGH)
   lcd.begin(16, 2);
   lcd.print("Fall 7");
   delay(1000);
   
  }}}}}}}}

Ja das liegt daran, dass du jeden durchlauf neusetzt. In einem anderen Thread gab es auch so ein Problem. Schau dir den Sketch dazu an und schreibe ihn nach deinen Sketch hin um.
http://forum.arduino.cc/index.php?topic=205580.msg1513201#msg1513201

Hoi,

ich würde ne Funktion schreiben wie folgt:

void bereit(){
lcd.clear()
lcd.print"Zum Starten drücken"
}

die Rufst Du dann einfach auf mit

bereit();

an der Stelle im Sketch wo und wann Du sie brauchst 8)

z.B. so:

#include <LiquidCrystal.h>

const int Taster = 8;   // Beim Tasten HIGH
const int ein1 = 9;     // Entweder HIGH oder LOW
const int ein2 = 10;    // Entweder HIGH oder LOW
const int ein3 = 11;    // Entweder HIGH oder LOW
const int ein4 = 12;    // Entweder HIGH oder LOW

int a;
int b;
int c;
int d;
int e;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() 
{ 
  pinMode(Taster, INPUT);
  pinMode(ein1, INPUT);
  pinMode(ein2, INPUT);
  pinMode(ein3, INPUT);
  pinMode(ein4, INPUT);
  
   lcd.begin(16, 2);
   lcd.print("Hallo");
   delay(1000);
  lcd.print("Zum Starten Taster drücken");
}

void loop() 
{

  a = digitalRead(Taster);
  b = digitalRead(ein1);
  c = digitalRead(ein2);
  d = digitalRead(ein3);
  e = digitalRead(ein4);
  
  lcd.begin(16, 2);


 if(a == LOW)
 {
   if(b == HIGH,c == HIGH, d == HIGH, e == HIGH)
   lcd.begin(16, 2);
   lcd.print("Fall 1");
   delay(1000);
bereit();
  
 if(a == HIGH)
 {
   if(b == HIGH,c == HIGH, d == HIGH, e == LOW)
   lcd.begin(16, 2);
   lcd.print("Fall 2");
   delay(1000);
bereit();
   
    if(a == LOW)
 {
   if(b == HIGH,c == HIGH, d == LOW, e == HIGH)
   lcd.begin(16, 2);
   lcd.print("Fall 3");
   delay(1000);
bereit();

    if(a == LOW)
 {
   if(b == HIGH,c == HIGH, d == LOW, e == LOW)
   lcd.begin(16, 2);
   lcd.print("Fall 4");
   delay(1000);
bereit();

    if(a == LOW)
 {
   if(b == HIGH,c == LOW, d == HIGH, e == HIGH)
   lcd.begin(16, 2);
   lcd.print("Fall 5");
   delay(1000);
bereit();

    if(a == LOW)
 {
   if(b == HIGH,c == LOW, d == HIGH, e == LOW)
   lcd.begin(16, 2);
   lcd.print("Fall 6");
   delay(1000);
bereit();

  {
   if(b == HIGH,c == LOW, d == LOW, e == HIGH)
   lcd.begin(16, 2);
   lcd.print("Fall 7");
   delay(1000);
bereit();   
  }}}}}}}}
void bereit(){
lcd.clear()
lcd.print"Zum Startendrücken"
}

lcd.clear() sollte man auch nicht machen wenn es nicht unbedingt nötig ist. Das dauert sehr lange.

Beachte auch, dass bei deinen if-Abfragen nur die nächste Zeile Code bedingt ausgeführt wird. Wenn du mehr als eine Zeile ausführen willst, musst du einen Code-Block in geschweiften Klammern setzen. Bei dir wird jedesmal nur begin() bedingt ausgeführt. Die anderen Zeilen werden immer ausgeführt.

Was übrigens wiederum Unsinn ist. Begin() muss man nur einmal machen. Um die Position des Textes zu setzen gibt es setCursor()

Wahnsinn, danke für die schnellen Antworten!

Jetzt sehe ich leider aber gar nicht mehr durch :smiley:

Teste diesen mal.
Es kann immer nur ein Fall aktiv sein, andernfalls nimmt er den höchstrangigen.
Ausgabe wird nur gewechselt, wenn Taster gedrueckt wurde und sich der Status geändert hat.

#include <LiquidCrystal.h>

const int taster = 8;   // Beim Tasten HIGH
const int ein1 = 9;     // Entweder HIGH oder LOW
const int ein2 = 10;    // Entweder HIGH oder LOW
const int ein3 = 11;    // Entweder HIGH oder LOW
const int ein4 = 12;    // Entweder HIGH oder LOW
int state = 0;
int lastState = 0;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() 
{ 
  pinMode(taster, INPUT);
  pinMode(ein1, INPUT);
  pinMode(ein2, INPUT);
  pinMode(ein3, INPUT);
  pinMode(ein4, INPUT);

  lcd.begin(16, 2);
  lcd.print("Hallo");
  delay(1000);

  lcd.setCursor(0,0); // Alternativ lcd.clear()
  lcd.print("Zum starten");
  lcd.setCursor(0,1);
  lcd.print("Taster druecken");
}

void loop() 
{
  if(digitalRead(taster) == HIGH) { // Überprüft mit jedem Tastendruck

    if(digitalRead(ein1) == HIGH) state = 1;
    else if(digitalRead(ein1) == HIGH) state = 2;
    else if(digitalRead(ein1) == HIGH) state = 3;
    else if(digitalRead(ein1) == HIGH) state = 4;
    else state = 0;
  }

  if(lastState != state) {
    lastState = state;
    lcd.clear();

    if(state != 0) {
      lcd.setCursor(0,1);
      lcd.print("Fall ");
      lcd.print(state);
    }
    else{
      lcd.setCursor(0,0); // Alternativ lcd.clear()
      lcd.print("Zum starten");
      lcd.setCursor(0,1);
      lcd.print("Taster druecken");
    }
  }
}

Kann mir mal ein C-Kenner bestätigen das diese Syntax richtig ist:

 if(b == HIGH,c == HIGH, d == HIGH, e == HIGH)

Muß da nicht statt "," "&&" oder "||" stehen?
Grüße Uwe

Hat mich auch erst gewundert, aber ich habe es mal kurz in Visual C++ ausprobiert und es geht :o

Scheint das gleiche zu sein wie &&

@ schulterwolter:

    if(digitalRead(ein1) == HIGH) state = 1;
    else if(digitalRead(ein1) == HIGH) state = 2;
    else if(digitalRead(ein1) == HIGH) state = 3;
    else if(digitalRead(ein1) == HIGH) state = 4;
    else state = 0;

glaub das is eher so:

    if(digitalRead(ein1) == HIGH) state = 1;
    else if(digitalRead(ein2) == HIGH) state = 2;
    else if(digitalRead(ein3) == HIGH) state = 3;
    else if(digitalRead(ein4) == HIGH) state = 4;
    else state = 0;

Jup, beim Copy&Pase nicht alles wieder abgeändert :wink:

Joa, sag ja immer, das müsste Copy&Paste&Edit heissen :0

Andererseits: machste dat nich, kommt sowas bei raus:

@ schulterwolter:

XD

Hi, ich hatte leider bis heute keine Zeit weiter zu basteln.
Wenn ich in in einem "Fall" bin möchte ich nach ein paar Sekunden wieder zurück zu "Zum starten Taster drücken".
Warum klappt es nicht wenn ich delay(1000); einfüge?

Weil du scheinbar den Sketch nicht verstanden hast. Ein delay bringt dir da garnichts.
Du musst wieder auf state == 0 zurückkommen. Dafür dürfen keine Signale mehr an den Tastern anliegen und danach muss einmal dein Starttaster wieder gedrückt werden. Dann ist keiner der ein1-4 Taster mehr aktiv und somit state == 0.