ATOM Liteで温度計測 ~ 結果はLINE Notify

2022年12月14日

AtomTemp1

冬がやってきました。私の住む町は、地球温暖化で昔のように寒くはならないとは言え、氷点下20度前後になる日があります。そのような日は早めにストーブを点けたいですが、予報に反して寒い日もあり、事前に分かる仕組みが欲しいです。そこで、指定気温より下がったらスマートフォンへ通知する仕組みを作ります。

温度の計測はATOM Liteで行います。本当は指定温度以下になったらリレーを動かしてヒーターをONにするのが良いですが、大掛かりですし安全性に疑問があるので、スマートフォンに通知するだけにします。スマートフォンへの通知はLINE Notifyを使います。

※LINE Notifyのサービスが、2025年3月31日に終了します。残念です

1.ATOM LiteとBME280は離す

AtomTemp2

以前に、M5StickCBME280を使うプログラムを作りました。これはProto HatM5StickCと接続して使うものでしたが、M5StickC本体の熱が伝わって正確な温度が測れませんでした。そこで今回は、ATOM Lite自作Hatは離して使うことにします。

そして、スマートフォンへの通知はLINE Notifyで行います。通知が来たら暖かい服装でトイレに行って1時間ヒーターを動かします。(通常、ヒーターは人感センサーで作動する)

BME280におけるSCLSDAの接続ですが、SCLGPIO25に接続し、SDAGPIO21に接続します。

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度)。これは、ボタンで変えられるようにすると良いでしょう。

AtomTemp3
※20度以下で通知にしています

スマートフォンLINEアプリに通知が来ます。

3.簡単にスマートフォン通知システムができる

スマートなんちゃらで、計測機器の結果をスマートフォンに通知するシステムが良くニュースで取り上げられています。そして、そのシステム導入には莫大なお金が使われていると思います。そうしないと、仕事として成り立たないからでしょう。

しかし、今回のシステムを見ても分かるとおり、安く済ませる方法はたくさんあります。システムを導入する時には、提案を鵜吞みにせず、費用対効果の良いシステムを構築しましょう。