#define BUTTON 2
void setup() {
Serial.begin(9600);
pinMode(BUTTON, INPUT_PULLUP); //der Einfachheit lieber
}
void loop() {
aufgabe1();
}
void aufgabe1()
{
static int letzterWert = 0; //benötigt, da Zustandswechsel gezählt werden soll, sonst druckdauer
static int buttonCounter = 0;
int aktuellerStatus = digitalRead(BUTTON); //aktueller tasterzustand
if(aktuellerStatus == LOW && letzterWert == HIGH){ //zustandswechsel hat stattgefunden
buttonCounter++;
Serial.println(buttonCounter);
}
letzterWert = aktuellerStatus; //variable updaten für den nächsten vergleich
}
/* Problem: meherfachzählung des tasterdrucks durch prellen des tasters
- taster wechselt schnell zuwischen den zuständen hin und her bevor er in den statischen zustand gerät
*/
void aufgabe2a()
{
static int letzterWert = 0;
static int buttonCounter = 0;
int aktuellerStatus = digitalRead(BUTTON);
delay(12); //amateur "entprellen", manuelles entprellen
if(aktuellerStatus == LOW & letzterWert == HIGH){
buttonCounter++;
Serial.println(buttonCounter);
}
letzterWert = aktuellerStatus;
}
/* Problem delay
- programm wird pausiert
- alle weiteren Funktionen werden blokiert
- es kann nichts anderes gleichzeitig ausgeführt werden
- sollte der taster innerhalb der delay zeit erneut gedrueckt werden, wird dies nicht registriert
*/
void aufgabe2b()
{
static int buttonCounter = 0;
static int tasterStatus = 0;
static byte tasterGedrueckt = 0;
static unsigned long tasterzeit = 0; //Dauer des Tasterdrucks in ms
const unsigned long entprellzeit = 200; //entprellzeit in ms
tasterStatus = digitalRead(BUTTON);
if(tasterStatus == LOW)
{
tasterzeit = millis(); //zeitpunkt des tasterdrucks seit start des arduinos wird als referenzpunkt festgehalten
//somit kann gemessen werden, wie lange der taster gedrueckt wurde
tasterGedrueckt = 1;
}
if(millis()-tasterzeit > entprellzeit && tasterGedrueckt == 1) //wurde der taster lang genug gedrueckt? zustandsänderung stabil?
{
buttonCounter++;
Serial.print("YHUHHHUUUUUUU ");
Serial.println(buttonCounter);
tasterGedrueckt = 0;
}
}
/* millis
- nicht blockierende Funktion
- aufgaben koennen parallel ablaufen
- es koennen zeitspannen gemessen werden, ohne dass das programm dafür blockiert wird
- es entsteht ein reaktionsfähiges programm */
void version2() //hier wird nur nochmal geprüft ob der tasterzusatnd sich auch wirklich verändert hat
{
static int buttonCounter = 0;
static int tasterStatus = HIGH; //da zu Anfang nicht gedrueckt
static byte tasterGedrueckt = 0; //gedrueckt? nein
static unsigned long tasterzeit = 0; //Dauer des Tasterdrucks in ms
const unsigned long entprellzeit = 100;
byte currentState =digitalRead(BUTTON); //aktueller Tasterzustand
if(currentState != tasterStatus) //Zustandsänderung?
{
tasterzeit = millis();
}
if(millis()-tasterzeit>entprellzeit) //ist der Zustandswechsel gültig?
{
if(currentState == LOW && tasterGedrueckt == 0) //taster wurde betätigt, veralteter Wert liegt bei 0
{
buttonCounter++;
Serial.println(buttonCounter);
tasterGedrueckt = 1; //speichert, dass der taster nun als betätigt verstanden wird
}
if(currentState == HIGH && tasterGedrueckt == 1) //taster wurde losgelassen und vorherige if abfrage wurde ausgeführt
{
tasterGedrueckt = 0; //variable wird zurückgesetzt
}
}
tasterStatus = currentState; //status updaten
}