Paso 9: Automatización continuó: Intel XDK IoT Edition
Utilizamos la edición de IoT XDK de Intel. Permite escribir el código en JavaScript utilizando bibliotecas de Node.js.
El software puede encontrarse en Intel XDK IoT edición, hay muchos documentos sobre cómo empezar con el IDE.
Código:
/ * jslint nodo: verdad, vars:true, bit a bit: true, unparam:true * //*jshint sin usar: true * / / * global ** una aplicación simple de node.js destinada a parpadear el LED a bordo de Intel basado en consejos de desarrollo como el Galileo de Intel (r) y Edison con Arduino breakout Junta. MRAA - biblioteca de esqueleto bajo nivel de comunicación en plataformas GNU/Linux biblioteca en C/C++ para interfaz con Galileo y otras plataformas de Intel, en un API estructurada y sana con puerto nanmes/numeración que coincida con los tableros y con vinculaciones a javascript y python. Pasos para instalar MRAA y biblioteca de la UPM en Intel plataforma de IoT con IoTDevKit Linux * de la imagen usando un ssh cliente: 1. echo "fuente maa-upm http://iotdk.intel.com/repos/1.1/intelgalactic" > /etc/opkg/intel-iotdk.conf 2. OPKG actualización 3. OPKG upgradeArticle: https://software.intel.com/en-us/html5/articles/intel-xdk-iot-edition-nodejs-templates * / var mraa = require('mraa'); requieren mraa / / UDP var opciones = {host: '127.0.0.1', Puerto: 41234}; console.log ('MRAA versión: ' + mraa.getVersion()); escribir la versión mraa la consola XDK Intel var dgram = require('dgram'); var cliente = dgram.createSocket('udp4'); petición de var = requieren ('solicitud'); var lcdDisplayTimer = 0; luces de var = nuevo mraa. GPIO(3); LED conectado hasta el pin digital 13 (o construido en el Galileo Gen2) lights.dir (mraa. DIR_OUT); establecer la dirección de gpio salida var ledState = true; Booleano para sostener el estado de Led var groveSensor = require('jsupm_grove'); LCD de var = require('jsupm_i2clcd'); myLcd var = new LCD.Jhd1313m1 (0, 0x3E, 0x62); var rotarySensor = new mraa. AIO(1); var myButton = new mraa. GPIO(6); var servoModule = requieren ("jsupm_servo"); //var digitalLightSensor = require("jsupm_tsl2561"); lightSensor var = new digitalLightSensor.TSL2561 (); var lightSensor = require('jsupm_grove'); luz var = nuevo groveSensor.GroveLight(0); var lightLevel = 0; var lightLowCnt = 0; var lightTimeRemaining = 960; minutos en 16 horas var lightDay = 1440; minutos en 24 horas día var lightsState = 0; var waterSensor = require('jsupm_grovewater'); nivel del agua var = nuevo waterSensor.GroveWater(2); var waterLeverTimer = 0; var waterLevelValue = 0; var tempSensor = new groveSensor.GroveTemp(3); var tempBase = 23; objetivo temperatura var tempTheshold = 25; tratar de enfriar la temperatura var = 27; demasiado caliente sonidos alarma var louverOpened = 160; var louverClosed = 0; tempValue var = 0; var circulationPump = new mraa. GPIO(4); circulationPump.dir (mraa. DIR_OUT); establecer la dirección de gpio salida var circulationPumpState = 0; var circulationPumpTimer = 0; var CIRCULATION_PUMP_TIME_ON = 1; bomba de tiempo en var CIRCULATION_PUMP_TIME_OFF = 1; bomba de tiempo de / / módulo de crear instancias de Servo servo de puertos digitales 5 var = nuevo servoModule.Servo(5); servo.setMinPulseWidth(600); servo.setMaxPulseWidth(2200) var ecSensor = new mraa. AIO(1); var EC_reading = 0; var ecDoser = new mraa. GPIO(6); ecDoser.dir (mraa. DIR_OUT); establecer la dirección de gpio salida var ecDoserState = 0; var ecDoserTimer = 0; var ecDoserActivate = false; var ecSampleTimer = 0; var EC_DOSER_INTERVAL = 2; segundos para ejecutar dosificador var EC_SAMPLE_INTERVAL = 1; minutos a esperar antes de usar la lectura de CE para determinar dosis var EC_LIMIT = 1500; dosis por debajo de este valor menos EC_Band hasta que alcance este nivel var EC_BAND = 200; var EC_MS = 0; CE fanCooling de micro/Svar = mraa nuevo. GPIO(7); fanCooling.dir (mraa. DIR_OUT); establecer la dirección de gpio salida var fanCoolingState = 0; var alarma = mraa nuevo. GPIO(8); Alarm.dir (mraa. DIR_OUT); establecer la dirección de gpio salida var alarmState = 0; var logTimer = 1; var localWeather = 'Nublado'; var url = 'http://api.wunderground.com/api/df5bd75178df2c09/conditions/q/RI/Providence.json'; var weatherTimer = 1; esperar 1 minuto antes de la primera llamada var datos = [{sensorName: "la luz", sensorType: "light.v1.0"}, {sensorName: "temperatura", / / sensorType temp de aire: "temperature.v1.0"}]; / * data.forEach(function(item) {registerNewSensor (item.sensorName, item.sensorType, la función ()});}); * / periodicActivity(); llamar al periodicActivity functionfunction periodicActivity() {si (checkTimer(weatherTimer)) {getWeather(); weatherTimer = setMinutesTimer(240);} / / cada 4 horas growLights(); tempControl(); checkECDoser(); waterEC(); si (checkTimer(waterLeverTimer)) {waterCirculation(); waterLeverTimer = setSecondsTimer(1);} si (checkTimer(lcdDisplayTimer)) {lcdDisplay(); lcdDisplayTimer = setSecondsTimer(1);} si (checkTimer(logTimer)) {sendToCloud(); logTimer = setMinutesTimer(1);} setTimeout(periodicActivity,500); //call la función indicada después de 1 segundo (1000 milisegundos)} function lcdDisplay() {var lums = 0; myLcd.clear(); myLcd.setCursor(0,0); myLcd.write('Cond : ' + localWeather); myLcd.setCursor(1,0); myLcd.write (' CE:' + EC_MS); myLcd.setCursor(1,8); Si (lightLevel < 100) {lums = 'L';} else if (lightLevel < 130) {lums = estoy ';} else {lums = 'H';} myLcd.write ('L:' + lums); myLcd.setCursor(1,12); myLcd.write (' t:' + tempSensor.value()); } / / lcdDisplayfunction getWeather() {petición ({url: url json: false}, función (error, respuesta, cuerpo) {si (! error & & response.statusCode === 200) {/ / console.log(response.body); var foo = response.body; / / console.log(foo.substr(foo.indexOf('"weather":"') + 11,10)); localWeather = foo.substr(foo.indexOf('"weather":"') + 11,10);}});} getWeatherfunction waterEC() {EC_reading = ecSensor.read(); / leer la tensión analógica de entrada / / 0 a 1024 = 0 a 5v / / 204 micro/S por voltio EC_MS = (EC_reading * 4.88).toFixed(); / / 5000 micro/S / 1024 = 4.88 si (EC_MS < (EC_LIMIT - EC_BAND)) {/ / fuera de rango aceptable si (checkTimer(ecSampleTimer)) {/ / tiempo para volver a la dosis ecSampleTimer = 0; / / console.log ('--ecDoserState ' + ecDoserState); si (ecDoserState != 1) {/ / si el dosificador no por entonces encendido ecDoserActivate = true; ecSampleTimer = setMinutesTimer(EC_SAMPLE_INTERVAL); / / reset hasta próxima muestra – dosis console.log ('dosis de CE');}} Console.log ('menor que' + (EC_LIMIT - EC_BAND)); } / / console.log ('ecSampleTimer' + ecSampleTimer); Console.log (' CE = ' + EC_MS);} waterCirculation() de función waterEC () {waterLevelValue = waterLevel.isWet(); if (waterLevelValue == true) {si (checkTimer(circulationPumpTimer)) {si (circulationPumpState == 1) {circulationPumpState = 0; circulationPumpTimer = setMinutesTimer(CIRCULATION_PUMP_TIME_OFF);} más {circulationPumpState = 1; circulationPumpTimer = setMinutesTimer(CIRCULATION_PUMP_TIME_ON);} circulationPump.write(circulationPumpState);}} más {console.log ('bajo agua'); circulationPumpTimer = 0; circulationPumpState = 0; circulationPump.write(circulationPumpState);} / / console.log (' bomba = ' + circulationPumpState);} / / waterCirculationfunction checkECDoser() {si (ecDoserState == 0 & & ecDoserActivate == true) / / si no ya por las necesidades en {ecDoserTimer = setSecondsTimer(EC_DOSER_INTERVAL); ecDoserState = 1; ecDoser.write(ecDoserState); console.log ('CE dosificador es' + ecDoserState + ' ' + EC_DOSER_INTERVAL + 'segundos'); } Si (checkTimer(ecDoserTimer)) {/ / contador de tiempo fue ecDoserActivate = false; ecDoserState = 0; / / gire dosificador de ecDoser.write(ecDoserState); / / console.log ('CE dosificador temporizador encendido');} / / console.log ('ecDoserTimer' + ecDoserTimer); } / / checkECDoserfunction tempControl() {/ / cuando temp alta; encender ventiladores, abrir las persianas / / si la temperatura por encima del umbral, estancia hasta que bajen a temperatura base / / encender zumbador en alarma temp tempValue = tempSensor.value(); / / console.log ('temp es =' + tempValue); si (tempValue > tempTheshold) {fanCoolingState = 1; servo.setAngle(louverOpened); / / console.log ('temp caliente');} else if (tempValue < = tempBase) {fanCoolingState = 0; servo.setAngle(louverClosed); / / console.log ('temp normal');} fanCooling.write(fanCoolingState); si (tempValue > = temperatura) {alarmState = alarmState? 0:1; alarm.write(alarmState);} más {alarm.write(0); alarmState = 0;} / / console.log ('alarma es =' + alarmState);} / tempControl () función growLights() / / llama cada minuto {//lightLevel = lightSensor.getLux(); lightLevel = light.value(); if (lightLevel < 100 & & lightTimeRemaining > 0) {si (lightLowCnt < 2) {lightLowCnt ++;} otro {lightsState = 1; lightLowCnt = 0;}} más {lightsState = 0; lightLowCnt = 0;} lights.write(lightsState); lightTimeRemaining--; lightDay--; si (lightDay < 1) {lightDay = 1440; lightRemaining = 640;} / / nuevo día 24 hr con 16 horas de luz if console.log (lightLowCnt > 0) ('lightLow: ' + lightLowCnt); console.log('LightLevel : ' + lightLevel); } / / fin growLightsfunction setSecondsTimer(waitTime) {var endTime; var d = new Date (); endTime = d.getTime() + (waitTime * 1000); / / convertir a milisegundos de endTime retorno segundos;} / / setSecondsTimerfunction setMinutesTimer(waitTime) {var endTime = 0; var d = new Date (); endTime = d.getTime() + (waitTime * 60000); / / convertir a milisegundos de endTime retorno minutos;} / / setMinutesTimerfunction checkTimer(timer) {var d = new Date (); / / console.log ('hora' + d.getTime() + ' temporizador =' + temporizador); si (d.getTime() > temporizador) {devuelve true;} otro {devuelva false ;}} / / checkTimerfunction registerNewSensor (nombre tipo, callback) {var msg = JSON.stringify ({n: nombre, t: tipo}); var sentMsg = new Buffer(msg); console.log ("sensor de registro:" + sentMsg); Client.Send (sentMsg, 0, sentMsg.length, options.port, options.host, callback); }; function sendObservation (nombre, valor, en el) {var msg = JSON.stringify ({n: nombre, v: valor, en: en}); var sentMsg = new Buffer(msg); console.log ("envío observación:" + sentMsg); Client.Send (sentMsg, 0, sentMsg.length, options.port, options.host); }; función sendToCloud() {//sendObservation ("luz", lightLevel, nuevo Date().getTime()); //sendObservation ("temperatura" tempValue, nuevo Date().getTime()); //sendObservation ("bomba", circulationPumpState, nuevo Date().getTime()); //sendObservation ("ecSensor", EC_MS, nuevo Date().getTime()); / / sendObservation ("ecDoser", ecDoserState, nuevo Date().getTime()); //sendObservation ("coolingFan del, fanCoolingState, nuevo Date().getTime()); //sendObservation ("nivel del agua", waterLevelValue, nuevo Date().getTime()); //sendObservation ("growLights", lightsState, nuevo Date().getTime()); //sendObservation ("lumbreras", fanCoolingState, nuevo Date().getTime());} //sendToCloud