Stap 6: Een nauwere kijken hoe het werkt: apparaatcode
Laten we beginnen met de apparaatcode. Het is kort en simpel. Het heeft twee banen: temperatuur lezingen te verzamelen en te reageren op knooppersen.
Neem een kijkje op de functie-definitie voor getTemp().
function getTemp() { imp.wakeup(INTERVAL, getTemp); vtherm_en_l.write(0); imp.sleep(0.01); local rawval = vtherm.read(); local 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()}); }
Deze functie verzamelt temperatuur lezingen met een regelmatig interval. Het interval wordt gedefinieerd door een constante, INTERVAL, boven aan het bestand. Het eerste ding getTemp doet is plannen zelf uit te voeren in seconden INTERVAL weer door de aanroepende imp.wakeup (INTERVAL, getTemp). Deze plant een Terugbellen; het GMB kan om andere dingen te doen, terwijl in seconden INTERVAL, het werkende systeem zal terugbellen en vragen ons opnieuw uit te voeren getTemp.
Na het plannen zelf opnieuw uit te voeren, getTemp leest de spanning in het midden van de thermistor scheidingslijn, dan maakt gebruik van een eenvoudige 2e-order curve aanpassen aan de schatten van de temperatuur. De coëfficiënten voor de curve passen als constanten boven aan het bestand zijn opgeslagen (als je kijkt, zult u merken we eigenlijk alleen maar gebruik maken van een lineaire curve past! Maar de 2e orde pasvorm is er als u wilt uitproberen).
Vervolgens hebben we een functie die het GMB wat vertelt te doen wanneer het tijd is om te gaan slapen:
function goToSleep() {wake.configure(DIGITAL_IN_WAKEUP); // go to sleepfor max sleep time (1 day minus 5 seconds) server.sleepfor(MAXSLEEP); }
Deze functie doet twee dingen: ten eerste het Pin1 als een wakeup pin, zodanig geconfigureerd dat als de knop wordt ingedrukt zal het het GMB van diepe slaap wakker. Ten tweede, het vertelt het GMB naar diepe slaap voor zo lang als het is toegestaan (MAXSLEEP is gedefinieerd als 86396 seconden boven aan het bestand; dit is 1 dag minus 4 seconden. De aanroep server.sleepfor() waarschuwt de server dat het apparaat zal gaan om te slapen, zodat de agent niet hoeft te wachten voor het GMB naar ontbrekende voordat het beseft wat er is gebeurd.
Hieronder dat is er een handlerfunctie voor knop pers evenementen :
function btnPressed() { // wait to see if this is a long press, and go to sleep if it is local start = hardware.millis(); while ((hardware.millis() - start) < LONGPRESS_TIME*1000) { if (!hardware.pin1.read()) {return;} } goToSleep(); }
Dit is een interessante functie. Het blijkt dat, roept wanneer u druk op de knop helemaal niet, het GMB deze functie meteen. Het GMB wacht niet enkele seconden om te gaan slapen, als je zou kunnen hebben dacht van de werking van de thermometer. In plaats daarvan het GMB roept deze functie onmiddellijk, en wacht om te zien als de gebruiker de knop ingedrukt gedurende drie seconden houdt. Als u dit doet, gaat het om te slapen. Als u dat niet doet, het laat de functie en gaat terug naar het doen wat zij deed vóór.
Vervolgens zien we enkele callbacks voor agent- gebeurtenissenworden geregistreerd:
agent.on("sleep", function(val) { imp.onidle(function() { goToSleep(); }); });<br> agent.on("needDeviceId", function(val) { agent.send("deviceId",hardware.getdeviceid()); });
Het eerste onderdeel handler hier kunt de agent om te vertellen van het apparaat om te gaan slapen. Terwijl het apparaat is uitgevoerd, de agent houdt een oogje op hoeveel temperatuur veranderen is te zien en past de hoeveelheid tijd die het zal het apparaat laten wakker te blijven voordat bellen van dit evenement en vertellen het apparaat om te gaan slapen om op te slaan batterij.
De tweede handler wordt alleen gebruikt in speciale gelegenheden. De agent niet automatisch weten van het apparaat, apparaat-ID, maar het het nodig heeft om de kanaalnamen gegevens te sturen naar Xively. Normaal gesproken, opstarten de agent en het apparaat samen wanneer de agent voor de eerste keer laarzen, waarna de agent blijft op. Echter, soms de agent opnieuw zal worden opgestart door zelf, bijvoorbeeld als u nieuwe code naar pushen. In dit geval de agent moet een manier om te vragen het apparaat wat haar Apparatenidentiteitskaart is - deze functie geeft het een manier om dat te doen.
Daarna, we zijn klaar met definities, en bereiken we het punt waar werkelijke runtime-bewerking wordt gestart wanneer het apparaat opstart. Het eerste wat dat het GMB doet wanneer op zelfstart is erachter te komen waarom het opgestart. Als het was vanwege een Pin1 wakeup, doet het GMB het zelfde ding dat het doet als je houd de knop te sturen om te slapen - het blijft hier en wacht om te zien als u de knop ingedrukt. Als je laten gaan voordat de 3 seconden wachttijd, gaat het GMB direct terug naar slapen voordat het zelfs verbinding met het internet.
// check wakereason and make this a shallow wake if necessary if ((hardware.wakereason() == WAKEREASON_PIN1) || (hardware.wakereason() == WAKEREASON_TIMER)) { local start = hardware.millis(); while ((hardware.millis() - start) < LONGPRESS_TIME*1000) { if (!hardware.pin1.read()) {goToSleep();} } // if we made it here, somebody's just long-pressed the power button to wake the imp // go ahead and boot right up. } // not a shallow wake; fire up the radio and let's cook a turkey imp.setpowersave(true); // save juice, as this application is not latency-critical
Tot slot, we instantiëren de objecten we moeten ons werk doen en inchecken met de agent, dan beginnen met het lezen van de temperatuur aan de slag.
agent.send("justwokeup",hardware.getdeviceid()); getTemp()
Neem een blik bij de agent-code in de volgende stap, als je geïnteresseerd bent.