Lägga till funktionalitet till enkel Arduino termometer?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
RealElwood
Inlägg: 19
Blev medlem: 31 januari 2010, 18:53:41
Ort: Trollhättan

Lägga till funktionalitet till enkel Arduino termometer?

Inlägg av RealElwood »

Har precis börjat lära mig programmera för att lösa lite problem hemma med en Arduino Uno.

Första projektet är en fläktstyrning till grillen för att kunna hålla en viss temperatur, i dagsläget så är den enkel, när grillen blir 110 °C så startar en fläkt som stannar när temperaturen är 130 °C. Jag har även en 2-radig LCD som visar aktuell temp.

Jag vill addera detta:
Fler temperaturprober som endast ska visa temperatur ej styra fläkten, detta har jag koll på.

2 knappar för att styra vad displayen visar (hö/vä) så att jag kan skifta mellan proberna.
2 knappar (upp/ner) för att ändra värdet när fläkten startar/stannar. I fallet ovan är måltemperaturen 120 °C, denna ska kunna stegas med 5 °C.

Hur gör man detta, har bara skrivit top-down kod med en if-sats i dagsläget. Behöver man dela upp koden i flera filer med en master som styr informationen?
Finns det någon lämplig guide på detta eller enkel exempelkod så vore jag tacksam.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Lägga till funktionalitet till enkel Arduino termometer?

Inlägg av Icecap »

Din fråga är dels korrekt och dels felaktig. Jag fastnade på ordet "ska". Om vi nu byter ut det med "kan" blir det hela lättare att svara på.

Min lösning hade varit:
* Samla sensor-värden i en array. Då kan man enkelt indexera i dom. Namn här: "Sensors[]".
* Starta en timer-interrupt (~20Hz) för att läsa knapparna. Om det redan finns något liknande (t.ex. regelbundet timer styrd läsning av A/D-omvandlaren) kan man använda den.
* Debounce på knapparna med 2 identiska avläsningar efter varandra innan en knapptryckning accepteras.
* Målvärden (fläktstyrningen) i en array också, samma som ovan med indexeringen. Namn här: "Targets[]".

Detta är basen i det hela.

Väljer man knapp Höger/Vänster har man en variabel ("Index") som man räknar upp/ner. Går den under noll ställer man värdet till högsta index för det givna antal ingångar (4 ingångar = 3 är högsta index), når den antal ingångar ställer man den till noll.

Då kan man enkelt "rulla runt" i ingångarna.

Man kan skriva ut mätvärdet vid att skriva ut Sensors[Index] och målvärdet vid att skriva ut Targets[Index].

Med +/- kan man sedan Öka/minska Targets[Index] i steg om 5°C.

Bakom allt detta finns sedan styrningen. Utskriften till display ska ju bara göras när det sker en ändring (knapptryckning + uppstart).

Men i main-loop lägger man in styrningen. Om vi antar att du har 4 ingångar och 4 utgångar (fastän att du bara använder en enda just nu) gör du bara en for(X = 0; X < 4; X++)-loop som kollar om Sensors[X] > Targets[X]. Är du riktig klurig har du sedan definierat en const-array med bitmönster på portpinnarna och då kan samma loop sätta/nolla de bits som ska styras.

Allt i allt är det i grunden samma sak som nu du gör - men istället för ett värde slår du i några array.
RealElwood
Inlägg: 19
Blev medlem: 31 januari 2010, 18:53:41
Ort: Trollhättan

Re: Lägga till funktionalitet till enkel Arduino termometer?

Inlägg av RealElwood »

Tack ska du ha icecap, du har räddat sänggooglingen för flera veckor framöver.

Ett första delmål blir att enbart kunna öka/minska börvärdet med knapparna tillsammans med en enda prob. Löser jag det så tar jag resten.
Ska försöka att inte leta ett identiskt projekt, då det säkert finns. Ett delmål är ju faktiskt att lära sig något själv från grunden.

Tackar
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Lägga till funktionalitet till enkel Arduino termometer?

Inlägg av Icecap »

Et enkelt tips:
Jag brukar göra en:
if(Display_Update) ... (uppdatera displayen och nolla Display_Update).
När det blir en ändring (knapptryckning/uppstart) är det bara att sätta Display_Update till icke-noll, då blir displayen uppdaterat.

När det hela startas initierar man allt och innan man hoppar in i main-loop sätter man Display_Update till icke-noll, då blir saken biff.
Skriv svar