Go Down

Topic: Bitte um Hilfe - Arduino soll Tasten zählen (Read 10637 times) previous topic - next topic

oxygenvirus

Hi,

ich bin ziemlich neu in der Arduino Gemeinde und hab mittlerweile schoan fast alle Tutorials durch: LED, LCD, Buttons usw.
Habe auch einige Projekte mit dem Arduino vor. Meistens für den KFZ Bereich.
Würde euch gerne diese mal vorstellen wenn diese Fertig sind.

Aber nun zu meinem Problem: ich suche schon ewig nach einem Tutorial/Beispiel, wie ich die Tastendrücke vom Button zählen kann.

Und zwar sollte es so sein:
bei 1 Tastendruck sollte ein fester Wert1 dargestellt werden
bei 2 - Wert 2
usw.
werden knapp an die 100 Stück sein.

diese Werte sind fest und werden kleine Textzeilen oder Wörter sein.

Sprich der Arduino soll die Anzahl der Impulse zählen und danach den gewünschten Wert anzeigen.
Diese werden dann auf einem LCD 16x2 angezeigt.


Kann mir da jemand weiterhelfen?

PS: ein eifaches Projekt hab ich schon fertig "BMW Service Reset" - dieser ist aber noch ausbaufähig, wenn ich die PCB optimiert habe, werde dieses Projekt veröffentlichen.

willich

In Pseudocode:

text[] als Stringarray

Wenn Taste gedrückt und vorher nicht gedrückt war, dann zähle i um einen rauf.

Wenn i sich ändert: LCD.print(text);


So, oder sinngemäß.

oxygenvirus

Vielen Dank Pumbaa,

bin dabei infos über diese funktionen zu suchen.

Ich will nicht unverschämt klingen, aber geht es mit dem Code "ein wenig genauer?"


willich

#3
Mar 22, 2010, 09:57 pm Last Edit: Mar 23, 2010, 01:29 pm by willich Reason: 1
Guck dir die "control"-beispiele aus der ArduinoIDE an. Wenn du die durchdringst, durchdringt dich die Weisheit.
Da sind arrays, for-schleifen und if-abfragen drin. Alles was in den Werkzeugkoffer gehört....

Ansonsten ersuche dir hier "entprellen" oder "debounce" von Schalter. Hätte gedacht, da wärste, wenn du "buttons, LED und LCD" durch hast ;)

Und nicht böse gemeint:. Aber das ist recht elementar. Das hier durchzukauen, wäre unangebracht. Das ist in JEDEM Tutorial, was du findest, drin. Guck dir den "complete beginners guide" von earthshine design an http://earthshinedesign.co.uk/ASKManual/ASKManualRev3.pdf, falls noch nicht gefunden.

inside-man

#4
Mar 22, 2010, 10:15 pm Last Edit: Mar 23, 2010, 09:27 am by inside-man Reason: 1
Hallo, ich habe hier mal ein Programm aus meinem Repertoire. Der Einfachheit habe ich es aber komplett gelassen, werfe einfach raus, was Du nicht brauchst. Ich habe das debounce Beispiel genommen und erweitert.

Das Programm ist vielleicht nicht super clever gechrieben, aber es funktioniert zuverlaessig. Es steuert einen Toaster (die Heizwendeln), 3 mal kurz Taster  druecken zaehlt auf drei und schaltet die Heizung 3 Minuten an. Jeder Tastendruck erhoeht also um eine Minute. mehr als 3 Sekunden dauer druecken resettet alles auf Null. Eine Erweiterung war geplant eine LED so oft zu pulsen wieviel  Minuten noch anstehen...
Also viel Spass beim Ausmisten! Fragen kann ich dazu natuerlich gern beantworten, und zwar zu wirklich jedem byte!

Gruss Inside Man


Code: [Select]
// set pin numbers:
const int buttonPin = 10;     // the number of the pushbutton pin
const int ledPin1 =  8;      // the number of the LED pin
const int ledPin2 =  9;

// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin
int ledvar;
int flag;
int counter = 0;
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 20;    // the debounce time; increase if the output flickers
long millisstored;
long millisstored2;

void setup() {
 Serial.begin(9600);
 pinMode(buttonPin, INPUT);
 pinMode(ledPin1, OUTPUT);
 pinMode(ledPin2, OUTPUT);
}

void loop() {
// read the state of the switch into a local variable:
 int reading = digitalRead(buttonPin);
 if (reading != lastButtonState) { lastDebounceTime = millis();  }
 if ((millis() - lastDebounceTime) > debounceDelay) { buttonState = reading;}
 lastButtonState = reading;

//rising edge
if ((buttonState == HIGH) && (flag == LOW)) {
counter = counter + 1000; millisstored = millis(); millisstored2 = millis();
flag = HIGH;}

//falling edge
if ((buttonState == LOW) && (flag == HIGH)) { Serial.println(counter);
flag = LOW;}
//countdown
if (counter > 0) {
counter = counter - (millis()- millisstored);
millisstored = millis();}
//switch led
if (counter > 0) {digitalWrite(ledPin1, HIGH);} else { digitalWrite(ledPin1, LOW);}
//reset for longtime
if (buttonState == HIGH) {if ((millis() - millisstored2) > 3000) {counter = 0;}}  
//The_END
}


oxygenvirus

#5
Mar 23, 2010, 08:49 am Last Edit: Mar 23, 2010, 09:52 am by oxygenvirus Reason: 1
@ Pumbaa:

schon recht danke!!! Bloß manchmal googlet man sich zu tode und findet nichts "vor allem wenn man nicht weiß was man eigentlich braucht".

Und mir deiner Hilfe, weiß ich schon mal was ich durchkauen sollte :)

Leider ist der Link zum PDF tot :(

@ inside-man
Danke, werde gleich mal ausprobieren.

willich

#6
Mar 23, 2010, 01:25 pm Last Edit: Mar 23, 2010, 01:32 pm by willich Reason: 1
Bei mir ist der link nicht tot. Dauert aber was zu laden.
Ansonsten ASKManual oder so googlen. evtl mit "Arduino" und "earthshine".
Oder von hier aus:
http://www.earthshinedesign.co.uk/ASKManual/Site/ASKManual.html

Zum Nichtwissen was zu googlen: Stimmt. Haste Recht. Ich weiß noch, wie ich am Anfang wahnsinnig wurde, weil ich diese IDE-Buchsen haben wollte. Wie die alten Festplattenanschlüsse aufm Mainboard, nur mit 16 Pins.
Wer kommt auf die Idee, dass die Dinger Wannenstecker und -Buchse heißen.... Und die Verbindungstechnik "Schneidklemm"...  :) Und auf Englisch "IDC".

Go Up