IMP kock: Internet-Connected BBQ termometer (7 / 7 steg)

Steg 7: En närmare titt på hur det fungerar: Agent nummer



Agent firmware är mycket längre, men som du ser på en sekund, det är eftersom det innehåller två stora bitar av kod som göra mer allmänna jobb.

Det första agenten gör när det startar upp är att kontrollera och se om det är precis startat och redan vet enhets-ID. När agenten måste gå och få enhets-ID från enheten, sparas det i imp molnet med server.save() så fort det blir uppdateringen. Detta sätt om agenten startar någonsin om, kan det ta ID direkt utan att ens behöva kontrollera med enheten genom att ringa server.load():

Enhets-ID används för att skapa nya kanaler i detta foder för varje ny config Turkiet sonden < br > <-server.load();
om (! (" myDeviceId"i config)) {
ta pre-bevarat enhets-ID från servern om det finns
om det inte är, vi har aldrig sett denna enhet innan (eller servern glömde - osannolikt!)
Vi kommer att begära en enhets-ID från enheten om vi göra det förbi klassdeklarationer utan
enheten gör en "Jag bara vaknade upp" incheckning.
config.myDeviceId < - null.
} < br >

Nedanför detta kör vi till en jätte funktion med en mycket stor flerradig sträng i det. Denna funktion kallas prepWebpage, och allt det gör är att sammanfoga några strängar tillsammans. Dessa strängar bara så råkar vara en webbplats. Denna webbplats är web UI för BBQ termometern, och det är vad du ser när du begär agentURL i en webbläsare. Eftersom då han har förmågan att ställa in sina egna HTTP-hanteraren, svara det på vissa önskemål genom att servera upp denna mycket lång sträng - i grund och botten agenten fungerar som en liten webbserver. Webbplatsen innehåller även några enkla javascript som körs på klientdatorn.

Efter webbplatsen har då han en funktion som håller reda på aktivitet på enheten och använder en timer och några enkla heuristik för att räkna ut om enheten ska gå för att sova för att spara batteri.

funktion checkSleepTimer() {imp.wakeup (TIMER_DEC_INTERVAL, checkSleepTimer);
Insomningstimern-= TIMER_DEC_INTERVAL;
om (insomningstimern < 0) {insomningstimern = 0};
Server.log ("Sleep Timer =" + insomningstimern);
om ((sleepTimer == 0) & & device.isconnected()) {
om (lastTemp < MAX_AUTOSLEEP_TEMP) {
TODO: om app är öppna, inte sova
Device.send("Sleep",0);
}
}
}

Detta fungerar mycket lik hälla sand i toppen av ett timglas. Om temperaturen förändras snabbt, agenten lägger till mer sand till toppen av timglaset, ger enheten mer tid för att arbeta. Om temperaturen förändringstakten saktar, agenten slutar lägga sand, timglaset rinner så småningom ut och agenten berättar enheten för att somna. Om temperaturen är över en viss tröskel, förutsätter agenten enheten är fortfarande involverad i matlagning något, och väntar på att temperaturen att sjunka igen innan du skickar den sömn ordningen.

Efter detta finns det en stor bit av koden till att arbeta med Xively. Detta är en generisk klass, och du kan lära dig mer om det, liksom andra klasser för att arbeta med andra webbtjänster, genom att ta en titt på elektriska imp webservices github sida.

Nästa, vi ser den agent som registrerar vissa händelsehanterare för händelserna från enheten, precis som vi såg i styrkod som tidigare. Mest intressant här är "temp" händelsehanteraren, som gör allt det behöver göra för att skicka nya temperaturdata till Xively och uppdatera insomningstimern:

Device.on ("temp", function(data) {lokala delta = math.abs (data.temp - lastTemp);
lastTemp = data.temp;
om (delta > MIN_CHANGE) {
bara lägga tid till timer om vi har aktivitet
om (delta > 30) {
Insomningstimern += 60.
} annat {
Insomningstimern += delta * 2;
}
}
Låt inte insomningstimern överstiga förinställda max.
om (insomningstimern > MAX_SLEEP_TIMER) {insomningstimern = MAX_SLEEP_TIMER};

lokala tempStr = format("%.1f",data.temp);
Server.log ("Temp:" + tempStr + "F");

Bokför datapoint på Xively feed
postToXively (tempStr, "temperatur");

Kontrollera om låg batterinivå frågor
Server.log ("batteri:" + data.vbat+ "V");
om (! lowBattAlarm & & (data.vbat < LOW_BATT_THRESH)) {
alarmet låg batt och skicka den till xively
Server.log ("låg batterivarning!");
lowBattAlarm = 1;
postToXively (lowBattAlarm, "lowbatt")
} else om (lowBattAlarm & & (data.vbat > LOW_BATT_THRESH)) {
Rensa låg batt larmet och skicka den till xively
lowBattAlarm = 0;
postToXively (lowBattAlarm, "lowbatt")
Server.log ("låg batterivarning rensas.");
}
});

På grund av hur denna enhet är trådbunden upp, kommer inte det faktiskt någonsin Visa låg batterinivå alarmet; Detta var för en liknande enhet som drivs av ett par AA-litiumbatterier utan en regulator mellan batterierna och den integrerade havspolitiken, så den integrerade havspolitiken kunde titta på batterispänningen direkt. Koden var kvar i ifall någon blir intrepid och bygger en inuti den ursprungliga bostad!

Nära botten av agent firmware, ser vi en av de viktigaste delarna av agent: HTTP-begäran hanteraren. Denna handler tolkar inkommande HTTP-begäranden och definierar hur agenten ska svara.

http.OnRequest (funktion (begäran, res) {< br > server.log ("Agent fick ny HTTP-begäran");
Vi måste ställa in headers och besvara tomma som de är oftast preflight-kontroller
Res.header ("Access-kontroll-tillåta-ursprung", "*");
Res.header ("Access-kontroll-tillåta-Headers","ursprung, X-efterfrågades-med, innehållstyp, acceptera");
Res.header ("Access-kontroll-tillåta-metoder", "POST, få, alternativ");

om (request.path == "/ sova" || request.path == "/ sömn /") {
Device.send("Sleep",0);
Res.send (200, "gå till sömn");
} annat {
Server.log ("Agent fick okänd begäran");
Res.send (200, webbsida);
}
});

De flesta av förfrågningarna till agenten kommer att vara bara önska på webbsidan, så att begäranden utan ytterligare parametrar får bara webbsidan som ett svar. Det finns också en "krok" här för externa tjänster att berätta för den integrerade havspolitiken för att sova, som webbsidan inte använder.

Slutligen begär agenten instansierar ett Xively klient-objekt som används under körning för att anslå data på den Xively strömmen, enhets-ID om det behövs, och börjar köra insomningstimern:

Server.log ("Turkiet sonden Agent igång.");
initiera vår Xively kund
xivelyClient <-Xively.Client(XIVELY_API_KEY);

i de fall vi har bara startas om agenten, men inte enheten, kalla enheten för
enhets-ID 1 sekund om det inte pinga oss med ett "Jag bara startat" meddelande
IMP.wakeup (1, function() {
om (config.myDeviceId == null) {device.send("needDeviceId",0);} annat {prepWebpage();};
});

börja köra auto-insomningstimern vakthund
checkSleepTimer();

Och det är allt det finns det!

Bra lycka och bon appetit :)

Se Steg
Relaterade Ämnen

Öka antalet trådlösa BBQ termometer (rev 2)

detta Instructable kommer att beskriva en mycket enkel process för att öka utbudet av en trådlös termometer för BBQ.Medan processen bör vara densamma för nästan alla RF termometrar, är den specifika modellen jag hacking en "ensamvarg RediChek Remote...

IMUPPHÖJT - (elektriska Imp drivs) Internet ansluten växelströmsuttag

Detta Instructable visar hur man koppla en PowerSwitch svans II och en Elektrisk Imp och bygga en enkel webbsida för att kontrollera det!PowerSwitch kan du växla växelström med en opto-isolerade styrkretsen. Detta innebär att trådarna du ansluter til...

Skapa din egen smart ljus med hjälp av elektriska Imp

Skapa din egen smart ljus med hjälp av elektriska Imp. Lär dig att kontrollera och övervaka dina lampor från mobil, Tablet PC och skrivbordet i 15 minuter. $44 i hårdvara. Posten nivå.Steg 1: hårdvaraFör att slutföra denna tutorial behöver du följand...

Styrenhet: En internet-ansluten ratten för att styra... något!

Efter att sätta ihop ett halvdussin eller så elektriska Imp projekt, det slog mig att bara för den integrerade havspolitiken är kraftfull nog att hantera komplicerade uppgifter inte betyder att att göra en enkel sak Internetanslutning är mindre kraft...

Elektriska Imp Garage dörröppnare

Jag har tappat räkningen på hur många gånger har vi iväg på en resa bara för att vända tillbaka för att se om vi mindes att stänga garageporten. Detta "vänners kompatibla visar dig hur du ansluter den elektriska Imp till ditt garage dörröppnare, hur...

Att göra en vertikal rökare och Grill

I en tidigare Instructable gjort jag en rökare från en gammal expansionskärlet. Det kom ut awesome, så jag tänkte jag skulle prova att göra en större rökare men kan fungera som en grill, inspirerad av japansk Kamado spisar ("ägg" ser bbqs). Om d...

En billig IoT möjliggörare med ESP8266

En viktig del av eller snarare själva konceptet, Sakernas Internet, handlar om hur man ansluta olika enheter till nätverket så att de kan både skicka data och ta emot kommandon. Olika tekniker att ta itu med den sista mil connectivity, som bluetooth,...

IoT Critter Trap

I detta Instructable ska jag visa dig hur man bygger en "Sakernas Internet" (IoT) levande djur trap.Levande djur fällor är trevligt om du har skadedjur att befria ditt hem av men du inte vill göra det genom ett medel för att döda djuret.Probleme...

Personliga intranätet (del 2).

i del två kommer vi att få in i virtuella privata nätverk, dnsmasq och andra media-servrar.VPN.Mediatomb.IRC.Se också:Du kanske också gillar:Uppdatering: lagt till trådlösa alternativ.Steg 1: Byta ut router 1 för en dator och installera dnsmasq. Efte...

Kontroll An Arduino med telefonen

Hej alla! I detta instructible jag kommer att visa dig hur man styr och läsa sensorer med arduino och blynk. Blynk är en app som ger full kontroll över arduino, rasberry pi och spark kärna. Med din smartphone! Och det är lika enkelt som att lägga upp...

PS3 på uppringd

i thisinstructable kommer jag visa dig hur du kör en ps3 på uppringd internet.För att göra detta behöver du:1: en dator med en Lan och uppringda Adapter2: Windows XP eller senare3: en Ethernet-Router4: 2 Ethernetkabeln (endast en behövs om routern st...

Blynk + JavaScript på 20 minuter [Raspberry Pi, Edison, Espruino...]

Någonsin velat styra "nåt" från din smartphone?Nu är det verkligen lätt. Blynk är en universalfjärrkontroll som kan också Visa och plotta data (och fungerar över internet). Det gör prototyper Sakernas Internet applikationer så lätt, att många mä...

Anslutna Mousetrap drivs av Afero

Vad är Afero och vad gör de? Afero bygger inbyggda maskinvara, programvara och molntjänster för Sakernas Internet connectivity. Deras nyckelfärdiga, säker kommunikation stack är för framsynt företagare och företag som vill få bättre produkter och tjä...

Google spela store och YouTube ingen anslutning fix 2015 androd

detta är den garanterade att arbeta lösning för frågan där både Google spela store och YouTube visar ingen anslutningsfel även om du har en fin internet.connection. Credits.to:ZimmerSid Jr.Steg 1: Hämta ROOT explorer apk - säker länk1: först gå till...

Hur man gör Dahlia kronblad örhängen

Hej alla,Ett tag tillbaka visade vi dig hur man gör en dahlia brosch. Nu vill vi visa dig hur du kan göra matchande örhängen. Material du behöver är: Nespresso kapslar, vi använde lila en (Arpeggio), en cirkel punch (vi använde varumärket Heyda,) örh...

IoT vägguttag med Arduino och ESP8266

I detta instructable, jag visa dig hur du lägger till förbättrad tillgänglighet, intelligens och anslutning till ett vanligt vägguttag. Detta görs med en kombination av mikrokontroller, Arduino, olika sensorer, ESP8266 och en blandning av programvaru...

Hoe Maak Je Een startbar USB-minne

Iedereen ögla er wel eens tegen aan dat je dator är gecrasht en dat je Windows opnieuw moet installeren. het probleem wat je tegenwoordig veel ziet är dat je dator geen CD-enheten meer heeft. Gelukkig heeft ieder huishouden i Nederland wel een USB-mi...

Smart IOT vagn för intern logistik (Intel IoT)

Projektet heter "Smart IOT vagn för intern logistik". Nu för tiden shopping om inte i sin helhet, men i ökande majoritet görs online. Det är de flesta kloster form av shopping, som det kan göras inom komfort i våra hem. Men inte allt kan köpas o...

NeoWeather: Ambient Weather indikator

Vi kan inte alla ha skrivbordet bredvid fönstret. I mitt fall har min medarbetare vid skrivbordet mittemot mig plats vid fönstret. När det blir dags att vandringen ner på gatan för att få lite lunch, är jag aldrig helt säker på vad jag ska hitta i de...