Arduino programmeringshjälp

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Arduino programmeringshjälp

Inlägg 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" :oops: 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
ToPNoTCH
Inlägg: 5152
Blev medlem: 21 december 2009, 17:59:48

Re: Arduino progrsmmeringshjälp

Inlägg 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
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Arduino progrsmmeringshjälp

Inlägg 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.
Användarvisningsbild
Klas-Kenny
Inlägg: 11843
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino progrsmmeringshjälp

Inlägg 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...) ?
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino progrsmmeringshjälp

Inlägg 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.
Senast redigerad av Icecap 8 augusti 2012, 12:51:27, redigerad totalt 1 gång.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Arduino progrsmmeringshjälp

Inlägg 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.
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino progrsmmeringshjälp

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino progrsmmeringshjälp

Inlägg av Icecap »

Men snälla... läs gärna mitt inlägg!
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Arduino progrsmmeringshjälp

Inlägg 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.
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino progrsmmeringshjälp

Inlägg 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
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Arduino progrsmmeringshjälp

Inlägg 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;
}
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino programmeringshjälp

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino programmeringshjälp

Inlägg 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.
Senast redigerad av Icecap 9 augusti 2012, 10:05:55, redigerad totalt 1 gång.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Arduino programmeringshjälp

Inlägg 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....
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino programmeringshjälp

Inlägg 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?

Kod: Markera allt

    if (counter <  0){
      counter = -1;
    }
Tack!

/Magnus
Skriv svar