LoginSignup
2
2

More than 5 years have passed since last update.

BluemixでIoT 温湿度、気圧を収集・蓄積・可視化+LED制御 その10

Last updated at Posted at 2016-04-11

0.はじめに

前回の続きです。今回は、おまけ機能としてNode-RED側で温度を判定し、LEDの点灯色の制御を行います。

[今回のLED制御の仕様]しょぼい仕様ですみません。 
Node-RED側で、
30度以上のときは、  赤
20度以上30度未満は、黄
10度以上20度未満は、緑
0度以上10度未満は、 青
それ以外は、      白
となるような判定ロジックを作成する。

RaspberryPi側で、
1分(60秒)周期に温度を取得、その間(59秒間)、Node-REDで指定された色でLEDを1秒置きに点滅させる。

1.必要なもの(今回準備したもの)

項目 数量 メモ

2.参考にさせていただいたところ

Nodejs & raspberry pi でLEDをチカチカさせる

3.温度判定ロジックを追加

①Node-REDに温度判定ロジック用functionノードを追加する。
 Name項目に、「温度判定」を入力する。
 Function項目に、下記を入力する。

function
if (msg.payload.temp >= 30) {
    msg.payload='{"LED": "RED"}';
}else if(msg.payload.temp >= 20 && msg.payload.temp < 30) {
    msg.payload='{"LED": "YELLOW"}';
}else if(msg.payload.temp >= 10 && msg.payload.temp < 20) {
    msg.payload='{"LED": "GREEN"}';
}else if(msg.payload.temp >= 0 && msg.payload.temp < 10) {
    msg.payload='{"LED": "BLUE"}';
}else{
    msg.payload='{"LED": "WHITE"}';
}

return msg;

image

②Node-REDにibmiot output用ノードを追加する。
 Node-REDのoutputにあるibmiotノードを選択する。
image

③ibmiot output用ノードを設定する。
 Authentication項目に、「Bluemix Service」を選択する。
 Output Type項目に、「Device Command」を選択する。
 Device Type項目に、「raspi01」を入力する。
 Device Id項目に、「sensor001」を入力する。
 Command Type項目に、「led」を入力する。
 Format項目に、「json」を入力する。
 Data項目に、「msg」を入力する。
 Name項目に、「LED制御」を入力する。
image

③作成したノードを下図のように接続する。
image

4.LED点灯ロジック追加

①mqtt.jsにLED点灯ロジックを追加する。

mqtt.js
var f = require('./bme280.js');
var moment = require('moment');
var Client = require("ibmiotf").IotfDevice;
var Gpio = require('onoff').Gpio;
var RED   = new Gpio(22, 'out'); 
var GREEN = new Gpio(23, 'out');
var BLUE  = new Gpio(18, 'out');


var config = {
 (省略)
};

function mkJson(callback) {
   f.bme(function(temp, humid, press){
      var nowtime = moment().format("YYYY-MM-DD HH:mm:ss.SSS");
      var temp_v =  temp.toFixed(1);
      var humid_v = humid.toFixed(1);
      var press_v = press.toFixed(1);
      payload = JSON.stringify({d : { timestamp : nowtime, temp : temp_v, humid : humid_v, press : press_v }});
      //console.log(payload);
      callback(payload);
   });
}

var client = new Client (config);

client.connect();

client.on("connect", function () {
   mkJson(function(payload) {
      console.log(payload);
      client.publish ("eid", "json", payload);
   });
   setInterval(function(){
        mkJson(function(payload) {
           console.log(payload);
        });
        client.publish ("eid", "json", payload);
   }, 60000);
});

client.on("command", function (commandName,format,payload,topic) {
   if(commandName === "led") {
      //console.log(JSON.parse(payload));
      var json = JSON.parse(payload);
      setColor(json.LED);
   } else {
      console.log("Command not supported.. " + commandName);
   }
});

function setColor (color) {
   var red = 0, blue = 0, green = 0;
   switch (color) {
     case 'RED':
        red = 1;
        break;
     case 'YELLOW':
        red = green = 1;
        break;
     case 'GREEN':
        green = 1;
        break;
     case 'BLUE':
        blue = 1;
        break;
     case 'WHITE':
        red = green = blue = 1;
        break;
    }
    var iv = setInterval(function(){
       if (red==1)   {RED.writeSync(RED.readSync() === 0 ? 1 : 0);}
       if (green==1) {GREEN.writeSync(GREEN.readSync() === 0 ? 1 : 0);}
       if (blue==1)  {BLUE.writeSync(BLUE.readSync() === 0 ? 1 : 0);}
     }, 1000);
     console.log (color + " red=" + red + " green=" + green + " blue=" + blue);

    setTimeout(function() {
       clearInterval(iv); // 点滅LEDをストップ
       // LED消灯
       RED.writeSync(0);
       GREEN.writeSync(0);
       BLUE.writeSync(0);

    }, 59000);
}

5.LED点灯確認

①改修したmqtt.jsを実行する。

コマンド
pi@raspberrypi ~ $ sudo node mqtt.js

②現在の温度にあった色でLEDが点滅することを確認する。

以上でLED制御手順は終了です。

これで、今回予定していた「BluemixでIoT 温湿度、気圧を収集・蓄積・可視化+LED制御」は、全て完了です。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2