ESPr® Branch 32(Groveコネクタ付き)を使ってWiFi温度センサーを作る
第3回スケッチを書き込み動作確認
今回はESPr® Branch 32(Groveコネクタ付き)を使って、
- 温度センサーモジュールDS18B20の値をスマホに表示
- 設定温度を超えたらLINEに通知
するのが最終的な目的です。 手順としては、
- ESPr® Branch 32(Groveコネクタ付き)に Arduinoのプログラム(スケッチ)を書くためのソフトウェアのインストールと設定。
- ESPr® Branch 32(Groveコネクタ付き)とDS18B20(温度センサーモジュール)との配線。
- センサーの測定値をIoTデータの可視化サービスAmbientへ送信してグラフ表示するための設定。
- 設定温度を超える温度になった時、プラットフォームを連携させるWebサービス「IFTTT」を介してLINEに通知するための設定。
- ESPr® Branch 32(Groveコネクタ付き)へのスケッチの書き込み。
- 記事の内容は2021/12/4に書き始めております。
第3回目は、ESPr® Branch 32にスケッチを書き込みます。
スケッチは下記の通りとなります。
各自の環境に合わせて書き換える箇所は、後半で。
#include "Ambient.h" #include <OneWire.h> #include <WiFi.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 26 //温度センサーの黄色の線をESP32-WROOM-32の26番ピンに接続 #define uS_TO_S_FACTOR 1000000 //マイクロ秒から秒への変換係数 #define TIME_TO_SLEEP 300 //ESP32がスリープする期間を定義 (秒) OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); WiFiClient client; Ambient ambient; // ESPr個体ごとのID設定 const char* kotaiId = "1"; // ESP32が接続するWi-Fiアクセスポイントの設定 const char* ssid = "SSID"; //無線ルーターのSSID const char* password = "PASS"; //無線ルーターのパスワード // Ambientのチャネル設定 unsigned int channelId = 12345; //AmbientのチャネルID const char* writeKey = "witekey"; //Ambientのライトキー //IFTTTの設定 const char* host = "maker.ifttt.com"; const char* secretkey = "IFTTTkey"; void setup() { int lpcnt=0 ; Serial.begin(115200); //デバッグ用にシリアルを開く delay(1000); //シリアルモニターを開くまでの時間 esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds"); //ディープスリープ状態の時すべてのRTC周辺機器をオフに設定 esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); //アクセスポイントに接続する while (WiFi.status() != WL_CONNECTED) { //接続完了したかどうかを判断 delay(500); //完了していなければ0.5秒間待つ lpcnt +=1 ; if (lpcnt>10) { ESP.restart(); } Serial.print("."); //接続が確立するまで、・・・を表示 } //ここに来たら、接続完了している。 Serial.println(""); //改行して繋がったことをシリアルで伝える。 Serial.println("WiFi connected"); Serial.println("IP address: "); //WiFiの状態を表示 Serial.println(WiFi.localIP()); DS18B20.begin(); ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化 float celsius; //float celsius2; DS18B20.requestTemperatures(); // 温度取得要求 celsius = DS18B20.getTempCByIndex(0); // 温度センサーから摂氏気温を取得 //celsius2 = DS18B20.getTempCByIndex(1); //2本目の温度センサーから摂氏気温を取得 Serial.println(""); Serial.println("TEMP:" + String(celsius)); //Serial.println("TEMP:" + String(celsius2)); delay(10); const char* event =""; if (celsius >= 30 || celsius == -127) { //温度が30℃以上または-127℃なら event = "high_temp"; } Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/trigger/"; url += event; url += "/with/key/"; url += secretkey; url += "?value1="; url += String(celsius); url += "&value2="; url += String(kotaiId); Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(1000); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); Serial.println("closing connection"); // センサー値をAmbientに送信する ambient.set(1, celsius); //ambient.set(2, celsius2); ambient.send(); Serial.println("Configured all RTC Peripherals to be powered down in sleep"); Serial.println("Going to sleep now"); Serial.flush(); WiFi.disconnect(true); esp_deep_sleep_start(); //ディープスリープスタート Serial.println("This will never be printed"); } void loop() { }
5行目
温度センサーの黄色の線を繋ぐ場所を記述します。
この場合は26番に接続しています。
#define ONE_WIRE_BUS 26 |
8行目
ディープスリープする時間を秒で指定します。
ディープスリープ(省電力機能)を使用すると、電源に使用する乾電池等を長持ちさせる事が出来ます。
300で5分、600で10分です。
#define TIME_TO_SLEEP 300 |
17行目
ESPr® Branch 32を複数台使う時に識別するための設定です。
LINE通知に利用します。
const char* kotaiID = “1“; |
20〜21行目
使用している無線WifiルーターのSSIDとパスワードにします。
const char* ssid = “SSID“; const char* password = “PASS“; |
24〜25行目
アンビエントのチャネルIDとライトキーにします。
unsigned int channelId = 666666; const char* writeKey = “witekey“; |
Ambientを使ってみる
29行目
IFTTTのキーにします。
const char* secretkey = “IFTTTkey“; |
81行目〜83行目
温度計測の度にLINE通知はうるさいので、温度による条件で通知するかしないかを判断します。
82行目 LINEに通知する設定温度にします。 スケッチ例は30℃に設定しています。
例では30℃を超えるか、もしくは-127℃の時にLINE通知します。
83行目 IFTTTアプレットのイベント名にします。
この場合はhigh_tempにしています。
const char* event = “”; if (celsius >= 30 || celsius == -127) { event = “high_temp“; |
※-127℃の意味
デジタル温度センサーDS18B20は、結線間違いや接触不良、接続ピンの指定間違い等の時に「-127」のエラーを吐きます。
それを利用して結線間違いや接触不良をLINEに通知する事で、不具合を知る事が出来ます。
「85」のエラーを吐くこともあります。
書き込むためにESPr® Branch 32とパソコンをUSBケーブルでつなぎます。
シリアルポートを各自の環境に合わせて選択します。
ArudinoIDEの矢印アイコンを押すと、書き込みが始まります。
Connecting….._ _ _ _ _…… となったところでFLASHボタンを押すと書き込みが始まります。
書き込み完了です。
書き込みはこんな感じです。
書き込み失敗はよくある事。
諦めずに書き込みして下さい。
シリアルモニターで動作確認が出来ます。
WiFiの接続や温度計測が正しく行われているか確認しましょう。
電源に単1アルカリ電池3本を使用してみました。
5分ごとに温度計測で、電池3ヶ月持ちました。
参考URL
Arduinoライブラリの追加
異なるプラットフォームを連携する便利ツールIFTTT
LINE Notifyの使い方+IFTTTの基本操作
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/sleep_modes.html#
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。