Go Down

Topic: Display problem (Read 3466 times) previous topic - next topic

11nemesis

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  :( 
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?

Code: [Select]

#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);
   
  }}}}}}}}

sschultewolter

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
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Trixi

#2
Dec 19, 2013, 08:41 pm Last Edit: Dec 19, 2013, 08:44 pm by A.R.Ty Reason: 1
Hoi,

ich würde ne Funktion schreiben wie folgt:
Code: [Select]

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


die Rufst Du dann einfach auf mit
Code: [Select]
bereit();
an der Stelle im Sketch wo und wann Du sie brauchst  8)

z.B. so:

Code: [Select]

#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"
}

Dum spiro, spero - if you find my posting helpful, please click my Karma :)

Serenifly

#3
Dec 19, 2013, 08:50 pm Last Edit: Dec 19, 2013, 08:53 pm by Serenifly Reason: 1
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()

11nemesis

Wahnsinn, danke für die schnellen Antworten!

Jetzt sehe ich leider aber gar nicht mehr durch  :D

sschultewolter

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.

Code: [Select]
#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");
   }
 }
}
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

uwefed

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

Code: [Select]
if(b == HIGH,c == HIGH, d == HIGH, e == HIGH)

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

Serenifly

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 &&

Blonder

@ schulterwolter:
Code: [Select]
    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:

Code: [Select]
    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;



sschultewolter

Jup, beim Copy&Pase nicht alles wieder abgeändert ;)
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Trixi

#10
Dec 21, 2013, 11:38 am Last Edit: Dec 21, 2013, 11:39 am by A.R.Ty Reason: 1
Joa, sag ja immer, das müsste Copy&Paste&Edit heissen  :0

Andererseits: machste dat nich, kommt sowas bei raus:
Quote
@ schulterwolter:
XD
Dum spiro, spero - if you find my posting helpful, please click my Karma :)

11nemesis

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?

sschultewolter

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.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Go Up