ATOM Liteで温度計測 ~ 結果はLINE Notify
冬がやってきました。私の住む町は、地球温暖化で昔のように寒くはならないとは言え、氷点下20度前後になる日があります。そのような日は早めにストーブを点けたいですが、予報に反して寒い日もあり、事前に分かる仕組みが欲しいです。そこで、指定気温より下がったらスマートフォンへ通知する仕組みを作ります。
温度の計測はATOM Liteで行います。本当は指定温度以下になったらリレーを動かしてヒーターをONにするのが良いですが、大掛かりですし安全性に疑問があるので、スマートフォンに通知するだけにします。スマートフォンへの通知はLINE Notifyを使います。
1.ATOM LiteとBME280は離す
以前に、M5StickCでBME280を使うプログラムを作りました。これはProto HatでM5StickCと接続して使うものでしたが、M5StickC本体の熱が伝わって正確な温度が測れませんでした。そこで今回は、ATOM Liteと自作Hatは離して使うことにします。
そして、スマートフォンへの通知はLINE Notifyで行います。通知が来たら暖かい服装でトイレに行って1時間ヒーターを動かします。(通常、ヒーターは人感センサーで作動する)
BME280におけるSCLとSDAの接続ですが、SCLをGPIO25に接続し、SDAをGPIO21に接続します。
2.プログラム
#include <M5Atom.h>
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BME280.h>
#include <math.h>
Adafruit_BME280 bme;
#include <WiFiClientSecure.h>
// Wi-Fi環境
const char* ssid = "XXXXXXXXX";
const char* password = "XXXXXXXXXX";
// Line Notify環境
const char* host = "notify-api.line.me";
const char* token = "*****************************************"; // トークン
// LINE Notify処理関数
void Line_notify(String msg) {
WiFiClientSecure client; // https接続
client.setInsecure();
if (!client.connect(host, 443)) {
delay(2000);
Serial.print("\nLine Notify disconnect");
return;
} else {
Serial.print("\nLine Notify connected");
}
String query = String("message=") + msg;
String request = String("") +
"POST /api/notify HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Authorization: Bearer " + token + "\r\n" +
"Content-Length: " + String(query.length()) + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
query + "\r\n";
client.print(request);
client.stop();
delay(2000);
}
void setup() {
// put your setup code here, to run once:
M5.begin(true, false, true);
Wire.begin(21,25);
M5.dis.drawpix(0, 0x00ff00);
if (!bme.begin(0x76)){
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
// Wi-Fiの接続
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED){
Serial.print('.');
delay(500);
}
Serial.println("\nWi-Fi connected");
M5.dis.drawpix(0, 0x0000ff);
}
void loop() {
// put your main code here, to run repeatedly:
float temp;
temp = (float)bme.readTemperature();
Serial.print("\nTemp = ");
Serial.print(temp);
if (temp < 10) {
// Line Notifyで通知
char msg[100];
sprintf(msg, "設定温度を下回りました:Temp = %2.1f", temp);
Line_notify(msg);
}
delay(600000); // 10分毎
}
LEDが青色になると、準備OKとなります。緑色のままだと、BME280やネット接続が確立していません。
指定温度はプログラムに直接書いています(上例では10度)。これは、ボタンで変えられるようにすると良いでしょう。
スマートフォンのLINEアプリに通知が来ます。
3.簡単にスマートフォン通知システムができる
スマートなんちゃらで、計測機器の結果をスマートフォンに通知するシステムが良くニュースで取り上げられています。そして、そのシステム導入には莫大なお金が使われていると思います。そうしないと、仕事として成り立たないからでしょう。
しかし、今回のシステムを見ても分かるとおり、安く済ませる方法はたくさんあります。システムを導入する時には、提案を鵜吞みにせず、費用対効果の良いシステムを構築しましょう。