Sida 1 av 3
Arduino programmeringshjälp
Postat: 8 augusti 2012, 11:17:29
av lillmange
Hej,
Jag håller på med ett arduinoprojekt.
Det mesta fungerar nu som jag vill men när jag klickar på en knapp som ska få programmet att gå in i en meny så hoppar den in flera steg istället för ett, precis som om jag har klickat flera gånger på knappen.
Min fråga är:
Är det något fel på den här debounce koden som jag "stulit"

på arduino forum som kan göra att det blir så här?
Jag är väldigt tacksam om någon vill ta sig tid och kolla på koden/hjälpa mig med detta.
/Magnus
Kod: Markera allt
//Läs av och debounce'a knappen
int reading = digitalRead(buttonPin); // read the state of the switch into a local variable:
// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
if (reading != lastButtonState) { // If the switch changed, due to noise or pressing:
lastDebounceTime = millis(); // reset the debouncing timer
}
if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer than the debounce delay, so take it as the actual current state
ButtonState = reading;
}
lastButtonState = reading; // save the reading. Next time through the loop,it'll be the lastButtonState:
//Debounce Klar
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 11:22:53
av ToPNoTCH
Lite yrvaken nu men borde inte raden
Kod: Markera allt
lastButtonState = reading; // save the reading. Next time through the loop,it'll be the lastButtonState:
flyttas upp över sista
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 12:27:12
av Krille Krokodil
Nä, koden är rätt, lastButtonState ska uppdateras varje varv.
Vad har du satt för värde på debounceDelay? Gör en test med att höja det till något stort, 1000 tex.
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 12:32:01
av Klas-Kenny
Det är inte så att koden inte väntar på att knappen ska ändra läge igen, så den kör bara vidare i koden och tycker då att knappen är nedtryckt (vilket den ju är...) ?
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 12:49:34
av Icecap
Ett mysko sätt att lösa det på men OK: utan delay-looper och det ska hedras.
ButtonState följer knapptryckningen, håller man alltså inne knappen är den aktiv lika lång tid. Vill du ha en "bara en aktivering per tryck) måste du ta ytterligare ett steg i din meny.kod:
Kod: Markera allt
if(ButtonState != Previous_ButtonState)
{
Previous_ButtonState = ButtonState;
if(Previous_ButtonState)
{
// Do the woodoo that You do so well = här kommer det bara en knapptryckning för varje tryck
}
}
Det finns mer eleganta lösningar men i grunden är det problemet med att knycka kod man inte förstår eller rättare: att inte försöka förstå koden man har knyckt.
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 12:50:25
av Krille Krokodil
Jo, det är precis det som är meningen med konstruktionen, att man skall kunna ha andra tidskritiska funktioner i huvudloopen som inte får stå och vänta varje gång en knapp ändrar tillstånd.
Programmeraren får ju se till att funktionen som knappen är knuten till bara anropas 1 gång eller x Hz varje gång ButtonState är 1.
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 14:25:47
av lillmange
Krille Krokodil
Tror det är det som jag inte har lyckats med... Ska testa att ställa tillbaks buttonstate till 0 efter ett menyval och se om det hjälper.
Tack.
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 14:28:42
av Icecap
Men snälla... läs gärna mitt inlägg!
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 14:32:26
av Krille Krokodil
Du kan inte lösa det med att ändra ButtonState för den ändras tillbaka av debouncern varje varv, använd Icecaps kod.
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 14:51:29
av lillmange
Icecap skrev:Men snälla... läs gärna mitt inlägg!
Ska absolut kolla på det när jag sitter vid datorn... Läste bara snabbt i telefonen och då kändes mitt svar som den enkla vägen.
/Magnus
Re: Arduino progrsmmeringshjälp
Postat: 8 augusti 2012, 15:02:17
av Krille Krokodil
Här är en annan variant som dessutom ger menybläddring i 5 Hz om knappen hålls inne längre än 2 s.
Kod: Markera allt
if(ButtonState){
if((millis() - LastDebounceTime) > (FirstDelay + SecondDelay)){
FirstDelay = 1800;
SecondDelay =+ 200;
StegaMeny();
}
}
else {
FirstDelay = 0;
SecondDelay = 0;
}
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 09:41:43
av lillmange
Hej, nu har dottern somnat för sina 2h förmiddags sömn så nu har man en liten stund till detta.
Ska prova med koden icecap skrev men jag undrar en sak.
Vad menas med koden: if(ButtonState)?
Jag brukar själv skriva tex: if(ButtonState == 1) men if(ButtonState) kollar väl bara om det finns ett värde eller hur fungerar det?
Och om den bara kollar om det finns ett värde, räknas då LOW som värde eller är LOW i detta sammanhang samma som 0 (noll)?
/Magnus
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 09:59:15
av Icecap
I C är 0 (noll) falskt, allt annat är sant. Att skriva if(xxx == 1) betyder att om xxx är 2 är den inte uppfyllt, alltså är det mycket dålig praxis!
Skriver man då if(xxx > 0) är det alldeles OK men if(xxx) betyder "om(xxx är annat än just noll)".
Om xxx är en byte är det bara 0x00 som tolkas som falskt, alla 255 andra värden är sanna och ändå skriver du "if(xxx == 1)"? Ser du problemet? Det finns alltså rejält sett 99,2% chans för att xxx INTE är 0 eller 1 (falsk/sant) fastän du egentligen menar if(xxx == true), alla värden mellan 2 och 255 ses ju som falska eller "icke == 1" om du vill.
Vid att använda if(xxx) är det enbart om den är sann som if-satsen uppfyllas, oavsett om xxx är 1, 2, ... 255.
Och javisst, det finns ju bara en enda noll så där är sannolikheten låg också men ändå ser jag det som mer sannolikt rätt att använda det på detta sätt.
Det medför en del andra saker som kan vara till nytta: Om en resurs behövs och man behöver en avkänning av om den är ledig eller inte kan man ha en räknare som dom som efterfrågar resursen bara kan addera på (xxx++) när resursen krävs och subtrahera ifrån när resursen släpps (xxx--), då kan alla "lagren" räknas och när den når noll är resursen ledig.
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 10:00:09
av Bosen
För att
if(ButtonState) skall funka så måste
ButonState vara satt till datatypen
boolean.
I detta fallet, när man skall läsa av sant eller falskt så är
boolean helt rätt.
Läs mera här:
http://arduino.cc/en/Reference/BooleanVariables
EDIT:
Icecap kan faktiskt ha rätt i att 0 alltid är falskt, jag har aldrig tänkt så långt....
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 10:21:28
av lillmange
OK, tack för utläggningen, då var det som jag trodde.
en annan fråga till samma projekt:
Hur spar jag ett negativt värde, tex -1 till counter?
Vart är det fel i koden nedan?
Tack!
/Magnus