4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Qiita電子工作部】ニトリLEDデジタル時計(改)からThingSpeakへ温度、湿度、気圧データをおくってみた

Last updated at Posted at 2021-04-12

title

目次

はじめに

今日は2021年GW初日。自宅に引きこもっています。ちょくちょく現場に出勤しているものの、ほぼ毎日在宅勤務です。

そんな毎日を過ごしていると、2月ぐらいにしょうもないアイデアが出てきました。

  • ホームセンター「ニトリ」で買ったLEDデジタル時計(ホルツM)をESP32-WiFi-NTP時計に改造できるんじゃない?

で、とりあえずできちゃいました。目標達成です作成済みの記事はちょくちょく改修していく予定です。

余力があったので、引き続きこのネタを少しだけ深堀りしようと思います。

目標は次のとおり。

  • BME280の温度・湿度・気圧をクラウドサービスに送ってみる。(IFTTT, ThingSpeakとかとか)
  • DAISOで買ってきた人感センサーライト(税込330円)を再利用して、じいじ、ばあばの動きを検出したら、孫に通知を出す仕組みを作ってみる。

開発環境について

VSCode+PlatformIO+arduino-esp32+m5Stack ATOM Liteでサンプルコードを作成しています。

ライブラリのインポート方法はplatformio.iniファイルPlatformIOドキュメントなどを参照してください。

BME280の温度・湿度・気圧をクラウドサービスに送ってみる。(ThingSpeak)

ThingSpeakって何?

The MathWorks, Incが運営している、IoT機器が記録したデータを分析するプラットフォームサービスです。Facebookで海外の方が紹介していたので使ってみました。

About ThingSpeak
ThingSpeak is an IoT analytics platform service that allows you to aggregate, visualize, and analyze live data streams in the cloud. You can send data to ThingSpeak from your devices, create instant visualization of live data, and send alerts.
ThingSpeakは、ライブデータストリームをクラウド上で集約、可視化、分析することができるIoT分析プラットフォームサービスです。デバイスからThingSpeakにデータを送信し、ライブデータを瞬時に可視化したり、アラートを送信することができます。

#DeepLで翻訳したら、かなり自然な日本語文が出てきた。:open_mouth:

ThingSpeakにアカウントを作って「チャンネル」を作成しました。さらに、ニトリNTP時計から送ったデータをグラフで表示させてみました。

チャンネルキャプチャ画面

image.png

グラフはiframeでブログやWikiのWebページに埋め込めるようです。QiitaやGitHubはiframeを許可してないので、埋め込めません。キャプチャ画像を貼っておきます。

ThingSpeakへ気温、湿度、気圧データを送るにはREST APIを叩く

ThingSpeakのチャンネルにはREST APIキーが与えられていて、そのキーを含むURIへリクエストを送るとChannel Feedへデータを書き込めます。APIキーはWrite API KeyRead API Keysがあります。Read API Keysは公開しても問題ないと思います。

2021-04-29_1619667584.png

REST APIはこのような感じ。1

Write a Channel field
GET https://api.thingspeak.com/update?api_key=XXXXXXXXXX&field1=0
Read a Channel field
GET https://api.thingspeak.com/channels/1361249/fields/1.json?results=2

ESP32(ATOM Lite)からThingSpeak APIを叩いてみる

ThingSpeakがAPIを叩く為のarduino-esp32ライブラリをすでに提供してくれていました。WiFiClientSecureライブラリとthingspeak-arduinoライブラリを使いました。わたしが作成したサンプルはGitHubにあります。

WiFiClientSecure.hライブラリとThingSpeak.hライブラリを読み込みます。#define TS_ENABLE_SSLを忘れないように。

main.cpp
#define TS_ENABLE_SSL //Don't forget it for ThingSpeak.h!!
#include <SerialTelnetBridge.h>
#include <Ticker.h>
#include <ESPUI.h>
#include <TM1637Display.h>
#include <BME280Class.h>
#include <Button2.h>
#include <WiFiClientSecure.h>
#include <ThingSpeak.h>
#include "secrets.h"

secrets.hを読み込みます。このファイルにSECRET_CH_ID, SECRET_WRITE_APIKEYSECRET_TS_ROOT_CAを定義します。
下に示したSECRET_TS_ROOT_CAはサンプルからコピーしたものです。
SECRET_TS_ROOT_CAの作成方法はArduino – ESP32 WiFiClientSecure ライブラリで、安定して https ( SSL )記事をGETする方法を参照してください。ルート証明書はしばらく更新されないと思われます。更新されると、ThingSpeak APIにリクエストを送ってもレスポンスが返ってきませんので注意してください。

有効期限(Expiration Date)
Expiration Date: November 9, 2031 at 7:00:00 PM EST

secrets.h
#define SECRET_CH_ID 0000000      // replace 0000000 with your channel number
#define SECRET_WRITE_APIKEY "XYZ" // replace XYZ with your channel write API Key

// ThingSpeak Root Certificate, Expiration Date: November 9, 2031 at 7:00:00 PM EST
#define SECRET_TS_ROOT_CA "-----BEGIN CERTIFICATE-----\n"                                      \
                          "MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\n" \
                          "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" \
                          "d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\n" \
                          "ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\n" \
                          "MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\n" \
                          "LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\n" \
                          "RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\n" \
                          "+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\n" \
                          "PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\n" \
                          "xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\n" \
                          "Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\n" \
                          "hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\n" \
                          "EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\n" \
                          "MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\n" \
                          "FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\n" \
                          "nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\n" \
                          "eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\n" \
                          "hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\n" \
                          "Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\n" \
                          "vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\n" \
                          "+OkuE6N36B9K\n"                                                     \
                          "-----END CERTIFICATE-----\n"

つぎのようにThingSpeakライブラリを初期化します。

main.cpp
WiFiClientSecure _client;
...
void initThingSpeak(void)
{
    _client.setCACert(certificate);
    ThingSpeak.begin(_client);
}

setup()で初期化実行します。WiFiアクセスポイントにつながってから実行します。

main.cpp
void setup(void)
{
...
    initThingSpeak();
...
}

つぎのような感じで、ThingSpeakへデータを送ります。

main.cpp
void sendThingSpeakChannel(float temperature, float humidity, float pressure)
{
    ThingSpeak.setField(1, temperature);
    ThingSpeak.setField(2, humidity);
    ThingSpeak.setField(3, pressure);

    // write to the ThingSpeak channel
    int code = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    if (code == 200)
        log_d("Channel update successful.");
    else
        log_d("Problem updating channel. HTTP error code %d", code);
}

わたしの作成したコードでは、Tickerライブラリを使って1分毎にチャンネルへデータを送信しています。無料アカウントの場合、あるリクエストから次のリクエストまでの間隔が15秒以上必要という制限があります。データの送信に失敗する場合は適切なウェイトを入れてください。

おわりに

次は、このニトリLEDデジタルWiFi-NTP時計にPIRセンサー(人感センサー)を取り付けた場合について記事を書きたいと思います。
このPIRセンサーはDAISOで購入した人感センサーライト(税込み330円)をばらして制御基板をそのままニトリLEDデジタル時計に組み込んでみました。
この人感センサーをつかって、「じいじ、ばあばの動きを検出したら、孫に通知を出す仕組みを作ってみる。」を実現してみたいと思います。

(了)

  1. 書き込んでいるのにGETリクエストですね。PUTじゃないの?新規にフィールドを作成しているわけではないので、POSTではないよね。
    チャンネルにはfieldが8個用意されています(field1~field8)。...&field1=24.999 ...&field8=1021.22のようにしてデータを送信します。

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?