Låg kostnad och korrekt inkubator för DIY biologi (4 / 8 steg)
Steg 4: Arduino koden
I nästa steg diskuterar vi hur du kan styra denna krets med Arduino koden. Du kan enkelt ladda ner och köra vår kod. Resten av detta steg går in i de blodiga detaljerna i hur koden fungerar. Observera att vissa delar av vår kod är baserade på Arduino's AC fas styrning handledning och vi återanvändas någon del av den kod som det är.
Arduino UNO styrelsen innehåller en ATmega328P 16MHz mikroprocessor. För att utlösa AC fas styrkretsen på just tidsinställda intervaller vi utnyttjade hårdvara timer avbryta funktioner ATmega328. Så om du inte är bekant med begrepp som timers, registret svämmar över och prescaling, den här artikeln förklarar dem bättre.
Innan vi går in kodning vi måste göra vissa grundläggande beräkningar. AC signalen är 60 Hz. (oroa dig inte om du har 50Hz i ditt land, kan du åter beräkna det enkelt) det betyder AC signalen korsar noll, når topp positiv spänning, korsar noll igen, når topp negativa spänning och återgår till noll 60 gånger per sekund. Perioden (lång tid detta tar) är 1/60 eller 0.01667 sekunder (16.67 millisekunder). Således, en halv cykel eller tiden mellan noll-korsning pulserna uppstår i 8,33 millisekunder.
Härifrån och framåt kommer vi bestämma tidsintervall i koden från klocka räknas, inte av sekunder. Går Arduino klockan 16 MHz, vilket är 16,000,000 cyklar per understöder: en klockcykel tar 0.0625 mikrosekunder. En enda hälften cykel 60 Hz AC signalen innehåller 133,333 klockcykler. Den 16-bitars tidtagare (timer1) av Arduino Uno kan bara räkna till 65535. Så behöver vi konfigurera som med en prescaler. I den här koden använde vi en 256 prescaler. Med 256 prescaler innebär hälften en cykel ca 520 timer steg. Av praktiska skäl (smärre förändringar i utbudet frekvens och triac operativa förseningar) ansåg vi det som 450. Detta försäkrar att triac föraren har tid att stänga av innan den närmaste halva cykeln. Så kontrollerade vi väntetiden innan du slår på triac inom intervallet 1-450 inuti varje halv cykel till kontroll effekten. Vi använde komparator match avbrott för detta. Vi använde timer overflow avbryter du styra signalen till triac gate och puls bredd 4 timer räknas. Här, når när pulsen skickas till utfärda utegångsförbud för av triac, det startar växelspänning och kommer att förbli ON även efter pulsen tas bort tills nästa gång AC vågen noll. (Om du inte är bekant med Triac's operation Detta är en bra artikel.) På grund av detta behöver vi inte oroa om avstängning av en triac.
Följande kodutdrag visar den AC fasen kontrollera logik.
#define identifiera 2 / /noll cross upptäcka
#define GATE 9 / /triac gate
#define puls 4 / /utlösa pulse bredd (räknas)
Ställ in Timer1(16-bit)
OCR1A = 100; initiera motsvarigheten
TIMSK1 = 0X03; Aktivera komparator A och overflow avbryter
TCCR1A = 0X00; timer kontrollregistren för
TCCR1B = 0X00; normal drift, timer inaktiverad
Ställ in noll korsning avbrott
attachInterrupt (0, zeroCrossingInterrupt, RISING);
noll cross upptäckt
void zeroCrossingInterrupt() {
TCCR1B = 0X04; starta timer med division med 256 ingång
TCNT1 = 0; Reset timer - räkna från noll - räknas tills det motsvarar värdet som komparator
}
jämförelseperson match - nått förväntade förseningen
ISR(TIMER1_COMPA_vect) {
digitalWrite(GATE,HIGH); Ställ triac gate till hög - slå på leverans
TCNT1 = 65536-PULS; trigger bredd för synkpuls
}
timer1 overflow - puls nådde dess bredd
ISR(TIMER1_OVF_vect) {
digitalWrite(GATE,LOW); stänga av triac gate
TCCR1B = 0X00; inaktivera timern för att stoppa oönskade utlösare
}
Kontroll av temperatur
Vi är nu klar med den svåraste delen av vår kod. Nästa är att kontrollera kraft (eller fördröjningstiden) enligt nuvarande temperatur värdet och önskat mål temperatur. För att läsa värdet temperatur använde vi i Adafruit_MAX31855 bibliotek. För att genomföra kontrollmekanismen använde vi PID styrlogik. Oroa dig inte om det låter lite komplicerat. Lyckligtvis har vi en Arduino bibliotek för detta. Följande utdrag visar koden för detta.
#define 3
#define CS 4
#define CLK 5
Adafruit_MAX31855 termoelement (CLK, CS, DO);
dubbel setPoint, ingång, utgång; Definiera variabler vi kommer att ansluta till
dubbel Kp = 2, Ki = 6, Kd = 1; Ange länkar och inledande trim parametrar
PID myPID (Input, Output, & setPoint, Kp, Ki, Kd, direkt);
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits (0, 449); Ange de
inuti loop-metoden
dubbla c = thermocouple.readCelsius();
om (isnan(c)) {
Jag = 450; Gå till minsta makt om något gick fel
}
annat {
Input = c; myPID.Compute();
Jag = 450-produktion; sänka förseningen, högre makt
}
OCR1A = i. värdet för motsvarigheten till jag
Delay(400); / / vänta innan nästa temperaturen läsa
Användargränssnitt
För att programmera användargränssnitt används vi olimex lcd sköld bibliotek med Arduino tråd bibliotek. Du kan Hämta olimex biblioteket från Olimex hemsida.