Vertical Hydroponic Farm (9 / 13 steg)
Steg 9: Automation fortsatte: Intel XDK IoT Edition
Vi utnyttjade Intels XDK IoT Edition. Det tillåter dig att skriva din kod i JavaScript med Node.js bibliotek.
Programvaran finns på Intel XDK IoT Edition, det finns många dokument om hur du kommer igång med IDE.
Kod:
/ * jslint nod: true, vars:true, bitvis: true, unparam:true * /
/ * jshint oanvända: sant * /
/ * globala *
*
En enkel node.js ansökan avsett att blinka ombord LED på Intel baserad utveckling styrelser som Intel(R) Galileo och Edison med Arduino breakout ombord.
MRAA - låg nivå skelett bibliotek för att kommunicera på GNU/Linux-plattformar
Biblioteket i C/C++ gränssnitt med Galileo & andra Intel-plattformar, i en strukturerad och sane API med port nanmes/numrering som matchar styrelser & med bindningar till javascript & python.
Steg för att installera MRAA & UPM bibliotek på Intel IoT plattform med IoTDevKit Linux * bild
Använda en ssh klient:
1. echo "src maa-upm http://iotdk.intel.com/repos/1.1/intelgalactic" > /etc/opkg/intel-iotdk.conf
2. opkg uppdatering
3. opkg uppgraderingen
Artikel: https://software.intel.com/en-us/html5/articles/intel-xdk-iot-edition-nodejs-templates
*/
var mraa = require('mraa'); kräver mraa
UDP-alternativ
var alternativ = {
värd: '127.0.0.1',
Port: 41234
};
Console.log ("MRAA Version:" + mraa.getVersion()); skriva den mraa versionen till Intel XDK konsolen
var dgram = require('dgram');
var kund = dgram.createSocket('udp4');
var begäran = require('request');
var lcdDisplayTimer = 0;
var ljus = nya mraa. Gpio(3); LED hooked upp till digital stift 13 (eller inbyggda stift på Galileo Gen2)
Lights.dir (mraa. DIR_OUT); Ange gpio riktningen till utgång
var ledState = sant; Boolean att hålla tillståndet för Led
var groveSensor = require('jsupm_grove');
var LCD = require('jsupm_i2clcd');
var myLcd = ny LCD.Jhd1313m1 (0, 0x3E, 0x62);
var rotarySensor = ny mraa. AIO(1);
var myButton = nya mraa. Gpio(6);
var servoModule = require("jsupm_servo");
var digitalLightSensor = require("jsupm_tsl2561");
var lightSensor = ny digitalLightSensor.TSL2561();
var lightSensor = require('jsupm_grove');
var ljus = nya groveSensor.GroveLight(0);
var lightLevel = 0;
var lightLowCnt = 0;
var lightTimeRemaining = 960; minuter i 16 timmar
var lightDay = 1440; minuter i 24 timmars arbetsdag
var lightsState = 0;
var waterSensor = require('jsupm_grovewater');
var waterLevel = ny waterSensor.GroveWater(2);
var waterLeverTimer = 0;
var waterLevelValue = 0;
var tempSensor = nya groveSensor.GroveTemp(3);
var tempBase = 23. mål temperatur
var tempTheshold = 25; försök att kyla ner
var tempAlarm = 27. för varmt ljud larm
var louverOpened = 160;
var louverClosed = 0;
var tempValue = 0;
var circulationPump = ny mraa. Gpio(4);
circulationPump.dir (mraa. DIR_OUT); Ange gpio riktningen till utgång
var circulationPumpState = 0;
var circulationPumpTimer = 0;
var CIRCULATION_PUMP_TIME_ON = 1; pump tid på
var CIRCULATION_PUMP_TIME_OFF = 1; pump ledighet
Initiera Servo modul på digital port 5
var servo = nya servoModule.Servo(5);
servo.setMinPulseWidth(600);
servo.setMaxPulseWidth(2200)
var ecSensor = ny mraa. AIO(1);
var EC_reading = 0;
var ecDoser = ny mraa. Gpio(6);
ecDoser.dir (mraa. DIR_OUT); Ange gpio riktningen till utgång
var ecDoserState = 0;
var ecDoserTimer = 0;
var ecDoserActivate = false;
var ecSampleTimer = 0;
var EC_DOSER_INTERVAL = 2; sekunder att köra doser
var EC_SAMPLE_INTERVAL = 1; minuter att vänta innan du använder EG läsning för att bestämma att DOS
var EC_LIMIT = 1500; DOS när under detta värde minus EC_Band tills den når denna nivå
var EC_BAND = 200.
var EC_MS = 0; EG micro/S
var fanCooling = ny mraa. Gpio(7);
fanCooling.dir (mraa. DIR_OUT); Ange gpio riktningen till utgång
var fanCoolingState = 0;
var larm = nya mraa. Gpio(8);
alarm.dir (mraa. DIR_OUT); Ange gpio riktningen till utgång
var alarmState = 0;
var logTimer = 1;
var localWeather = 'Klart';
var url = "http://api.wunderground.com/api/df5bd75178df2c09/conditions/q/RI/Providence.json";
var weatherTimer = 1; vänta 1 minut innan första samtalet
var data = [{
sensorName: "ljus",
sensorType: "light.v1.0"
},{
sensorName: "temperatur", / / luft temp
sensorType: "temperature.v1.0"
}];
/*
data.forEach(function(item) {
registerNewSensor (item.sensorName, item.sensorType, funktion () {
});
});
*/
periodicActivity(); anropa funktionen periodicActivity
funktion periodicActivity()
{
om (checkTimer(weatherTimer)) {getWeather(); weatherTimer = setMinutesTimer(240);} / / var 4 timmar
growLights();
tempControl();
checkECDoser();
waterEC();
om (checkTimer(waterLeverTimer)) {waterCirculation(); waterLeverTimer = setSecondsTimer(1);}
om (checkTimer(lcdDisplayTimer)) {lcdDisplay(); lcdDisplayTimer = setSecondsTimer(1);}
om (checkTimer(logTimer)) {sendToCloud(); logTimer = setMinutesTimer(1);}
setTimeout(periodicActivity,500); anropa funktionen indikerade efter 1 sekund (1000 millisekunder)
}
funktion lcdDisplay()
{
var lums = 0;
myLcd.clear();
myLcd.setCursor(0,0);
myLcd.write (' dir: "+ localWeather);
myLcd.setCursor(1,0);
myLcd.write ("EG:" + EC_MS);
myLcd.setCursor(1,8);
om (lightLevel < 100) {lums = "L";} else om (lightLevel < 130) {lums = är ";} annat {lums ="H";}
myLcd.write ('L: "+ lums);
myLcd.setCursor(1,12);
myLcd.write ('T: "+ tempSensor.value());
} / / lcdDisplay
funktion getWeather()
{
begäran ({
URL: url,
JSON: falskt
}, funktion (fel, svar, kroppen) {
om (! fel & & 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);
}
});
} / / getWeather
funktion waterEC()
{
EC_reading = ecSensor.read(); Läs analoga spänningen
0 till 1024 = 0 till 5v
204 micro/S per volt
EC_MS = (EC_reading * 4.88).toFixed(); 5000 micro/S / 1024 = 4,88
om (EC_MS < (EC_LIMIT - EC_BAND)) {/ / utanför acceptabelt
om (checkTimer(ecSampleTimer)) {/ / tid att åter dos
ecSampleTimer = 0;
Console.log ("--ecDoserState" + ecDoserState);
om (ecDoserState! = 1) {/ / om doser inte å slår på den
ecDoserActivate = sant;
ecSampleTimer = setMinutesTimer(EC_SAMPLE_INTERVAL); återställa tiden fram till nästa prov - dos
Console.log ("dos för EG');
}
}
Console.log ("lägre än" + (EC_LIMIT - EC_BAND));
}
Console.log ("ecSampleTimer" + ecSampleTimer);
Console.log ("EG =" + EC_MS);
} / / waterEC()
funktion waterCirculation()
{
waterLevelValue = waterLevel.isWet();
om (waterLevelValue == true)
{
om (checkTimer(circulationPumpTimer)) {
om (circulationPumpState == 1) {
circulationPumpState = 0;
circulationPumpTimer = setMinutesTimer(CIRCULATION_PUMP_TIME_OFF);
} annat {
circulationPumpState = 1;
circulationPumpTimer = setMinutesTimer(CIRCULATION_PUMP_TIME_ON);
}
circulationPump.write(circulationPumpState);
}
} annat {
Console.log ("låg vatten");
circulationPumpTimer = 0;
circulationPumpState = 0;
circulationPump.write(circulationPumpState);
}
Console.log ("pump =" + circulationPumpState);
} / / waterCirculation
funktion checkECDoser()
{
om (ecDoserState == 0 & & ecDoserActivate == true) / / om inte redan på och behöver vara på
{
ecDoserTimer = setSecondsTimer(EC_DOSER_INTERVAL);
ecDoserState = 1;
ecDoser.write(ecDoserState);
Console.log ("EG Doser är" + ecDoserState + "för" + EC_DOSER_INTERVAL + "sekunder");
}
om (checkTimer(ecDoserTimer)) {/ / timer gick
ecDoserActivate = false;
ecDoserState = 0; Inaktivera doser
ecDoser.write(ecDoserState);
Console.log ("EG Doser Timer Fired');
}
Console.log ("ecDoserTimer" + ecDoserTimer);
} / / checkECDoser
funktion tempControl()
{
När temp till hög; slå på fans, öppna lameller
om temp ovanför theshold, bo tills sänkte till bas temp
Aktivera summern larm Temp
tempValue = tempSensor.value();
Console.log ("temp är =" + tempValue);
om (tempValue > tempTheshold) {
fanCoolingState = 1;
servo.setAngle(louverOpened);
Console.log ("temp heta');
} else om (tempValue < = tempBase) {
fanCoolingState = 0;
servo.setAngle(louverClosed);
Console.log ("temp normal');
}
fanCooling.write(fanCoolingState);
om (tempValue > = tempAlarm) {
alarmState = alarmState? 0:1;
alarm.write(alarmState);
} annat {
alarm.write(0);
alarmState = 0;
}
Console.log ("larmet är =" + alarmState);
} / / tempControl()
fungera growLights() / / kallas varje minut
{
lightLevel = lightSensor.getLux();
lightLevel = light.value();
om (lightLevel < 100 & & lightTimeRemaining > 0) {
om (lightLowCnt < 2) {lightLowCnt ++;} annat {lightsState = 1; lightLowCnt = 0;}
} annat {
lightsState = 0;
lightLowCnt = 0;
}
Lights.write(lightsState);
lightTimeRemaining--;
lightDay--;
om (lightDay < 1) {lightDay = 1440; lightRemaining = 640;} / / ny dag 24 hr dag med 16 timmars ljus
om (lightLowCnt > 0) console.log ("lightLow:" + lightLowCnt);
Console.log ("LightLevel:" + lightLevel);
} / / end growLights
funktion setSecondsTimer(waitTime)
{
var endTime;
var d = nya Date();
endTime = d.getTime() + (waitTime * 1000); konvertera tillbaka till millisekunder från sekunder
returnera endTime;
} / / setSecondsTimer
funktion setMinutesTimer(waitTime)
{
var endTime = 0;
var d = nya Date();
endTime = d.getTime() + (waitTime * 60000); konvertera tillbaka till millisekunder från minuter
returnera endTime;
} / / setMinutesTimer
funktion checkTimer(timer) {
var d = nya Date();
Console.log ("aktuell tid" + d.getTime() + ' timer = "+ timer);
om (d.getTime() > timer) {return true;}
annat {return false;}
} / / checkTimer
funktion registerNewSensor (namn, typ, callback) {
var msg = JSON.stringify ({
n: namn,
t: typ
});
var sentMsg = ny Buffer(msg);
Console.log ("Registering sensor:" + sentMsg);
client.send (sentMsg, 0, sentMsg.length, options.port, options.host, callback);
};
funktion sendObservation (namn, värde, på) {
var msg = JSON.stringify ({
n: namn,
v: värde,
på: på
});
var sentMsg = ny Buffer(msg);
Console.log ("Skicka observation:" + sentMsg);
client.send (sentMsg, 0, sentMsg.length, options.port, options.host);
};
funktion sendToCloud() {
sendObservation ("lätt", det lightLevel, nya Date().getTime());
sendObservation ("temperatur", tempValue, nya Date().getTime());
sendObservation ("packningssats", circulationPumpState, nya Date().getTime());
sendObservation ("ecSensor", EC_MS, nya Date().getTime());
sendObservation ("ecDoser", ecDoserState, nya Date().getTime());
sendObservation ("coolingFan", fanCoolingState, nya Date().getTime());
sendObservation ("waterLevel", waterLevelValue, nya Date().getTime());
sendObservation ("growLights", lightsState, nya Date().getTime());
sendObservation ("lameller", fanCoolingState, nya Date().getTime());
} //sendToCloud