Arduino & node.js
-
Upload
steven-beeckman -
Category
Devices & Hardware
-
view
684 -
download
1
description
Transcript of Arduino & node.js
![Page 1: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/1.jpg)
How to build a depression predictor
(a.k.a. a belgian weather station)
using Arduino & Node.js@stevenbeeckman #iotbe #njugbe
![Page 2: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/2.jpg)
In short
Arduino IDE: arduino.cc/dowloadInstall StandardFirmata sketch on the Arduinonpm install johnny-fivewrite your script.jsRun node script.js
![Page 3: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/3.jpg)
You need a host computer connected to
the Arduino
![Page 4: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/4.jpg)
Let’s build a depression predictor
(or a belgian weather station)
![Page 5: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/5.jpg)
Things we need
A sensorSomething to gather the sensor dataSomething to store the generated timeseriesA visualisation
![Page 6: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/6.jpg)
photoresistor Arduino MacBook Browsercloud
![Page 7: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/7.jpg)
Heroku+
node.js+
hapi.js+
TempoDB
add-on
photoresistor Arduino Uno
Node.js +
Johnny Five +
request+
forever
TempoDB web app
ADC http httpusb
![Page 8: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/8.jpg)
Heroku+
node.js+
hapi.js+
TempoDB
add-on
photoresistor Arduino Uno
Node.js +
Johnny Five +
request+
forever
TempoDB web app
ADC http httpusb
![Page 9: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/9.jpg)
MacGyver-ism: no resistors in house and no nearby shops to buy them from -> use a piezo as a resistor
![Page 10: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/10.jpg)
Heroku+
node.js+
hapi.js+
TempoDB
add-on
photoresistor Arduino Uno
Node.js +
Johnny Five +
request+
forever
TempoDB web app
ADC http httpusb
![Page 11: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/11.jpg)
![Page 12: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/12.jpg)
Packages you need
npm install --save johnny-fivenpm install --save requestnpm install -g forever
usage: forever start script.jsforever list (to see what’s running)
https://github.com/stevenbeeckman/arduino-j5
![Page 13: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/13.jpg)
Heroku+
node.js+
hapi.js+
TempoDB
add-on
photoresistor Arduino Uno
Node.js +
Johnny Five +
request+
forever
TempoDB web app
ADC http httpusb
![Page 14: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/14.jpg)
Design
Need a REST API over HTTP(Mandatory) POST new sensor values
(Optional) GET overview of past sensor values
Store data in a time series friendly database
![Page 15: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/15.jpg)
Packages you need "dependencies": {
"hapi": "^6.5.1",
"moment": "^2.8.2",
"tempodb": "^1.0.0"
}
https://github.com/stevenbeeckman/iotbe-njugbe/
![Page 16: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/16.jpg)
Hosting
This code can run on your own server or in the cloud.I ran it in the cloud, on Heroku and used the free TempoDB add-on.
![Page 17: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/17.jpg)
![Page 18: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/18.jpg)
Some codevar Hapi = require('hapi');
var server = new Hapi.Server(process.env.PORT || 3000);
server.route({
method: 'GET'
, path: '/'
, handler: function(request, reply){
reply('Hello, Internet of Things fans!');
}
});
server.start(function(){
console.log('Server running at:' + server.info.uri);
});
heroku create
git add index.js
git commit -m “First deploy.”
git push heroku master
http://iotbe-njugbe.herokuapp.com/
![Page 19: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/19.jpg)
Writing to your TempoDBvar TempoDBClient = require('tempodb').TempoDBClient;
var tempodb = new TempoDBClient('heroku-5e2f03bd25cf424098426a8a21db26f3', process.env.TEMPODB_API_KEY, process.env.
TEMPODB_API_SECRET, {hostname: process.env.TEMPODB_API_HOST, port: process.env.TEMPODB_API_PORT});
var moment = require('moment');
server.route({
method: 'POST'
, path: '/sensor/{sensor_id}/measurement'
, config: {
handler: function(request, reply){
var newMeasurement = new Object();
newMeasurement.t = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ");
newMeasurement.v = request.payload.value;
var tempodb_data = new Array();
tempodb_data.push(newMeasurement);
var series_key = 'sensor-' + request.params.sensor_id;
tempodb.write_key(series_key, tempodb_data, function(error, result){
error ? reply(error) : reply(result);
});
}
}
});
![Page 20: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/20.jpg)
Writing to your TempoDBvar TempoDBClient = require('tempodb').TempoDBClient;
var tempodb = new TempoDBClient('heroku-5e2f03bd25cf424098426a8a21db26f3', process.env.TEMPODB_API_KEY, process.env.
TEMPODB_API_SECRET, {hostname: process.env.TEMPODB_API_HOST, port: process.env.TEMPODB_API_PORT});
var moment = require('moment');
server.route({
method: 'POST'
, path: '/sensor/{sensor_id}/measurement'
, config: {
handler: function(request, reply){
var newMeasurement = new Object();
newMeasurement.t = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ");
newMeasurement.v = request.payload.value;
var tempodb_data = new Array();
tempodb_data.push(newMeasurement);
var series_key = 'sensor-' + request.params.sensor_id;
tempodb.write_key(series_key, tempodb_data, function(error, result){
error ? reply(error) : reply(result);
});
}
}
});
Not documented: date must be formatted.
new Date() will not work as is. Use moment.js for easy formatting.
![Page 21: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/21.jpg)
Writing to your TempoDBvar TempoDBClient = require('tempodb').TempoDBClient;
var tempodb = new TempoDBClient('heroku-5e2f03bd25cf424098426a8a21db26f3', process.env.TEMPODB_API_KEY, process.env.
TEMPODB_API_SECRET, {hostname: process.env.TEMPODB_API_HOST, port: process.env.TEMPODB_API_PORT});
var moment = require('moment');
server.route({
method: 'POST'
, path: '/sensor/{sensor_id}/measurement'
, config: {
handler: function(request, reply){
var newMeasurement = new Object();
newMeasurement.t = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ");
newMeasurement.v = request.payload.value;
var tempodb_data = new Array();
tempodb_data.push(newMeasurement);
var series_key = 'sensor-' + request.params.sensor_id;
tempodb.write_key(series_key, tempodb_data, function(error, result){
error ? reply(error) : reply(result);
});
}
}
});
Single key value pairs {t,v} must be wrapped in an Array too...
![Page 22: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/22.jpg)
Writing to your TempoDBvar TempoDBClient = require('tempodb').TempoDBClient;
var tempodb = new TempoDBClient('heroku-5e2f03bd25cf424098426a8a21db26f3', process.env.TEMPODB_API_KEY, process.env.
TEMPODB_API_SECRET, {hostname: process.env.TEMPODB_API_HOST, port: process.env.TEMPODB_API_PORT});
var moment = require('moment');
server.route({
method: 'POST'
, path: '/sensor/{sensor_id}/measurement'
, config: {
handler: function(request, reply){
var newMeasurement = new Object();
newMeasurement.t = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ");
newMeasurement.v = request.payload.value;
var tempodb_data = new Array();
tempodb_data.push(newMeasurement);
var series_key = 'sensor-' + request.params.sensor_id;
tempodb.write_key(series_key, tempodb_data, function(error, result){
error ? reply(error) : reply(result);
});
}
}
});
Warning:
You have to pass the TempoDB database name too, which is not documented!
![Page 23: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/23.jpg)
Heroku+
node.js+
hapi.js+
TempoDB
add-on
photoresistor Arduino Uno
Node.js +
Johnny Five +
request+
forever
TempoDB web app
ADC http httpusb
![Page 24: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/24.jpg)
![Page 25: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/25.jpg)
![Page 26: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/26.jpg)
MacBooks crash too
hard drive failure
![Page 27: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/27.jpg)
Referenceshttp://arduino.cchttps://github.com/rwaldron/johnny-fivehttp://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever/ http://heroku.com http://hapijs.com http://momentjs.com https://tempo-db.com
![Page 28: Arduino & node.js](https://reader033.fdocuments.in/reader033/viewer/2022052505/555e88f4d8b42a0d738b4571/html5/thumbnails/28.jpg)
Questions?@stevenbeeckman #iotbe #njugbe