TempBug: internet-ansluten termometer (7 / 7 steg)
Steg 7: Gräva i koden
IMP firmwares är skrivna i ett objektorienterat språk kallas ekorren, som ser ut och känns mycket som javascript. Ekorre körs i en virtuell maskin ovanpå den imp OS inom den integrerade havspolitiken, så runtime fel kommer inte att slå enheten offline, och du har tillgång till en massa trevliga OS-baserade funktioner, som buffrade seriell indata och lätt en rad APIs ange GPIOs eller kommunicera med kringutrustning.
Ta en titt på alla de saker du kan göra i din imp firmware, kolla den elektriska imp API-referens och elektriska imp arbetade exempel sida. Att se vilket stift kan göra vad, kolla in den imp pin mux.
Vår kod här är ganska enkel. Här är vår grundläggande operativa proceduren:
- Ange några konstanter
- Definiera en klass för våra temperaturgivare
- Initiera vår klass för att skapa en temperatur sensor objekt
- Läs temperaturgivare
- Skicka datapoint till agent
- Schemalägga oss att vakna upp i lite och gör det igen
Konstanterna på linje 8 och 9 ser lite illavarslande, men de är enkla. Detta är parametrar för din termistor - du hittar dem i databladet för termistor som du använder. Om du använder en termistor jag länkade till tidigare, du kan även hålla parametrarna som redan ställts här.
Linjerna 20 till 71 är en klassdefinition - detta är i grunden en uppsättning instruktioner för hur man gör olika viktiga saker med en termistor, som läsa temperaturen. Detta kommer direkt från github - det är en trevlig, modulära bit kod så att den enkelt kan återanvändas.
Efter det behöver vi bara definiera våra hög nivå logik. På linjerna 79-83 konfigurerar vi två stiften vi använder. Kom ihåg från när vi byggt enheten - en av stiften är enaktiverar PIN-kod, vilket gör att nuvarande flöda genom termistor när det är låg. Det andra stiftet är våra analoga ingångsstift, som vi använder för att läsa spänningen över en termistor.
Konfigurera Pins
stift 8 drivs hög till vända bort temp monitor (sparar ström) eller låg att läsa
therm_en_l <-hardware.pin8;
therm_en_l.configure(DIGITAL_OUT);
therm_en_l.write(1);
stift 9 är mitten av spänningsavdelare bildas av NTC - läsa analog spänning för att bestämma temperaturen
temp_sns <-hardware.pin9;
På linje 86 uppmanar vi våra klassdefinitionen från tidigare för att skapa en termistor objekt. Detta objekt krävs i konstanterna vi som tidigare, och har metoder som tillåter oss att läsa temperaturen i Celsius eller Fahrenheit.
instansiera våra termistor
myThermistor <-termistor (temp_sns, b_therm, t0_therm, 10, falsk);
88 och 96 är där magiskt händer - vi aktiverar sensorn, ta en behandling, skicka det till agenten och inaktivera sensorn igen för att spara batteri.
therm_en_l.write(0);
IMP.Sleep(0.001);
lokalt id = hardware.getdeviceid();
lokala datapoint = {
"id": id,
"temp": format("%.2f",myThermistor.read_f()),
}
agent.send("data",Datapoint);
therm_en_l.write(1);
Och slutligen, schemalägga ett wakeup i femton minuter. Vi ska gå till djup sömn under tiden, spara batteriet:
Sömn i 15 minuter och 1 sekund, minus tiden förbi 0:15
så vaknar vi upp nära varje 15 minuter märke (förhindrar drifting på långsam DHCP)
IMP.ONIDLE (function() {
Server.sleepfor (1 + 15 - (time() % (WAKEINTERVAL_MIN * 15)));
Server.sleepfor (1 + WAKEINTERVAL_MIN * 60 - (time() % (WAKEINTERVAL_MIN * 60)));
});
Det är den enhet firmware - låt oss ta en titt på agent. Har du redan sett del av agent - vi satt Sparkfun offentliga och privata nyckeln linjerna 6 och 7 i agenten tidigare. Under dessa har vi en annan klassdefinition; här definierar metoder för att interagera med en Sparkfun dataström.
62-65 är en riktigt intressant bit kod - detta är kroken som agenten använder för att ta emot nya temperaturdata från enheten. Detta görs genom att registrera en agent "callback" med agent.on. Detta säger, "när enheten skickar du ett evenemang som kallas"temp", ring följande funktion med uppgifterna markerade med taggen". Tittar tillbaka på linje 95 av enhetens firmware, ser vi att vi skickat data märkt "temp" med en funktion kallad "agent.send". Detta är där informationen gick!
Device.on ("data", function(datapoint) {
lokala resp = stream.push ({"temp": datapoint.temp});
Server.log (format ("PUSH: %i - %s", resp.statuscode, resp.body));
});
Slutligen ser vi agenten göra två saker när det börjar först kör. Först: skickar en loggmeddelandet låter oss veta att det börjat och är redo att få data. Andra, det instansierar ett Sparkfun dataströmmen objekt med klassen vi definierat tidigare, att låta oss använda metoderna i dessa klasser för att skicka data till Sparkfun som det kommer.
Agenten inte vila eller sova; Det startar första gången enheten startar med denna modell, och fortsätter att köra för evigt, hantering av varje ny datapoint när det kommer i genom att ringa "device.on" callback. Det är enhetens hjärnan i molnet!
Det är firmware! Njut av din nya Internet-ansluten termometer.