Als je nooit iets programmeerde zal je hier niet veel aan hebben.
Er hoort natuurlijk een aardig stukje software bij. Voor het besturen van het scherm en het lezen van de sensoren zijn er libraries die gelukkig het werk een heel stuk vergemakkelijken.
Het zou niet zo fijn zijn als je elk beeldpuntje van het scherm moest aan- of uitschakelen. Daarvoor is er voor elk type display wel ergens online een library te vinden die commando's aanbiedt zoals je dat gewend bent in Windows. Dus met tekstcommando's, lettertypes, groottes en eenvoudige functies om lijnen en blokken te tekenen.
Zo heb ik bijvoorbeeld het tekentje van de batterij getekend, alsook de onderste balk die aangeeft op welke uren van de dag de verwarming moet aanslaan. Het tekenen en tekst tonen ziet er zo uit:
// toon temp in groot font
u8g.setFont(u8g_font_helvR18);
u8g.setPrintPos(15, 43);
u8g.print(float(temperatuur) / 10, 1);
// teken de batterij
u8g.drawFrame(117,0,10,6);
u8g.drawFrame(127,2,1,2);
u8g.drawBox(119,2,3,2);
Dat stelt op zich dus niet zo veel voor. De code om mijn eigen brouwsel aan te sturen met het toetsenbord ziet er heel wat vreemder uit:
int keyboard[] = {1040,1140,1296,1400,1904,2000,2144,2240,2648,2740,2876,2968};
int temp=0;
temp = meting();
if (temp < 5000){
int onder = temp - 30;
int boven = temp + 30;
temp = -1;
for (int i=0; i <= 11; i++){
if ((onder < keyboard[i]) and (boven > keyboard[i]))
{temp = i;};
}
}
else
temp = -1;
return temp;
}
Het eerste wat een beetje vreemd lijkt is wellicht de lijst met getallen in het begin van de code. Het principe is nochtans eenvoudig.
Ik heb deze lijst opgesteld door te meten hoe lang het duurt om de condensator op te laden bij elke toets die je indrukt. De getallen zijn tijden in microseconden. Het programma zal nu met een vast interval de condensator opladen en weer ontladen. De tijd die daarvoor nodig is, wordt opgemeten. Stel nu dat het ongeveer 1040 microseconden duurt, dan weet het programma dat toets "1" was ingedrukt. Duurt het rond de 1140 microseconden, was toets "2" actief, enzoverder. Er is een marge van +/- 30 microseconden, want het blijft natuurlijk analoge electronica ;-)
Als er geen toets was ingedrukt, zal het best lang duren voor hij is opgeladen. Hoewel, in het echte leven zijn 26000 microseconden toch nog redelijk snel voorbij. Daar zorgt de extra (8ste) weerstand voor, die is veel groter dan de anderen.
Voor de rest is het belangrijkste deel van de software het berekenen van de juiste stand van de motor. Die zal afhangen van de temperatuur in de kamer en de gewenste temeratuur van de radiator. Dat is een groot stuk code en een beetje te saai om hier neer te schrijven.
Het leuke stuk is zeker het sturen van een stappenmotor. Dat was ook allemaal nieuw voor mij. Maar het principe is zeer eenvoudig.
Deze figuur toont het schema van een bipolaire stappenmotor. Dat is een economisch voordelige constructie omdat de spoelen worden omgepoold. Je bestuurt zo'n motor in 4 stappen: de spoelen worden één na één actief, en worden elk ook omgepoold. Voor dit soort motor heb je wel een meer complexe (lees: duurdere) besturing nodig omdat het ompolen van de spoelen meer electronica vraagt.
Maar eens je dit motorshield van Arduino in huis hebt, is de rest kinderspel. Aan de linkerkant vertrekken de vier draden naar de motor. Die draden worden één na één onder spanning geplaatst door mijn software in de Arduino. De volgorde van die activering bepaalt de draairichting van de motor. De tijd die je tussen de activering laat, bepaalt de snelheid. The tricky part was zeker om de snelheid optimaal te maken. De motor moet zo snel mogelijk draaien, met de belasting van de radiatorkraan, zonder dat hij stappen overslaat. Er is immers geen feedback van de positie van de motor, dus als je een aantal stappen zet, moet je zeker de tijd geven aan de motor om ze ook echt uit te voeren.
Geen opmerkingen:
Een reactie posten