Commit 3a560d19 by Risto Heinsar

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

parent 2e543e87
......@@ -6,7 +6,7 @@
#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()
{
......@@ -14,6 +14,7 @@ void setup()
pinMode(BUTTON_PIN, INPUT);
}
void loop()
{
Serial.println("Leiame QTI sensorite tumeda ja heleda pinna keskmise väärtuse.");
......@@ -88,25 +89,49 @@ uint16_t MeasureQtiAverage(void)
return surface;
}
/* Compacted version of https://docs.arduino.cc/built-in-examples/digital/Debounce/ */
bool ButtonRead()
bool ButtonRead(void)
{
/* Nupu olek eelnevast funktsiooni käivitamisest, kasutame stabiliseerimiseks */
static bool lastButtonState = LOW;
/* Viimase nupu oleku muutuse tuvastatud aeg, kasutame stabiliseerimiseks */
static uint32_t lastDebounceTime = 0;
/* Eelmine stabiilne nupu olek, vajalik nupu all hoidmisel korduste vältimiseks */
static bool buttonState = LOW;
/* Vaikimisi eeldame, et nupp pole vajutatud enne kui kontrollime */
bool returnVal = LOW;
/* Loeme nupu oleku */
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();
}
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;
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;
return false;
return returnVal;
}
\ No newline at end of file
......@@ -18,6 +18,7 @@ void setup()
pinMode(SONIC_ECHO_PIN, INPUT);
}
void loop()
{
if (ButtonRead())
......@@ -42,24 +43,49 @@ float GetDistInCm()
return 0.0f;
}
bool ButtonRead()
bool ButtonRead(void)
{
/* Nupu olek eelnevast funktsiooni käivitamisest, kasutame stabiliseerimiseks */
static bool lastButtonState = LOW;
/* Viimase nupu oleku muutuse tuvastatud aeg, kasutame stabiliseerimiseks */
static uint32_t lastDebounceTime = 0;
/* Eelmine stabiilne nupu olek, vajalik nupu all hoidmisel korduste vältimiseks */
static bool buttonState = LOW;
/* Vaikimisi eeldame, et nupp pole vajutatud enne kui kontrollime */
bool returnVal = LOW;
/* Loeme nupu oleku */
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();
}
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;
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;
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