Om det är själva det att styra värdet upp och ner är det i grunden enkelt.
Jag antar att Ardunånting har internt EEPROM, däri kan värdet sparas.
Det "svåra" är att avkänna knapptryckningen på ett stabilt sätt (finns ju en låååång tråd om detta) men sedan får man välja: Ska det vara "1 tryck = 1 steg" eller "Auto-repeat".
Om det är ett "stort" område som stegen kan vara inom kan det bli tungt med "1 tryck = 1 steg" och då är autorepeat att föredra - vilket direkt leder till en timer-interrupt som styr avkänningen av knappar, debounce osv.
Sedan kan man göra "auto-save" om man vill. Man laddar då en räknare med ett värde för varje knapptryckning och sedan räknas denna räknare ner ett steg för varje timer-interrupt. Om den då hinner stega ner till noll OCH värdet är ändrat är det bara att aktivera "spara i EEPROM"-rutinen, då är saken biff.
När man har knappat klart går det alltså t.ex. 5 sek efter att man har släppt knappen varefter värdet sparas automatisk.
Vill man ha autorepeat är det inte svårt alls. Jag har kommit fram till att en initial vänt på 0,5 sek och en repeat-rate på 10Hz är lagom för mig. Oftast (alltid?) åstadkommer jag detta vid att ha en timer att ge interrupt med 20Hz eller mer om det behövs av andra saker.
Först debouncer jag med 2 avläsningar som ska vara lika, sedan är det bara att ha en räknare som ställs till 0,5 sek vid släppta knappar. Vid 20 Hz är det alltså 10.
Om man sedan trycker ner t.ex. '+' kommer den att läsas av två gg. innan den accepteras av interruptrutinen.
Denna accept utlöser sedan en "Det är tryckt på +"-flagga som main-loop använder till att avkänna detta.
Sedan aktiveras en bit i YTTERLIGARE en variabel som indikerar för interruptrutinen att den bit redan är reagerat på.
I mitt fall hade jag helt enkelt lagt in '+' i en variabel och main-loop hade då avkänd om den variabel var icke-noll och då reagerat på detta. När den reaktion (t.ex. "Räkna upp antal steg med 1") var klar hade jag nollat variablen, fortfarande i main-loopen.
Under tiden håller man inne '+' och räknaren räknas ner till noll. När noll nås laddas räknaren om med 2 (för 10Hz repeat-rate) och variabeln som används för att markera att knappen redan är "avhandlat" nollad, detta utlöser en ny '+'. Main-loop tar då hand om detta osv.
När man släpper knappen eller håller inne en kombination som är ogiltig återställs räknaren till 0,5 sek värdet och ingen ny knapptryckning matas in i variabeln.
Om vi utgår ifrån att det finns '-', '+' och 'OK' knappar är det ganska enkelt:
Om villkoren med bara en knapp OCH debounce avklarat är det bara att mata in vilket värde i variablen, i main-loop kan man sedan använda en switch() eller liknande:
Kod: Markera allt
switch(Incoming_Key)
{
case '+':
if(Number_Of_Steps < MAX_NUMBER_OF_STEPS) Number_Of_Steps++;
Incoming_Key = 0; // Done with that
break;
case '-':
if(Number_Of_Steps) Number_Of_Steps--;
Incoming_Key = 0; // Done with that
break;
case 'O':
// Same as OK-button
... Save in EEPROM...
Incoming_Key = 0; // Done with that
break;
}