Commit 3a560d19 by Risto Heinsar

Fixed a bug in the debounce code, added comments for clarity

parent 2e543e87
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#define NUM_OF_MEASUREMENTS 10 #define NUM_OF_MEASUREMENTS 10
const uint8_t debounceDelay = 50; // the debounce time; increase if the output flickers const uint8_t debounceDelay = 40; // nupu stabiliseerimise aeg
void setup() void setup()
{ {
...@@ -14,6 +14,7 @@ void setup() ...@@ -14,6 +14,7 @@ void setup()
pinMode(BUTTON_PIN, INPUT); pinMode(BUTTON_PIN, INPUT);
} }
void loop() void loop()
{ {
Serial.println("Leiame QTI sensorite tumeda ja heleda pinna keskmise väärtuse."); Serial.println("Leiame QTI sensorite tumeda ja heleda pinna keskmise väärtuse.");
...@@ -88,25 +89,49 @@ uint16_t MeasureQtiAverage(void) ...@@ -88,25 +89,49 @@ uint16_t MeasureQtiAverage(void)
return surface; return surface;
} }
/* Compacted version of https://docs.arduino.cc/built-in-examples/digital/Debounce/ */ bool ButtonRead(void)
bool ButtonRead()
{ {
/* Nupu olek eelnevast funktsiooni käivitamisest, kasutame stabiliseerimiseks */
static bool lastButtonState = LOW; static bool lastButtonState = LOW;
/* Viimase nupu oleku muutuse tuvastatud aeg, kasutame stabiliseerimiseks */
static uint32_t lastDebounceTime = 0; static uint32_t lastDebounceTime = 0;
/* Eelmine stabiilne nupu olek, vajalik nupu all hoidmisel korduste vältimiseks */
static bool buttonState = LOW; static bool buttonState = LOW;
/* Vaikimisi eeldame, et nupp pole vajutatud enne kui kontrollime */
bool returnVal = LOW;
/* Loeme nupu oleku */
bool btnReadValue = digitalRead(BUTTON_PIN); bool btnReadValue = digitalRead(BUTTON_PIN);
if (btnReadValue != lastButtonState) {
/* Tuvastame kui nupu väärtus on muutunud eelmisest korrast */
if (btnReadValue != lastButtonState)
{
/* Uuendame millal viimati nupu olek muutus */
lastDebounceTime = millis(); lastDebounceTime = millis();
} }
if ((millis() - lastDebounceTime) > debounceDelay) {
if (btnReadValue != buttonState) { /* Kui nupu olek on piisavalt kaua olnud stabiilne (muutusteta, ei "võngu") */
if ((millis() - lastDebounceTime) > debounceDelay)
{
/* Väldib uue nupuvajutuse saatmise kuniks nupp pole lahti lastud vahepeal */
if (btnReadValue != buttonState)
{
/* Uuendame viimast stabiilset nupu olekut */
buttonState = btnReadValue; buttonState = btnReadValue;
if (buttonState == HIGH) {
return true; /* Tagab, et kui nupp on vajutatud, siis tagastatakse HIGH väärtus ehk vajutatud
} * Lihtsustatud kujult: if (buttonstate == HIGH) returnVal = HIGH
*/
returnVal = buttonState;
} }
} }
/* Funktsiooni korduse jaoks vajalik, et tuvastada nupu oleku muutus järgmisel korral */
lastButtonState = btnReadValue; lastButtonState = btnReadValue;
return false;
} return returnVal;
}
\ No newline at end of file
...@@ -18,6 +18,7 @@ void setup() ...@@ -18,6 +18,7 @@ void setup()
pinMode(SONIC_ECHO_PIN, INPUT); pinMode(SONIC_ECHO_PIN, INPUT);
} }
void loop() void loop()
{ {
if (ButtonRead()) if (ButtonRead())
...@@ -42,24 +43,49 @@ float GetDistInCm() ...@@ -42,24 +43,49 @@ float GetDistInCm()
return 0.0f; return 0.0f;
} }
bool ButtonRead() bool ButtonRead(void)
{ {
/* Nupu olek eelnevast funktsiooni käivitamisest, kasutame stabiliseerimiseks */
static bool lastButtonState = LOW; static bool lastButtonState = LOW;
/* Viimase nupu oleku muutuse tuvastatud aeg, kasutame stabiliseerimiseks */
static uint32_t lastDebounceTime = 0; static uint32_t lastDebounceTime = 0;
/* Eelmine stabiilne nupu olek, vajalik nupu all hoidmisel korduste vältimiseks */
static bool buttonState = LOW; static bool buttonState = LOW;
/* Vaikimisi eeldame, et nupp pole vajutatud enne kui kontrollime */
bool returnVal = LOW;
/* Loeme nupu oleku */
bool btnReadValue = digitalRead(BUTTON_PIN); bool btnReadValue = digitalRead(BUTTON_PIN);
if (btnReadValue != lastButtonState) {
/* Tuvastame kui nupu väärtus on muutunud eelmisest korrast */
if (btnReadValue != lastButtonState)
{
/* Uuendame millal viimati nupu olek muutus */
lastDebounceTime = millis(); lastDebounceTime = millis();
} }
if ((millis() - lastDebounceTime) > debounceDelay) {
if (btnReadValue != buttonState) { /* Kui nupu olek on piisavalt kaua olnud stabiilne (muutusteta, ei "võngu") */
if ((millis() - lastDebounceTime) > debounceDelay)
{
/* Väldib uue nupuvajutuse saatmise kuniks nupp pole lahti lastud vahepeal */
if (btnReadValue != buttonState)
{
/* Uuendame viimast stabiilset nupu olekut */
buttonState = btnReadValue; buttonState = btnReadValue;
if (buttonState == HIGH) {
return true; /* Tagab, et kui nupp on vajutatud, siis tagastatakse HIGH väärtus ehk vajutatud
} * Lihtsustatud kujult: if (buttonstate == HIGH) returnVal = HIGH
*/
returnVal = buttonState;
} }
} }
/* Funktsiooni korduse jaoks vajalik, et tuvastada nupu oleku muutus järgmisel korral */
lastButtonState = btnReadValue; lastButtonState = btnReadValue;
return false;
} return returnVal;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment