Arduino binära väckarklocka (10 / 16 steg)
Steg 10: Knappen och sensor kod
Koden hantering knapparna, är växeln och touch sensor uppdelad i två funktioner, en för att kontrollera om knapparna trycks och en för att göra vad knapparna bör om de trycks dvs tidsinställning, ställa in larm, snooze och aktivera eller inaktivera alarmet.Jag skrev först koden med debouncing för knapparna, men senare när jag testade min knappar jag märkte att jag inte verkade behöver det, så jag tog bort den debouncing att få mindre och lättare att läsa koden, men jag med funktionen med debouncing i fliken f_comments_etc i skissen.
Kolla för knapptryckningar:
Den kod som kontrollerar om knapparna trycks är egentligen enkel. Den läser bara staten knappar stift. Arduinos inre pullup motstånd används så de knappar staterna är hög när de inte trycks och låg när de trycks.
Touch sensor läses med hjälp av CapSense biblioteket: touch_sensor.capSense(10) detta kommer att mäta kapacitansen 10 gånger och returnera ett genomsnitt. Beroende på värdet som returneras av snooze_button_state sätts variabel till antingen hög eller låg. Jag har funnit att när jag vila min hand på locket till klockan jag får ett värde runt 150 och med ingen hand ca 30 (om jag minns rätt). så jag använde 100 som gräns för att ändra tillståndet för snooze-"knappen". Ändra värdet som behövs.
______________________________________________________________________
Den funktion som kontrollerar om knapptryckningar:
void update_buttons_state()
{
hour_button_state = digitalRead(hour_button_pin);
minute_button_state = digitalRead(minute_button_pin);
setting_switch_state = digitalRead(setting_switch_pin);
/ * Läs snooze touch sensor: * /
IF(touch_sensor.capSense(10) > 100) / / justera det här värdet om det behövs
snooze_button_state = låg;
annat
snooze_button_state = hög;
den if-else ovan jag tror kunde skrivas kortare som:
snooze_button_state = (touch_sensor.capSense(10) > 100)? LÅG: HÖG;
}
______________________________________________________________________
Göra saker om knapparna trycks:
Växeln inställningar kommer att ändra två pekare hours_p och minutes_p att peka på antingen variabler timmar och minuter, eller alarm_hours och alarm_minutes. Koden för timme och minut knapparna kommer använda dessa tips, så när växeln ändras de automatiskt ställa in rätt; larm eller tid. Funktionen display använder också hours_p och minutes_p pekare så när växeln inställningar är på larm, alarmtiden visas.
Timme och minut knappar ökningen i timmar och minuter med en av varje tid de trycks.
På snooze-knappen kommer att stänga av larmsignalen och ange en snooze off tid (aktuell tid + 10 minuter) när signalen ska börja igen. inställningen anger också den variabeln snooze_on till true, detta kommer att orsaka alarmfunktionen att börja leta efter när snooze tid är.
Om snooze-knappen nedtryckt i 3 sekunder kommer det växla larm av eller på. En gällt ton spelas när larmet aktiveras och en låg pitched ton spelas när alarmet är avaktiverat.
______________________________________________________________________
Funktionen knappar:
"INRE" VARIABLER FÖR KNAPPAR FUNKTION:
booleska first_time_hour = sant; dessa används för att se till att timmarna
booleska first_time_minute = sant; och några minuter bara ökas en gång varje tangenttryckning.
osignerade långa snooze_button_timer; används för att hålla reda på hur länge på snooze-knappen har
hållits. När knappen hålls
en viss tid, larmet slås
av helt.
void buttons()
{
LÅG ==-knappen intryckt
HÖG == knappen släppt
(detta är eftersom pullup motstånd används)
Besluta om vi ska ställa in tid eller alarm:
(detta gör också displayen Visa larmtiden)
IF(setting_switch_state==low) / låg = inställd tid
{
hours_p = & timmar;
minutes_p = & minuter;
}
annat / / hög = Set alarm
{
hours_p = & alarm_hours;
minutes_p = & alarm_minutes;
}
Om timme knappen trycks, öka timmar:
om (hour_button_state == låg & & first_time_hour) / / endast öka timmar en gång
{/ / varje knapp tryck.
om (* hours_p < 23)
(* hours_p) ++;
annat
* hours_p = 0;
first_time_hour = false;
IF(debug)
{
Serial.println ("timme ökning").
Serial.println(hour_button_state);
}
}
annat if(hour_button_state==HIGH)
{
first_time_hour = sant; Återställ när knappen släpps,
} / / så att de nästa tryck registren.
Om minut knappen trycks, öka minuter:
om (minute_button_state == låg & & first_time_minute) / / endast öka protokollet
{/ / en gång varje knapp pressa.
om (* minutes_p < 59)
(* minutes_p) ++;
annat
* minutes_p = 0;
first_time_minute = false;
}
annat if(minute_button_state==HIGH)
{
first_time_minute = sant; Återställ när knappen släpps,
} / / så att de nästa tryck registren.
IF(snooze_button_state==low)
{
IF(signal_on)
{
ställa in tiden när larmsignalen ska börja igen,
Detta ger 10 minuters snooze:
IF(Minutes<50)
{
snooze_off_minutes = minuter + 10.
snooze_off_hours = timmar;
}
annat
{
snooze_off_minutes = minuter - 50;
snooze_off_hours = timmar + 1.
}
snooze_on = sant;
signal_on = false;
}
om snooze-knappen hålls för mer än 3 sekunder slå av/på larmet
IF((Millis() - snooze_button_timer) > 3000)
{
IF(alarm_on) / / om på, Stäng av
{
signal_on = false;
alarm_on = false;
spela tonen så att användaren vet larmet avstängd:
tone_maker.Play (NOTE_A3, 100);
}
annat if(alarm_on==false) / / om av, slå på
{
alarm_on = sant;
spela tonen så att användaren vet larmet avstängd:
tone_maker.Play (NOTE_A7, 100);
}
återställa snooze knappen timer
snooze_button_timer=Millis();
}
}
annat
{
återställa snooze knappen timer
snooze_button_timer=Millis();
}
}
___________________________________________________________________