INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Einfache Tastenabfrage
11.02.2015, 12:57
Beitrag #1
Einfache Tastenabfrage
Hallo an alle,
da mein erstes Projekt gut läuft hab ich natürlich sofort ein neues angefangen.
Es soll eine Gartenbewässerung werden.
Leider scheitere ich schon an der einfachsten Aufgabe.
Ich möchte nur einen von mehreren Schaltern drücken und eine LED zum leuchten bringen.
Mein Programm wartet auf Tastendruck aber läuft dann komplett durch.
Es ist egal welche Taste ich drücke, läuft immer von vorne durch.
Habe schon denn ganzen Vormittag gesucht, finde aber keine einfache Anleitung.
Vielleicht könnt ihr mir helfen.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int LED1=7;
int taster1=6;
int LED2=8;
int taster2=9;
int tasterstatus1=0;
int tasterstatus2=0;
void setup()
{
lcd.begin(16, 2);
pinMode(LED1, OUTPUT);
pinMode(taster1, INPUT);
pinMode(LED2, OUTPUT);
pinMode(taster2, INPUT);
}
void loop()
{

tasterstatus1=digitalRead(taster1);
tasterstatus2=digitalRead(taster2);
if (tasterstatus1 == HIGH)

{
lcd.setCursor(0, 0);
lcd.print("Wasser 1 ein");
lcd.setCursor(0, 1);
lcd.print("5 min");
digitalWrite(LED1, HIGH);
delay (5000);
digitalWrite(LED1, LOW);
lcd.clear();

if (tasterstatus2 == HIGH)
lcd.print("Wasser 2 ein");
lcd.setCursor(0, 1);
lcd.print("2 min");
digitalWrite(LED2, HIGH);
delay (2000);
digitalWrite(LED2, LOW);
lcd.clear();
}
else
{
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
}
}


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.02.2015, 13:59 (Dieser Beitrag wurde zuletzt bearbeitet: 11.02.2015 14:12 von Foto-Ralf.)
Beitrag #2
RE: Einfache Tastenabfrage
Hallo,

also erst mal:
- delay(5000); sind 5 Sekunden und keine 5 Minuten
- bei deinem Programmaufbau "hängt" der Arduino für die komplette Bewässerungszeit in dem delay fest; Du kannst (ausser mit Reset) nicht unterbrechen.


Ich würde das Ganze auf einer Zeit-Funktion aufbauen. Also mit dem Tastendruck millis() in eine Variable speichern, und vergleichen ob dieser Wert grösser als der gespeicherte +300000 (5 min.) ist.
Damit kannst Du den Arduino im loop weiterlaufen lassen und weitere Tastendrucks (z. B. abbrechen) auswerten oder auch die noch verbleibende Zeit der Bewässerung auf dem LCD anzeigen.

In deinem geschriebenen Programm stimmen die Klammern nicht. Die geschwungene Klammer nach if (tasterstatus1 == HIGH) muss nach dem ersten lcd.clear wieder zu gemacht werden, nach dem nächsten if braucchst du wieder eine neue sonst wird nur die erste Bedingung nach dem if betrachtet.

Das LOW setzen des Ausganges würde ich jeweils innerhalb der Klammer setzen und die else-Bedingung komplett wegfallen lassen.

Ich hoffe Dir damit geholfen zu haben.

Gruss Ralf


Hier noch der Code für deine bisherige Variante:

Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int LED1=7;
int taster1=6;
int LED2=8;
int taster2=9;
int tasterstatus1=0;
int tasterstatus2=0;
void setup() {
lcd.begin(16, 2);
pinMode(LED1, OUTPUT);
pinMode(taster1, INPUT);
pinMode(LED2, OUTPUT);
pinMode(taster2, INPUT);

digitalWrite(taster1, HIGH);   // Pull-Up-Widerstand fuer definierte 1 wenn Taster nicht gedrueckt
digitalWrite(taster2, HIGH);
}
void loop() {

tasterstatus1=digitalRead(taster1);
tasterstatus2=digitalRead(taster2);

if (tasterstatus1 == LOW) {
lcd.setCursor(0, 0);
lcd.print("Wasser 1 ein");
lcd.setCursor(0, 1);
lcd.print("5 min");
digitalWrite(LED1, HIGH);
delay (5000);
digitalWrite(LED1, LOW);
lcd.clear();
}

if (tasterstatus2 == LOW) {
lcd.print("Wasser 2 ein");
lcd.setCursor(0, 1);
lcd.print("2 min");
digitalWrite(LED2, HIGH);
delay (2000);
digitalWrite(LED2, LOW);
lcd.clear();
}

}

Ich habe mir erlaubt die Taster auf LOW abzufragen, d. h. du musst so die Taster noch so umverdrahten, dass die Masse auf den Eingang geschaltet wird. Somit hast Du definierte Signale und musst keine externen Pull-Down Widerstände einbauen die Du bei deiner Variante brauchst - möglicherweise geht aus deshalb nix weil der Arduino schon kurz nach dem einschalten meint, dass der Taster 1 betätigt wäre.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.02.2015, 12:32
Beitrag #3
RE: Einfache Tastenabfrage
Hallo Ralf,
vielen Dank für deine schnelle Antwort.
Mir ist schon klar das 5000 keine 5 min sind.
Möchte nur bei meinem Versuchsaufbau nicht 5 min warten ob es dann weiter geht.

Werde mal mit deinem Programm versuche machen und dann berichten.

Gibt es eigentlich keine einfache Abfrage von Tasten im Sinn von :
Taste 1 gedrückt gehe zu Zeile 20
Taste 2 gedrückt gehe zu Zeile 30
usw

habe vor 30 Jahren mal in VisualBasic programmiert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.02.2015, 12:36
Beitrag #4
RE: Einfache Tastenabfrage
(12.02.2015 12:32)King-Bobman schrieb:  Gibt es eigentlich keine einfache Abfrage von Tasten im Sinn von :
Taste 1 gedrückt gehe zu Zeile 20
Taste 2 gedrückt gehe zu Zeile 30
Es gibt in C++ schon ein goto, aber das ist ja sooo 80er.
Nein, heutzutage programmiert man "strukturiert" oder "objektorientiert".
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.02.2015, 13:56 (Dieser Beitrag wurde zuletzt bearbeitet: 12.02.2015 14:23 von King-Bobman.)
Beitrag #5
RE: Einfache Tastenabfrage
Hallo Thorsten,
ich bin 57 Jahre alt und habe seit 25 Jahren nichts mehr mit programmieren zu tun.

Hallo Ralf,
nochmals vielen Dank für dein Programm.
Es geht so wie ich es haben wollte.
Jetzt geht es weiter mit meinem Projekt und ich werde sicher noch ein paar Fragen haben.

Roland
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.02.2015, 22:55
Beitrag #6
RE: Einfache Tastenabfrage
Hallo Roland,

es freut' mich, dass ich helfen konnte.

Gruss Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2015, 14:37 (Dieser Beitrag wurde zuletzt bearbeitet: 13.02.2015 14:38 von tito-t.)
Beitrag #7
RE: Einfache Tastenabfrage
gibt es natürlich mit den goto, und es gibt etliche Fälle, wo man ohne das nur mit Verrenkungen auskommt.

In C gibt es label, die man anspringen kann.
Du setzt vor die entsprechende Zeile eine Sprungmarke (beliebiger Bezeichner mit Doppelpunkt), und das kannst du dann mit goto anspringen!
Code:
CodeZeile;
  CodeZeile;
marke1: CodeZeile;
  CodeZeile;
  CodeZeile;
marke2: CodeZeile;
  CodeZeile;
  CodeZeile;
  if(irgendwas) goto marke1;
  CodeZeile;
  CodeZeile;
  if(wasanderes) goto marke2;
  CodeZeile;
  CodeZeile;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  einfache Initialisierung mehrdim. Arrays HaWe 8 1.175 29.04.2015 11:17
Letzter Beitrag: HaWe

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste