ESPr® Branch 32(Groveコネクタ付き)を使ってWiFi温度センサーを作る 第3回スケッチを書き込み動作確認

ESPr® Branch 32(Groveコネクタ付き)を使ってWiFi温度センサーを作る

第3回スケッチを書き込み動作確認

今回はESPr® Branch 32(Groveコネクタ付き)を使って、

  1. 温度センサーモジュールDS18B20の値をスマホに表示
  2. 設定温度を超えたら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#

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

この記事の著者

toru

1966年訓子府町生まれの訓子府育ち。玉葱や米、メロンを栽培する農家です。一眼レフを本格的に始めたのは2005年。仕事の時でもいつでもカメラを持ち歩く自称農場カメラマン。普段の生活を撮るのが主で、その他ストロボを使っての商品撮影、スタジオ撮影も。愛好家グループで年1回写真展を行っている。農機具の改造や作製、電子工作など、モノづくりが大好きです。

この著者の最新の記事

関連記事

コメント

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

2022年8月
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

ページ上部へ戻る