PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Werte speichern



Alexhpg
16.11.2016, 17:08
Ich will ein Sketch schreiben der Daten lesen, speichern und ausgeben kann .Z.B. wenn ich einen Button drücke der eine Lampe zum leuchten bringt soll das die Arduino merken die Dauer usw. Speichern und beim drücken eines zweiten Button die Lampe genau in der selben Zeitspanne leuchten lassen. Kann mir da jemand helfen?

Sisor
16.11.2016, 18:28
Der folgende Code erfüllt die oben genannten Anforderungen in der einfachsten Variante:

#define button1Pin 2
#define button2Pin 3
#define ledPin 13
#define PRESSED HIGH

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
}

void loop() {
static unsigned long pressed_ms = 500;
if( digitalRead(button1Pin) == PRESSED) {
pressed_ms = 0;
do {
delay(20);
pressed_ms += 20;
} while(digitalRead(button1Pin) == PRESSED);
}
if( digitalRead(button2Pin) == PRESSED ) {
digitalWrite(ledPin, HIGH);
delay(pressed_ms);
digitalWrite(ledPin, LOW);
}
}

i_make_it
17.11.2016, 07:35
Soll die Lampe brennen solange Taster 1 gedrückt is?
Oder soll mit einmal drücken von Taster 1 die Lampe angehen und solange anbleiben bis Taster 1 nochmal gedrückt wird?
Das erste ist Ok für ein paar Sekunden.
Wenn es aber darum geht, das es auch länger dauern soll, dann tut einem irgendwann der Finger weh und Variante zwei ist besser.

Wissen muß man, das Sisors Sketch die 20ms Delay nimmt damit ein Taster Prellen nicht sofort das wieder loslasen des Tasters vortäuscht.
Man kann also den Wert nicht einfach verkleiner falls einem 20ms Schritte zu lang wären.
http://www.scynd.de/tutorials/arduino-tutorials/1-taster/1-2-taster-entprellt.html
In dem Fall müsste man anders entprellen (ggf. in Hardware).
http://www.elektronik-kompendium.de/sites/dig/0210223.htm

Was man auch beachten muß, ist, das man Sisors Code nicht einfach in ein größeres Scetch einfügen kann.
Da hier die Tasterabfrage per Polling erfolgt und dies von der Laufzeit der Hauptschleife abhängt.
Fügt man in die Hauptschleife einfach ein "Delay(500)" ein um eine längere Laufzeit zu simulieren, muß man im ungünstigsten Fall 521ms lang den Taster drücken bis das Programm dies erkennt.
In so einem Fall wäre ein Interrupt Eingang die bessere Wahl.
Auch würde dann die Inkrementierung von "pressed_ms" nicht mehr zur tatsächlich vergangenen Zeit passen und man müsste anders vorgehen.

Bleibt der Code unverändert, so ist er einfach, kurz und gut.

Unregistriert
17.11.2016, 14:09
Danke, hat mir sehr geholfen.