Arduino Nano Oven-controller
Zoals al gemeld op mijn algemene Arduino-pagina, mijn regelaar voor mijn keramiek-oven mocht wel eens een update gebruiken. Het was een schakeling met discrete logica en een draaiknop voor het energieniveau. In plaats daarvan is het nu meer als in mijn plaatje hiernaast, met een 4-cijferig display voor temperatuur (tot 1250 graden) en wat drukknopjes voor de invoer. De Arduino Nano zorgt voor de tijd, programma-stap en zo voort. Op die manier hoef ik de oven niet meer zelf in de gaten te houden, maar neemt de Nano het stappenplan (zoals in de grafiek onderaan de pagina over de oude controller) over. Dat was het idee; nu de uitvoering... De eerste stap is het opzetten van voorlopige hardware om de software te kunnen maken. Een prototype-bordje, plus het display, een bordje met knopjes dat ik nog had liggen, en een LED in plaats van de uiteindelijke SSR (Solid State Relais) zodat ik kan zien wanneer en hoe hard de oven aan gaat staat. Dit is nog een versie zonder temperatuurmeting: eigenlijk de oude regeling maar dan met een automatisch afspelende programma's voor verschillende temperatuur-profielen. Zo moet de eerste keer bakken altijd heel geleidelijk gaan, de tweede bak met glazuur mag sneller (zie de oven-pagina). De opbouw
Display (€3 bij dx.com) is blijkbaar toch niet echt I2C-compatible... Dus toch maar op twee andere pinnen aansluiten. Gelukkig heeft 'avishorp' al een goede Arduino library voor de TM1637 geschreven: werkt in een keer, en in de zip download zit ook de English datasheet (niet alleen de Chinese versie)! Dankzij het 'character designer' spreadsheet van JosePino kan ik ook tekst makkelijk weergeven, niet alleen getallen. Knopjes uitlezen is makkelijker, zitten direct op de I/O pinnen. Waar je wel op moet letten is de 'contact-dender'; schakelaars en drukknoppen kunnen met indrukken een paar keer 'stuiteren' en dus in korte termijn meerdere pulsjes geven. Ik los dit op door ze meerdere keren te lezen (met een kleine pauze er tussen), en pas een signaal te geven als de waarde stabiel is.
Voor de veiligheid heb ik ook de watchdog-timer gebruikt: als de processor crasht (niet vanwege een softwarefout, maar door bijvoorbeeld spanningspieken tijdens het schakelen) schakelt de oven automatisch na twee seconden uit... Safety first! Het geheel is vrij compact (eigenlijk alleen een nieuw frontje met 2 cm elektronica er achter, het prototype bordje zelf is uiteraard niet ingebouwd), en ik heb het weer in mijn oude kastje terug kunnen plaatsen, de voeding en het SSR is hergebruikt. Moest wel een nieuw frontje maken uit een stukje plexiglas dat ik nog had. De 50 Hz timingDe 50Hz op // Externe interrupt op de INT0PIN met de 50Hz: de routine
verhoogt 'clkToProcess' In de interrupt routine zelf gebeurt overigens meer dan alleen het ophogen van de teller (hier niet weergegeven), zo worden ook de toetsen hier gelezen en verwerkt, en wordt het Solid State Relais aan- en uit-gezet. Maar in een interrupt-routine wil je in het algemeen zo min mogelijk doen, al is het hier bij de oven niet kritisch. Het 'grove' werk heb ik daarom nooit in de interrupt-routine, maar gewoon in het hoofdprogramma zitten. De interrrupt-routine wordt elke 20 milliseconde (50 Hz) aangeroepen. Ik deel dat door 5 (met
behulp van de volatile uint8_t clkTicks = 0; Voorbeeld stook-curve (950 °C) Eenvoudige setup: tijdreeksenDe eerste versie is heel eenvoudig: enkele van-te-voren ingeprogrammeerde reeksen zoals ik die eerst handmatig doorliep (zie ook de oven-pagina). Heb er nu 5 in zitten:
Hiervoor heb ik twee arrays, een met de lengte van de huidige periode (in kwartieren) en een met
de energie-waardes voor die huidige periode (0..16). Mogelijkheden genoeg om preciesere curves te
maken, maar op het moment schakel ik per uur (schakeltijden dus altijd een viervoud, in de grafiek
hiernaast dus Gebruikers-interactieDe zaak draait met een state-machine, waarbij iedere state bepaalde acties kent. Er zijn in totaal 6 states zoals in de tabel weergegeven. Het display is maar 4 tekens, en dus beperkt... Bij menu-keuze is het de huidige keuze of instelling; in de run-modes wisselt de programma- of energie-waarde af met de verstreken tijd en de naam van het huidige programma (de eind-temperatuur).
Nog niet in het schema: ik heb een piezo-speakertje aangesloten op pin 17 (A3), zodat het
systeem ook piepjes kan geven met de Simpel, maar als eerste stap voldoende. Wel misschien de up/down in programma-run mode nog verbeteren, verandert nu de energieniveau alleen tot aan de volgende programmastap, wordst daarna weer uit de programmatabel geladen. Moet iets slimmers mee kunnen (denk energieniveau op/neer, om de hele curve op en neer te verschuiven gedurende het gehele programma?). Veiligheid eerst!Een aantal veiligheidsmaatregelen, bij zowel een oven als deze stromen bij 220 Volt moet je de veiligheid in de gaten houden:
En dan...De volgende grote stap wordt (denk ik) het aansluiten van mijn thermo-koppel. Ik kan hier natuurlijk zelf een versterkertje voor maken (thermokoppel-signalen zijn te zwak om gelijk op de Arduino aan te sluiten, 41 µV per °C), maar ik denk dat ik maar ga voor de kant-en-klare Adafruit module met de MAX31856. Zit een voorversterker in, maar ook linearisatie, 50-Hertz filtering, koude-las compensatie, A/D converter en alles wat er voor een thermokoppel nodig is. Aansluiting via SPI. Ook in Nederland in diverse webshops verkrijgbaar, voor zo'n €20. Nuttige Libraries etc
|
op mijn site |