Hallo Achim,
ich habe deine Artikel über Multitasking gelesen und heute etwas selber herumgebastelt. Allerdings musste ich auf die normale Arduino IDE zurückgreifen, da mir schlicht das Wissen für deine sehr hardwarenahe Programmierung fehlt.
Ein Modul behandelt die LED's. Ich kann sagen, wie lange sie hell ist und wie lange dunkel.
Eine rote LED leuchtet 1 Sekunde und ist anschliessend 0.2 Sekunden dunkel. Bei einer blauen LED ist das genau umgekehrt. Die rote LED startet mit einem hellen Zyklus, die blaue LED mit einem dunklen Zyklus. So erhalte ich einen asymmetrischen Wechselblinker.
Ein weiteres Modul behandelt einen Taster. Wenn ich ihn länger als 1 Sekunde drücke, meldet er mir einen langen Tastendruck. Darunter bekomme ich einen kurzen Tastendruck. Zeiten unter 20 ms werden nicht berücksichtigt, damit erhalte ich eine gute Entprellung.
Bei einem kurzen Tastendruck wechselt jeweils das Timing der roten und blauen LEDs. Ein langer Tastendruck schaltet eine dritte LED ein und wieder aus.
Ich verwende im Programm keine Delays, sondern arbeite mit der Funktion millis() aus der Arduino - Bibliothek.
Hier ist das Hauptprogramm. Die anderen Module wären hier zu gross. Ich habe aber das ganze Projekt als Anhang beigefügt. Es kann aber nur in einer Arduino IDE geöffnet werden.
#include "Constants.h"
void setup() {
// OnBoard - LED verwenden
pinMode(13,OUTPUT);
digitalWrite(12,LOW);
// Die rote und die gruene LED initialisieren
ledRot_init(8); // pin 8
ledGruen_init(9); // pin 9
key_init(2); // Taste an Pin 2
// Wechselblinker, rot ist 1 Sek. an, gruen ist 0.2 Sek. an
ledRot_blink(LED_STATE_BLINK_ON,1000,200); // beginn mit hellem Zyklus, 1000 ms an, 200 ms aus
ledGruen_blink(LED_STATE_BLINK_OFF,200,1000); // beginnt mit dunklem Zyklus, 200 ms an, 1000 ms aus
}
void shortPress() {
// Schaltzeiten von rot/gruen vertauschen
static boolean red = true; // rot leuchtet lange
red = !red;
if (red) {
ledRot_blink(LED_STATE_BLINK_ON,1000,200);
ledGruen_blink(LED_STATE_BLINK_OFF,200,1000);
} else {
ledRot_blink(LED_STATE_BLINK_ON,200,1000);
ledGruen_blink(LED_STATE_BLINK_OFF,1000,200);
}
}
void longPress() {
// LED 13 wird geschaltet
static boolean ledOn = false;
ledOn = !ledOn;
if (ledOn) digitalWrite(13,HIGH); else digitalWrite(13,LOW);
}
void loop() {
ledRot_blink(); // aktualisiert den Zustand gemäss vorgegebenem Timing
ledGruen_blink();
int keyState = key_debounced(); // gibt zurück, wie die Taste gedrückt wurde
if (keyState == KEY_SHORT) shortPress();
else if (keyState == KEY_LONG) longPress();
}