
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#
コメント
この記事へのトラックバックはありません。















この記事へのコメントはありません。