LoginSignup
0
0

More than 5 years have passed since last update.

ElectricImpで部屋の温度と湿度を常時計測する

Posted at

今回使用しているElectricImpのボードは Imp004m です。

ElectricImpはhttpsでデバイスのデータや制御が行えるようになっています。

今回実装の概要はこんな感じ

スクリーンショット 2017-12-16 11.21.27.png


ElectricImpのIDEでセンサー側とセンサーからデータを受信する側のプログラムを記述

センサー側(Device側)

Device.squirrel
#require "HTS221.device.lib.nut:2.0.1"

// 温度湿度センサーの接続設定
hardware.i2cNM.configure(CLOCK_SPEED_400_KHZ);
tempHumid <- HTS221(hardware.i2cNM);
// 最終データを記録(agentに飛ばすため)
lastTemp <- "";
lastHumid <- "";

// agentにセンサー情報を送信
function sendTempHumid() {
    agent.send("sendTempHumid", [lastTemp, lastHumid]);
}

// センサーから温度湿度の情報を読み取る
function readTempHumid() {
  tempHumid.setMode(HTS221_MODE.CONTINUOUS, 7);

  local result = tempHumid.read();
  if ("error" in result) {
    server.error("An Error Occurred: " + result.error);
    lastTemp = "error";
    lastHumid = "error";
  } else {
    server.log(format("Current Humidity: %0.2f %s, Current Temperature: %0.2f °C", result.humidity, "%", result.temperature));
    lastTemp = result.temperature.tostring();
    lastHumid = result.humidity.tostring();
  }
  // agentに送信
  sendTempHumid();
  // 30秒後に自分をコールバック
  imp.wakeup(30.0, readTempHumid);
}

function getTempHumid(data) {
  readTempHumid();
}

// agent側から温度湿度の読み出しリクエストをデバイス内部関数呼び出しに変換
agent.on("getTempHumid", getTempHumid);

受信側(Agent側)プログラム

Agent.squirrel
function sendTempHumid(tempHumid) {
  // Send the device a 'pong' message immediately
  server.log("デバイス = " + tempHumid[0] + "度 / " + tempHumid[1] + "%");
  local url = "センサーデータ受信用サーバのAPIパス";

  // Prepare the request with a JSON payload
  local body = http.jsonencode({ "temp": tempHumid[0], "humid" : tempHumid[1] });
  local extraHeaders = {};
  local request = http.post(url, extraHeaders, body);

  // Send the message
  local incomingDataTable = request.sendsync();

  // Display the received data
  server.log("Code: " + incomingDataTable.statuscode + ". Message: " + incomingDataTable.body);
}

device.send("getTempHumid", null);
device.on("sendTempHumid", sendTempHumid);

データ格納側API(超絶手抜き)

write.php
<?php

$json_data = file_get_contents('php://input');
try {
  $json_data = json_decode($json_data);
  $db = pg_connect("******");
  $sql = sprintf(
         "INSERT INTO temphumids (temp, humid) VALUES(%s, %s);"
         , is_numeric($json_data->temp) ? $json_data->temp : 'null'
         , is_numeric($json_data->humid) ? $json_data->humid : 'null'
  );
  pg_query($db, $sql);

  echo "OK";
} catch(Exception $e) {
  echo "NG";
}

温度・湿度格納テーブル定義

col type
id biserial
temp float
humid float
created_at timestamp
updated_at timestamp

これで一通り、センサーからデータを読み取って外部のデータストアに格納するためのプログラムができました。
ほんと簡単。

0
0
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
0
0