IMP kock: Internet-Connected BBQ termometer (6 / 7 steg)
Steg 6: En närmare titt på hur det fungerar: styrkod
Låt oss börja med styrkod. Det är kort och enkelt. Den har två jobb: samla temperaturavläsningar och reagera på knapptryckningar.
Ta en titt på funktionsdefinitionen för getTemp().
funktion getTemp() {imp.wakeup (intervall, getTemp);
vtherm_en_l.write(0);
IMP.Sleep(0.01);
lokala rawval = vtherm.read();
lokala temp = (TEMP_COEFF_2*(math.pow(rawval,2))) +(TEMP_COEFF_1*rawval) + TEMP_OFFSET;
Temp = (temp * 1,8) + 32,0;
vtherm_en_l.write(1);
agent.send("Temp",{"Temp":Temp,"vbat":Hardware.Voltage()});
}
Denna funktion samlar temperaturavläsningar med regelbundna mellanrum. Intervallet definieras av en konstant, intervall, högst upp i filen. Den första sak getTemp gör är schema sig att köra igen i intervall sekunder, genom att ringa imp.wakeup (intervall, getTemp). Detta schemalägger en motringning; försöksläkemedlet kan fortsätta att göra andra saker, och i intervall sekunder, operativsystemet kommer att ringa tillbaka och ber oss att köra getTemp igen.
Efter schemaläggning själv köra igen, getTemp läser spänningen i mitten av termistor avdelare och sedan använder en enkel 2: a ordningens kurvanpassning att uppskatta temperaturen. Koefficienterna för den kurvanpassade lagras som konstanter överst i filen (om du ser, du kommer att märka vi faktiskt bara använder en linjär kurvanpassning! Men 2: a ordningens passformen är det om du vill prova).
Nästa, vi har en funktion som talar om försöksläkemedlet vad att göra när det är dags för att sova:
funktion goToSleep() {wake.configure(DIGITAL_IN_WAKEUP);
gå till sleepfor max insomningstid (1 dag minus 5 sekunder)
Server.sleepfor(MAXSLEEP);
}
Denna funktion gör två saker: för det första den konfigurerar Pin1 som en wakeup stift, så att om knappen trycks det vaknar imp från djup sömn. För det andra säger det imp att gå till djup sömn för så länge det är tillåtet (MAXSLEEP definieras som 86396 sekunder överst i filen, detta är 1 dag minus 4 sekunder. Anropet till server.sleepfor() varnar servern att enheten kommer att gå att sova, så att agenten inte behöver vänta på imp till försvinner innan det inser vad som har hänt.
Under dessa finns det en hanterarfunktion för knappen press evenemang :
funktion btnPressed() {
vänta och se om detta är en lång tryckning, och somnar om det är
lokala start = hardware.millis();
medan ((hardware.millis()-start) < LONGPRESS_TIME * 1000) {
om (! hardware.pin1.read()) {återvänder;}
}
goToSleep();
}
Detta är en intressant funktion. Som det visar sig, anropar när du trycker på knappen alls, den integrerade havspolitiken funktionen direkt. Försöksläkemedlet vänta inte flera sekunder för att sova, som du kanske trodde från hur termometern fungerar. I stället imp anropar funktionen omedelbart, och väntar att se om användaren håller knappen i tre sekunder. Om du gör det, går det för att sova. Om du inte lämnar funktionen och går tillbaka till gör vad det gjorde innan.
Därefter ser vi några callbacks registrering för agent händelser:
agent.on ("sova", function(val) {
IMP.ONIDLE(function() {
goToSleep();
});
{}); < br >
agent.on ("needDeviceId", function(val) {
agent.send("deviceId",Hardware.getdeviceid());
});
Den första handtag här kan agenten att tala om enheten för att sova. Medan enheten är igång, hålla den agent håller ett öga på hur mycket temperaturen ändra det är att se och justerar hur lång tid det kommer att låta enheten sig vaken innan du ringer denna händelse och talar om enheten för att somna för att spara batteri.
Den andra handtag används endast vid speciella tillfällen. Agenten vet inte automatiskt enhetens enhets-ID, men det behöver det för att ställa in kanal namnen att skicka data till Xively. Normalt, starta agent och enheten upp tillsammans när agenten startar upp för första gången, efter vilken agenten är tänd. Dock ibland agenten kommer att starta av sig själv, till exempel om du trycker ny kod till den. I detta fall agenten måste ett sätt frågar enheten vad dess enhets-ID är - denna funktion ger det ett sätt att göra detta.
Efter det, vi är klara med definitioner, och vi når den punkt där själva körningen driften startar när enheten startas. Det första den integrerade havspolitiken gör när det startar är att lista ut varför det startas upp. Om det var på grund av en Pin1 wakeup, gör den integrerade havspolitiken samma sak om du håller knappen Skicka den i viloläge - det stannar här och väntar på att se om du håller knappen. Om du släpper innan den 3 andra vänta tid, kommer den integrerade havspolitiken gå direkt tillbaka till sova innan det ens ansluter till internet.
Kontrollera wakereason och göra detta till en ytlig vakna vid behov
om ((hardware.wakereason() == WAKEREASON_PIN1) || (Hardware.wakereason() == WAKEREASON_TIMER)) {
lokala start = hardware.millis();
medan ((hardware.millis()-start) < LONGPRESS_TIME * 1000) {
om (! hardware.pin1.read()) {goToSleep();}
}
om vi gjorde det här, har någon bara långa pressade strömbrytaren för att vakna om försöksläkemedlet
gå vidare och starta rätt upp.
}
inte en ytlig vakna; brand upp radion och låt oss lagar en kalkon
IMP.setpowersave(true); Spara saften, eftersom detta program inte är latens-kritiska
Slutligen instansierar vi objekten vi måste göra vårt jobb och kolla in med agenten, sedan börja läsa temperaturen att komma igång.
agent.send("justwokeup",Hardware.getdeviceid());
getTemp()
Låt oss ta en titt på agent koden i nästa steg, om du är intresserad.