Stap 7: Graven in de Code
IMP firmwares zijn geschreven in een objectgeoriënteerde taal, genaamd van eekhoorn, die eruit ziet en voelt veel als JavaScript te gebruiken. Eekhoorn draait in een virtuele machine op de top van de imp OS binnen het GMB, dus runtimefouten zal niet uw apparaat offline knock, en u toegang hebt tot een heleboel leuke OS gebaseerde functies, zoals gebufferde seriële input en gemakkelijk één regel-API's in te stellen van GPIOs of communiceren met randapparatuur.
Een kijkje nemen op alle dingen die je in uw firmware imp doen kunt, check out de elektrische imp API: naslag en elektrische imp werkte voorbeelden pagina. Om te zien welke pinnen kunnen doen wat, Bekijk het imp pin mux.
Onze code hier is vrij eenvoudig. Hier is onze standaard werkwijze:
- Sommige constanten instellen
- Een klasse voor onze temperatuursensor definiëren
- Instantiëren van onze klasse als een temperatuur sensor-object wilt maken
- Lees de temperatuursensor
- De datapoint verzenden de agent
- Plannen ons wakker worden in een beetje en doe het allemaal weer
De constanten op 8 en 9 kijken een beetje-onheilspellend, maar ze zijn eenvoudig. Dit zijn de parameters voor uw thermistor - u vindt ze op het gegevensblad voor de thermistor die u gebruikt. Als u gebruikmaakt van de thermistor ik in verband met eerder, kun je zelfs de parameters die worden ingesteld al hier.
Lijnen 20 tot en met 71 zijn een klassendefinitie - dit is in feite een reeks instructies voor het uitvoeren van verschillende belangrijke dingen met een thermistor, zoals het lezen van de temperatuur. Dit komt rechtstreeks uit de github - het is een mooie, modulaire stukje code zodat het gemakkelijk kan worden hergebruikt.
Na dat moeten we alleen onze op hoog niveau logica te definiëren. Op lijnen 79 tot en met 83 configureren we de twee pinnen die we gebruiken. Herinner me uit toen we het apparaat bouwden-een van de pennen een pininschakelen , waarmee huidige doorheen kan stromen de thermistor is als het laagis ingesteld. De andere pin is onze analoge invoer pin, die we gebruiken zullen om te lezen de spanning over de thermistor.
// Configure Pins // pin 8 is driven high to turn off temp monitor (saves power) or low to read therm_en_l <- hardware.pin8; therm_en_l.configure(DIGITAL_OUT); therm_en_l.write(1); // pin 9 is the middle of the voltage divider formed by the NTC - read the analog voltage to determine temperature temp_sns <- hardware.pin9;
Op lijn 86 noemen we eerder op onze klassendefinitie uit als een thermistor-object wilt maken. Dit object neemt in de constanten die we eerder ingesteld, en methoden waarmee ons om te lezen van de temperatuur in Celsius of Fahrenheit.
// instantiate our thermistor classmyThermistor <- thermistor(temp_sns, b_therm, t0_therm, 10, false);
Lijnen 88-96 zijn waar de magie gebeurt - we inschakelen van de sensor, neem een lezing, stuur het naar de agent en uitschakelen van de sensor om opnieuw op te slaan batterij.
therm_en_l.write(0); imp.sleep(0.001); local id = hardware.getdeviceid(); local datapoint = { "id" : id, "temp" : format("%.2f",myThermistor.read_f()), } agent.send("data",datapoint); therm_en_l.write(1);
En tot slot, het plannen van een wakeup in vijftien minuten. Gaan we naar diepe slaap in de tussentijd, opslaan van de batterij:
//Sleep for 15 minutes and 1 second, minus the time past the 0:15 //so we wake up near each 15 minute mark (prevents drifting on slow DHCP) imp.onidle( function() { //server.sleepfor(1 + 15 - (time() % (WAKEINTERVAL_MIN*15))); server.sleepfor(1 + WAKEINTERVAL_MIN*60 - (time() % (WAKEINTERVAL_MIN*60))); });
Dat is de firmware van het apparaat - Neem een blik bij de agent. Je hebt al gezien onderdeel van de agent - we stellen de Sparkfun openbare en Private sleutel lijnen 6 en 7 van de agent eerder. Onder dat hebben we een andere klassendefinitie; deze definieert de methoden voor interactie met een gegevensstroom van Sparkfun.
Lijnen 62 tot en met 65 zijn een echt interessant stukje code - dit is de haak die de agent gebruikt om te ontvangen van nieuwe gegevens van de temperatuur van het apparaat. Dit wordt gedaan door een agent "terugbellen" registreren met agent.on. Dit zegt, "wanneer het apparaat stuurt u een evenement genaamd 'temp', de volgende functie aanroepen met de gegevens gemarkeerd met dat label". Terugkijkend op lijn 95 van de firmware van het apparaat, zien we dat we gegevens gemarkeerd verzonden "temp" met een functie genaamd "agent.send". Dit is waar die gegevens ging!
device.on("data", function(datapoint) { local resp = stream.push({"temp": datapoint.temp}); server.log(format("PUSH: %i - %s", resp.statuscode, resp.body)); });
Tot slot, we zien de agent twee dingen doen wanneer het voor het eerst beginnen te lopen. De eerste: het stuurt een log-bericht laten weten dat het begonnen en is klaar om gegevens te krijgen. Ten tweede, het instantieert een Sparkfun Data Stream-object met de klasse wij eerder hebt gedefinieerd, laten de methoden van die klassen gebruiken om gegevens te verzenden naar Sparkfun zoals het komt.
De agent niet opnieuw starten of slapen; het begint de eerste keer het apparaat laars met dit model, en blijft lopen voor altijd, elke nieuwe datapoint hanteren als het gaat door te bellen naar de terugbeloproep van de "device.on". Het is van het apparaat hersenen in de cloud!
Dat is de firmware! Geniet van uw nieuwe Internet-verbonden thermometer.