Nja. Jag har säkert missat något då jag inte provkört koden själv.
if(millis()%1000<500)
mills() returnerar systemklockan i millisekunder sedan starten. Den rullar runt ungefär vart 50e dag. Genom att ta ut resten från en division av denna med 1000 så får vi reda på var i sekunden vi är i tid just nu. Är det första halvsekunden (under 500ms) så görs det ena, annars den andra.
Enkla villkorssatser där man bara skall tilldela ett värde till en variabel eller motsvarande så kan man korta den:
if(nåntingärsant) {
varibel = ettvärde; // Körs när villkoret ovan är sant
} else {
varibel = ettannatvärde; // Körs när villkoret ovan inte är sant
}
kan kortas ned till
varibel = (nåntingärsant ? ettvärde : ettannatvärde);
Alltså:
dMsg = (btnStatus?1:0)
Displayrefresh() behöver ju bara köras när det faktiskt skall ändras något på skärmen, annars är det ju onödigt att köra det. cMsg innehåller information om nuvarande meddelande. dMsg innehåller information om det meddelande som faktiskt skall visas. Alltså behöver vi ju endast köra uppdateringen om cMsg inte är samma som dMsg, kan skrivas som villkoret
cMsg != dMsg (cMsg ej lika med dMsg). Då både displayen och minnet är samma nu så anger vi det med
cMsg = dMsg.
F ö, jag är lite såsig i huvet nu, men det kanske är fel i denna sats:
Kod: Markera allt
if (cMsg > 0) { // Meddelande 0 är blankskärm
cMsg = 0;
}
if(cMsg = 1) {
lcd.setCursor(5,0);
lcd.print("Larm!");
lcd.setCursor(3,1);
lcd.print("High level!");
}
Skall nog vara
Kod: Markera allt
if(dMsg > 0) {
lcd.setCursor(5,0);
lcd.print("Larm!");
lcd.setCursor(3,1);
lcd.print("High level!");
}
orvar-e skrev:Och sista raderna ser mest ut som en toggel funktion i mina ögon som kommer att växla btnStatus fram och tillbaka (om man slapp kontakt studs).
Njae, titta igen och försök att följa vad som händer om knappen trycks in resp släpps och vad som händer i olika faser. Vad som händer är att funktionen returnerar true endast om en förändring av knappens status har skett sedan senaste kontrollen. Själva värdet som knappen har returneras dock inte av funktionen utan skrivs direkt till btnStatus-variabeln.
En debouncer skulle kunna fungera så att du ändrar lite på checkButton)=-funktionen, så att den mäter tiden mellan nedtryckning (första villkoret) och uppsläpp (andra villkoret) genom att först lagra tiden när knappen trycktes ned i en uint64_t och sedan subtrahera med tiden när knappen släpptes upp. Om resultatet överstiger ett visst antal millisekunder så kan du returnera true, annars false. Gläm då inte av det omvända om det behövs. Värdet på själva knapptryckningen lagras som vanligt i btnStatus. Titta på funktionen millis() för att hålla koll på tiden.
F ö så tycker jag det är rätt kul att leda folk till lärande. Jag lär mig en del på det också...