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
Taster abfragen
30.06.2014, 16:55
Beitrag #1
Taster abfragen
Hallo mein Name ist Torsten ich bin 33 Jahre alt und komme aus Niedersachsen. Ich habe mir vor ein paar Wochen ein Arduino Uno gekauft, nach ein wenig Spielereien dachte ich mir das es Zeit für etwas Sinnvolles ist.

Also habe ich mir ein LCD Keypadshield von Sainsmart und ein Motorshield bestellt.
Der Plan ist mittels eines Temp.sensors und Lichtsensor bei einer bestimmten temperatur und Sonneneinstrahlung einen Sonnenschutz auf und zuzufahren .
Das ganze sollte ein Automatik Modus und einen Manuellen Modus haben (wollte ich alles über die Taster auf dem Board machen).
Nun zu meinem Problem mangelnde Sachkenntnis Confused

Vorab ,möchte keinen fertigen Code ,nur währe es schon wenn mir jemand Hilfestellung gibt damit ich erstmal einen Fuß in die Tür bekommeBlush
Ich bekomme die Taster ,die ja über einen Analog eingang eingelesen werden nicht abgefragt der Beispiel Sketch funzt wenn ich den Taster left drücke erscheint die 1 usw. ,nur ich möchte ja das die Taster dann meinen Autom.Modus usw.veranlassen.
Seid nicht so Hart mit mir.

besten Dank im vorraus ,
Gruß Torsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.06.2014, 18:08
Beitrag #2
RE: Taster abfragen
Hi,
so grob verstehe ich, wo es damit Probleme geben koennte, aber was genau Deine Frage dabei ist, ist mir nicht so 100%ig klar.
Du scheinst das Dekodieren des "Analog"-Werts in die Zustaende der einzelnen Taster ja schon hinzubekommen. So verstehe ich zumindest Deine Aussage mit dem Beispiel-Sketch.
Jetzt ist die Frage, was genau Du machen willst: Einfach nur per Taste zwischen "manuell" und "auto" umschalten, oder willst Du eine Art Menue-Steuerung auf dem LCD haben?
In jedem Fall brauchst Du wahrscheinlich eine statische Variable, die den momentanen Modus (manuell/auto) enthaelt und anhand der Du dann die Steuerung machst. Diese Variable wird dann per Taster umgeschaltet. Wenn Du dafuer immer dieselbe Taste verwenden willst, dann musst Du auch noch an's Entprellen denken.
Hilft das schon?
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
30.06.2014, 19:24
Beitrag #3
RE: Taster abfragen
Hi

genau per Taster die Betriebsarten wechseln bzw. auf und zufahren.

Auszug aus der libary im Beispiel:

static int UPKEY_ARV = 144;
static int DOWNKEY_ARV = 329;
static int LEFTKEY_ARV = 505;
static int RIGHTKEY_ARV = 0;
static int SELKEY_ARV = 742;
static int NOKEY_ARV = 1023;


das sind dann wohl die Analogwerte die angeben welcher Taster gedrückt wurde,aber wo wird aus diesen Werten jetzt eine Zahl gebildet die auf dem Display angezeigt wird?

Auszug aus der DFR_Key.h:

#define SAMPLE_WAIT -1
#define NO_KEY 0
#define UP_KEY 3
#define DOWN_KEY 4
#define LEFT_KEY 2
#define RIGHT_KEY 5
#define SELECT_KEY 1

nun habe ich hier mal ein Wort statt der Zahl angegeben Folge war ein Fehler, also nehme ich an das ich dann irgendwo einen anderen Datentyp nutzen muss .RichtigUndecided
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.07.2014, 08:14
Beitrag #4
RE: Taster abfragen
(30.06.2014 19:24)ersiees schrieb:  aber wo wird aus diesen Werten jetzt eine Zahl gebildet die auf dem Display angezeigt wird?
Das ist schwer zu sagen, wenn man Deinen Code nicht kennt. Wahrscheinlich wird irgendwo immer wieder getKey() aufgerufen und das Ergebnis auf's Display geschrieben, falls nicht Null.

Zitat:nun habe ich hier mal ein Wort statt der Zahl angegeben Folge war ein Fehler, also nehme ich an das ich dann irgendwo einen anderen Datentyp nutzen muss .RichtigUndecided
Tja, auch hier kann man nur raten. Wenn Du irgendwo eine Zeichenkette einsetzt, wo eigentlich eine Zahl hingehört, dann wird es sehr wahrscheinlich ein Problem mit dem Datentyp geben. Genaueres kann man nur sagen, wenn Du mal den Code zeigst.
Gruß,
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
01.07.2014, 09:30 (Dieser Beitrag wurde zuletzt bearbeitet: 01.07.2014 09:39 von ArduTux.)
Beitrag #5
RE: Taster abfragen
Ich habe auch noch nicht richtig Kapiert worum es dir geht Blush

Ich habe es irgendwo mal gesehen, wie aus den Button AnalogRead ein Integer ausgegeben wird.

Code:
//--------------------------------------------------------------------------------------- -THE LCD-BUTTON
#define btnNONE   0  // 0 für lcd_key, wenn KEIN Button gedrückt wird.
#define btnSELECT 1  // 1 für lcd_key, wenn der SELECT Button gedrückt wird.
#define btnUP     2  // 2 für lcd_key, wenn der UP Button gedrückt wird.
#define btnDOWN   3  // 3 für lcd_key, wenn der DOWN Button gedrückt wird.
#define btnLEFT   4  // 4 für lcd_key, wenn der LEFT Button gedrückt wird.
#define btnRIGHT  5  // 5 für lcd_key, wenn der RIGHT Button gedrückt wird.

Hier die Funktion dazu,
Code:
//--------------------------------------------------------------------------------------------------------- -THE LCD-BUTTON CODE AUSLESEN
int read_LCD_buttons(){                   // Varible zum Button-Key Auslesen.
adc_key_in = analogRead(0);               // Button-Wert Auslesen am Eingang vom LCD! (KEY-PIN to analog pin 0).
if (adc_key_in > 1000) return btnNONE;    // Kein Button gedrückt!
if (adc_key_in < 50)   return btnRIGHT;   // "right" Button gedrückt!
if (adc_key_in < 195)  return btnUP;      // "up" Button gedrückt!
if (adc_key_in < 380)  return btnDOWN;    // "down" Button gedrückt!
if (adc_key_in < 555)  return btnLEFT;    // "left" Button gedrückt!
if (adc_key_in < 790)  return btnSELECT;  // "select" Button gedrückt!
return btnNONE;                           // Wenn nichts weiter gedrückt wird Button NONE-WERT zurück geben!
}

Und ein Menu reagiert dann auf die Buttons, Uhr ist da wenn nix gedrückt wird, muss man ja nich haben is aber schick Wink und ob das Backlight an is oder aus kan man auch weg lassen. der rest könnte es das sein was du suchst?

Code:
MainMenu:{
//--------------------------------------------------------------------------------------------------------------- -AKTUELLE ZEIT ANZEIGEN
lcd.setCursor(1, 0);
lcd.print(dayShortStr(weekday()));
lcd.setCursor(5, 0);
if(day()<10) lcd.print("0");
lcd.print(day(), DEC);
lcd.print(".");
if(month()<10)lcd.print("0");
lcd.print(month(), DEC);
lcd.print(".");
lcd.print(year(), DEC);
//--------------------------------------------------------------------- -Stunde:Minute:Sekunde
lcd.setCursor(4, 1);
if(hour()<10) lcd.print("0");
lcd.print(hour(), DEC);
lcd.print(":");
if(minute()<10) lcd.print("0");
lcd.print(minute(), DEC);
lcd.print(":");
if(second()<10) lcd.print("0");
lcd.print(second(), DEC);
//------------------------------------------------------------------------------------------------------------------------- -LCD FADE OUT
/*if (now.minute() -5 == int(idle_start) && int(lcd_key == 0) && int(lcd_key_last == 0) && int (lcd_fade == 0)){
digitalWrite(10, LOW);
lcd_fade = 1;
}
//--------------------------------------------------------------------------------------------------------------------------- -LCDFADE IN
if (int (lcd_fade == 0) && int(lcd_key != 0) && int(lcd_key_last != 0) && int(idle_start != 0)){
digitalWrite(10, HIGH);
idle_start = 0;
}*/
//------------------------------------------------------------------------------------------------------------------ -LCD TASTEN AUSLESEN
lcd_key = read_LCD_buttons();
if(lcd_key!=lcd_key_last){     // BUTTON CHECK.
switch (lcd_key){              // Ist ein Button gedrückt worden => gehe zum Ergebnis (1-5).
/*-------------------------------------------------------------------------------------------------------------------------------------*/
case btnSELECT:{               // Der SELECT-Button wurde gedrückt.
if(lcd_fade==1){               // Feststellen ob das Display-Backlight abgedunkelt ist.
lcd_fade=0;                    // Display Fade Varible auf NULL setzten um das Display-Backlight wieder zu reaktivieren.
}
else {                         // Wenn das Disply bereits Aktiviert ist.
lcd.clear();                   // LCD-Anzeige Löschen.
day_screen = true;             // Lock the other Screens.
goto RUNDAYS;                  // "JUMPER" zum Menupunkt "RNDAYS".
}
break;                         // Ende SELECT-Button.
}
/*-------------------------------------------------------------------------------------------------------------------------------------*/
case btnUP:{                   // Der UP-Button wurde gedrückt.
if(lcd_fade==1){               // Feststellen ob das Display-Backlight abgedunkelt ist.
lcd_fade=0;                    // Display Fade Varible auf NULL setzten um das Display-Backlight wieder zu reaktivieren.
}
else {                         // Wenn das Disply bereits Aktiviert ist.
lcd.clear();                   // LCD-Anzeige Löschen.
led_screen = true;             // Lock the other Screens.
goto LED_ON_OFF;               // "JUMPER" zum Menupunkt "LED_ON_OFF"
}
break;                         // Ende UP-Button.
}
/*-------------------------------------------------------------------------------------------------------------------------------------*/
case btnDOWN:{                 // Der DOWN-Button wurde gedrückt.
if(lcd_fade==1){               // Feststellen ob das Display-Backlight abgedunkelt ist.
lcd_fade=0;                    // Display Fade Varible auf NULL setzten um das Display-Backlight wieder zu reaktivieren.
}
else {                         // Wenn das Disply bereits Aktiviert ist.
lcd.clear();                   // LCD-Anzeige Löschen.
rlf_screen = true;             // Lock the other Screens.
goto RLF_ON_OFF;               // "JUMPER" zum Menupunkt "RLF_ON_OFF"
}
break;                         // Ende DOWN-Button.
}
/*-------------------------------------------------------------------------------------------------------------------------------------*/
case btnLEFT:{                 // Der LEFT-Button wurde gedrückt.
if(lcd_fade==1){               // Feststellen ob das Display-Backlight abgedunkelt ist.
lcd_fade=0;                    // Display Fade Varible auf NULL setzten um das Display-Backlight wieder zu reaktivieren.
}
else {                         // Wenn das Disply bereits Aktiviert ist.
lcd.clear();                   // LCD-Anzeige Löschen.
air_screen = true;             // Lock the other Screens.
goto AIR_ON_OFF;               // "JUMPER" zum Menupunkt AIR_ON_OFF.
}
break;                         // Ende Display-Key ausleden.
}
/*-------------------------------------------------------------------------------------------------------------------------------------*/
case btnRIGHT:{                // Der RIGHT-Button wurde gedrückt.
if(lcd_fade==1){               // Feststellen ob das Display-Backlight abgedunkelt ist.
lcd_fade=0;                    // Display Fade Varible auf NULL setzten um das Display-Backlight wieder zu reaktivieren.
}
else {                         // Wenn das Disply bereits Aktiviert ist.
lcd.clear();                   // LCD-Anzeige Löschen.
sensor_screen = true;          // Lock the other Screens.
goto TEMP_RLF;                 // "JUMPER" zum Menupunkt TempRLF.
}
break;                         // Ende Display-Key ausleden.
}
/*-------------------------------------------------------------------------------------------------------------------------------------*/
case btnNONE:{                 // Es wird kein Button gedrückt.
idle_start = minute();     // Sobald kein Button betätigt ist, die Zeit merken.
break;                         // Ende Button NONE.
}
//---------------------------------------------------------------------------------------------------------------------- -ENDE Switch-Key
}
//-------------------------------------------------------------------------------------------------------------------- -ENDE Button Check
}
lcd_key_last=lcd_key;          // Den zuletzt betätigten Button merken.
return;
//----------------------------------------------------------------------------------------------------------------------- -ENDE MAIN-MENU
}

EDIT:
Hier noch ein MenuePunkt.
Code:
LED_ON_OFF:{
if (led_screen == true){
/*-------------------------------------------------------------------------------------------------------------------------------------*/
lcd.setCursor(0, 0);            // Vorlagen Text in die 1. Zeile des Displays ausgeben, beginnend beim 1. Zeichen.
lcd.print("LEFT LED-ON");       // Vorlagen Text Menu Option1
lcd.setCursor(0, 1);            // Vorlagen Text in die 2. Zeile des Displays ausgeben, beginnend beim 1. Zeichen.
lcd.print("RIGHT LED-OFF");     // Vorlagen Text. Menu Option2
/*-------------------------------------------------------------------------------------------------------------------------------------*/
lcd_key = read_LCD_buttons();   // LCD-Button Auslesen.
if (lcd_key == btnLEFT){        // Der UP-Button ist gedrückt worden. (Analog=145 an Pin0).
lcd.clear();                    // LCD-Anzeige Löschen.*/
lcd.setCursor(0, 0);            // Vorlagen Text in die 1. Zeile des Displays ausgeben, beginnend beim 1. Zeichen.
lcd.print("LED is ON");         // Vorlagen Text.
delay(1000);                    // 1 Sekunden warten. (Anzeige dauer der Daten.)
/*-------------------------------------------------------------------------------------------------------------------------------------*/
led_screen = false;
led_manual_stop = false;
led_manual_run = true;
digitalWrite(A1, LOW);
lcd.clear();                    // LCD-Anzeige Löschen.
goto MainMenu;                  // Zurück zum Main-Menu
}
/*-------------------------------------------------------------------------------------------------------------------------------------*/
else if (lcd_key == btnRIGHT){  // Der DOWN-Button ist gedrückt worden (Analog=330 an Pin0).
lcd.clear();                    // LCD-Anzeige Löschen.
lcd.setCursor(0, 0);            // Vorlagen Text in die 1. Zeile des Displays ausgeben, beginnend beim 1. Zeichen.
lcd.print("LED IS OFF");        // Vorlagen Text.
delay(1000);                    // 1 Sekunden warten. (Anzeige dauer der INFOS).
/*-------------------------------------------------------------------------------------------------------------------------------------*/
led_screen = false;
led_manual_run = false;
led_manual_stop = true;
digitalWrite(A1, HIGH);
lcd.clear();                    // LCD-Anzeige Löschen.
goto MainMenu;                  // Zurück zum Main-Menu.
}
//--------------------------------------------------------------------------------- -Return-Schleife bis ein Button am LCD gedrückt wurde
else {                         // Wenn kein Button gedrückt wird.
goto LED_ON_OFF;               // Zurück zum Menuepunkt LED_ON_OFF
}
}
}

Vielleicht hilft es ja weiter Smile wenn nicht haben wir wieder ein paar Code Schnipzel mehr im Web Wink

gruß

In unserer Gesellschaft ist das Gehirn am gerechtestesten Verteilt! Jeder glaubt, er habe genug davon.
Hardware: SainSmart Mega 2560 R3 + 3,2" LCD-Touch-Screen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.07.2014, 19:22 (Dieser Beitrag wurde zuletzt bearbeitet: 01.07.2014 19:24 von ersiees.)
Beitrag #6
RE: Taster abfragen
Danke euch für eure HilfeShy Ihr seid Klasse

So das habe ich heute zusammengebastelt und es funktioniert soweit erstmal Sleepy ,kann ich nun die Motoransteuerung direkt mit reinschreiben oder wie Gliedert man das.
Zwei Fragen noch ,wenn ich die Taster aus und Einfahren loslasse möchte ich das ich wieder nur die Temperatur angezeigt bekomme und der Motor soll ja dann auch stoppen.
Wie macht man es das der angezeigte Wert der Temperatur nicht flackert das tut er nämlich,ich nehme an das hat mit dem zyklischem Durchlauf im Loop teil zu tun.

gruß torsten

#include <SPI.h>
#include "sainsmartkeypad.h"
#include <LiquidCrystal.h>
#include "Arduino.h"

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
uint8_t key;

int sensorPin = A3; // Temperatursensor auf Analogeingang 3
int sensor_temp = 3; // erstellen einer Variable

void setup(){
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Temperatur");
}

void loop(){
// key = keypad.getKey_fastscroll(); // Mit Tastenwiederholung
key = keypad.getKey_waitrelease(); // Einmaliger Tastendruck


sensor_temp = analogRead(sensorPin);
lcd.setCursor(12,0);
lcd.print(sensor_temp); //ausgabe der Temperatur

switch(key){
case RIGHT_KEY:{ // Code für rechte Taste
lcd.begin(16, 2);
lcd.setCursor(0,1);
lcd.print("Automatik Modus");
}
break;
case LEFT_KEY:{ // Code für linke Taste}
lcd.begin(16, 2);
lcd.setCursor(0,1);
lcd.print("Manueller Modus");
}
break;
case UP_KEY:{ // Code für obere Taste
lcd.begin(16, 2);
lcd.setCursor(3,1);
lcd.print("Ausfahren");
}
break;
case DOWN_KEY:{ // Code für untere Taste
lcd.begin(16, 2);
lcd.setCursor(3,1);
lcd.print("Einfahren");
}
break;
case SELECT_KEY:
// Code für Select-Taste
break;
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2014, 09:02
Beitrag #7
RE: Taster abfragen
(01.07.2014 19:22)ersiees schrieb:  kann ich nun die Motoransteuerung direkt mit reinschreiben oder wie Gliedert man das.
Theoretisch kann man das direkt reinschreiben, aber das dürfte schnell unübersichtlich werden. Ich würde zumindest für den Automatik-Modus eine eigene Funktion schreiben. RIGHT_KEY und LEFT_KEY würden dann eine Variable setzen, die anzeigt in welchem Modus das System gerade ist. Wenn es im auto-Modus ist, dann am Ende vom loop() die Automatik-Handler-Funktion aufrufen.

Zitat:wenn ich die Taster aus und Einfahren loslasse möchte ich das ich wieder nur die Temperatur angezeigt bekomme und der Motor soll ja dann auch stoppen.
Es gibt doch sowas wie lcd.clear, oder? Zum Motor: Überleg Dir, unter welchen Bedingungen der Motor in welche Richtung laufen soll und pack' das dann ans Ende vom loop(). Mach das hier nur für den manuellen Modus.

Zitat:Wie macht man es das der angezeigte Wert der Temperatur nicht flackert das tut er nämlich,ich nehme an das hat mit dem zyklischem Durchlauf im Loop teil zu tun.
Versuch mal, die Temperatur nur dann aufs LCD zu schreiben, wenn sie sich seit dem letzten Durchlauf geändert hat.

Gruß,
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
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  LED Zustand abfragen Nafetz 35 874 02.12.2016 10:09
Letzter Beitrag: hotsystems
  mehrere Taster entprellen Kitt 15 524 24.10.2016 21:17
Letzter Beitrag: georg01
  Byte Shiften und Bit abfragen.... comfan 4 205 02.09.2016 20:30
Letzter Beitrag: comfan
  Taster für mehrere Funktionen matthias3579 5 350 16.08.2016 16:00
Letzter Beitrag: StephanBuerger
  Steuern von 4 Servo mittels eines Taster und eines Potis Jackie09 17 757 16.07.2016 11:43
Letzter Beitrag: Binatone
  Schwellwert mit Taster ändern malsehen 16 1.414 12.04.2016 20:11
Letzter Beitrag: malsehen
  3 Schrittmotoren, 2 LED's 1 Taster cichla 0 393 31.03.2016 15:21
Letzter Beitrag: cichla
  Arduino Alarmanlage mit Taster erweitern Vengance 0 524 22.03.2016 17:54
Letzter Beitrag: Vengance
  Taster abfragen Rudi 3 691 25.02.2016 14:03
Letzter Beitrag: hotsystems
  Ein- u. Ausgänge abfragen magifix 0 391 07.01.2016 16:50
Letzter Beitrag: magifix

Gehe zu:


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