ESP32C3でDS18B 20温度センサーを使用して、AmbientとDiscordにデーターを送信する

Line Notifyのサービス終了に伴う代替手段としてのDiscord導入について

Line Notifyは、IoTデバイスや各種サービスから通知を受け取る手軽な手段として利用されてきました。しかし、サービス終了により、新たな通知手段の確立が求められる状況となりました。この状況に対応するため、本コードでは、Line Notifyの代替サービスとしてDiscordのWebHook機能を利用し、通知メッセージを送信する仕組みを実装しました。


Discordを選んだ理由

  1. 無料で利用可能
    Discordは基本的な利用が無料で提供されており、通知機能を含む多くの機能をコストゼロで利用できます。
  2. WebHook機能の柔軟性
    DiscordのWebHook機能は、HTTPリクエストを通じて簡単にメッセージを送信できるため、既存のIoTデバイスやプログラムとの統合が容易です。
  3. リッチな通知
    Discordでは、単なるテキストメッセージだけでなく、埋め込みメッセージやファイル添付も可能なため、通知内容を柔軟に拡張できます。
  4. 信頼性とサポート
    世界中で広く利用されているプラットフォームであるため、安定した通知サービスとして期待できます。

本コードの概要

このコードでは、温度センサー(DS18B20)を使用して取得したデータをDiscordのWebHookを通じて通知します。また、データはAmbientにも送信されるため、履歴管理や可視化も可能です。

具体的な機能は以下の通りです:

  1. 温度データの取得
    • DS18B20センサーを使用して温度データを読み取ります。
    • センサーの省電力運用のため、必要なタイミングでセンサーの電源をオン・オフします。
  2. 異常値検知
    • 温度が特定の閾値(例: 28°C以上またはエラー値)を超える場合に、通知を送信します。
  3. 通知の送信
    • DiscordのWebHookを使用して、温度データやアラートをテキストメッセージとして送信します。
    • 通知内容には、デバイスIDや具体的な測定値が含まれます。
  4. 省電力設計
    • 温度測定後、デバイスを一定時間ディープスリープ状態にすることで、電力消費を最小限に抑えます。

DiscordのWebHook機能の仕組み

DiscordのWebHookは、特定のチャネルにデータを投稿するためのエンドポイント(URL)を提供します。このエンドポイントに対してHTTPリクエストを送信するだけで、メッセージを簡単に投稿できます。本コードでは、この仕組みを利用して、温度センサーから取得したデータや警告メッセージをリアルタイムで送信します。


実装のポイント

  1. WebHookの設定
    • DiscordでWebHookを作成し、エンドポイントURLを取得します。このURLは本コード内でDISCORD_WEBHOOKとして指定します。
  2. センサーの省電力制御
    • センサーの電源を操作するピンを設定し、必要なときだけセンサーを有効化します。
  3. エラーハンドリング
    • センサーのデータ読み取りが失敗した場合や、通信が失敗した場合にも、適切にエラーメッセージを送信します。
  4. ディープスリープの活用
    • デバイスを測定後にスリープさせることで、バッテリー駆動時の運用効率を向上させています。

動作概要
このプログラムは、DS18B20温度センサーを使用して温度データを読み取り、それをDiscordとAmbientに送信します。電源効率のため、センサーの電源は必要な時のみオンにし、使用後にオフにします。また、デバイスはデータ送信後にディープスリープ状態に入り、5分後に再起動します。

/*
  DS18B20センサーの値をDiscordおよびAmbientにWebHookを使用して送信します。
  OneWire、DallasTemperature、Ambientライブラリが必要です。
*/

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Discord_WebHook.h>
#include <Ambient.h>
#include <WiFiClient.h>
#include <esp_sleep.h>

Discord_Webhook discord;
Ambient ambient;
WiFiClient client;

  // デバイス個体ごとのID設定
  const char* kotaiID = "1";

// How to get the Webhook URL
// https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
String DISCORD_WEBHOOK = "https://discord.com/api/webhooks/id/token";

// Define the pin to control power to the DS18B20 sensor
const int SENSOR_POWER_PIN = 3;
// Define the OneWire pin
const int ONE_WIRE_PIN = 4;

OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);

// Ambient settings
const char* userKey = "ユーザーキー";
char devKey[20];
unsigned int channelId;
char writeKey[20];

void setup() {
  Serial.begin(115200);

  uint8_t mac[6];
  esp_read_mac(mac, ESP_MAC_WIFI_STA);  // Wi-FiのMACアドレスを取得する
  sprintf(devKey, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  Serial.println(devKey);

  // Set the power pin as output and turn off the sensor initially
  pinMode(SENSOR_POWER_PIN, OUTPUT);
  digitalWrite(SENSOR_POWER_PIN, LOW);

  discord.begin(DISCORD_WEBHOOK); // Initialize the Discord_Webhook object
  discord.addWiFi("SSID", "PASSWORD"); // Add WiFi credentials (you can add multiple WiFi SSIDs)
  discord.connectWiFi(); // Connect to WiFi

  if (ambient.getchannel(userKey, devKey, channelId, writeKey, sizeof(writeKey), &client) == false) {
    Serial.printf("Cannot get channelId. Please set DeviceKey (%s) to Ambient.\r\n", devKey);
    while (true) {
      delay(0);
    }
  }
  Serial.printf("channelId: %d, writeKey: %s\r\n", channelId, writeKey);

  // Initialize Ambient
  ambient.begin(channelId, writeKey, &client);

  // Initialize the DS18B20 sensor
  sensors.begin();
}

void loop() {
  // Turn on the sensor
  digitalWrite(SENSOR_POWER_PIN, HIGH);
  delay(500); // Wait for the sensor to power up

  sensors.requestTemperatures(); // Request temperature readings
  delay(750);

  float temperature = sensors.getTempCByIndex(0); // Get temperature in Celsius

   Serial.println("");
   Serial.println("TEMP:" + String(temperature));
      delay(10);
  if (temperature != DEVICE_DISCONNECTED_C) {
    Serial.println("DS18B20 read success");

    // Send data to Discord if temperature is above 28°C or equals -127°C
    if (temperature > 28.0 || temperature == -127.0) {
      discord.send("Alert! Temp: " + String(temperature) + "°C detected." + " ID: " + String(kotaiID));
      }

    // Send data to Ambient
    ambient.set(1, temperature); // Set the first data field to the temperature value
    if (ambient.send()) {
      Serial.println("Ambient data sent successfully");
    } else {
      Serial.println("Failed to send data to Ambient");
    }
  } else {
    Serial.println("DS18B20 read failed");
    discord.send("Error: DS18B20 sensor read failed. Check sensor connection.");
  }

  // Turn off the sensor
  digitalWrite(SENSOR_POWER_PIN, LOW);

  // Enter deep sleep for 5 minutes
  esp_sleep_enable_timer_wakeup(5 * 60 * 1000000); // 5 minutes in microseconds
  esp_deep_sleep_start();
}
コードの詳細な説明:
  1. ライブラリのインクルード
    以下のライブラリを使用しています:
    • OneWire: センサーとの通信をサポート。
    • DallasTemperature: DS18B20センサーの温度読み取りに使用。
    • Discord_WebHook: Discord WebHookでデータを送信。
    • Ambient: Ambientプラットフォームにデータを送信。
    • WiFiClient: Wi-Fi通信のため。
  2. 設定項目
    • kotaiID: デバイスの個体識別用ID。
    • DISCORD_WEBHOOK: Discord WebHookのURL(設定方法はリンク参照)。
    • SENSOR_POWER_PIN: センサーの電源制御ピン(ピン番号7)。
    • ONE_WIRE_PIN: OneWire通信用ピン(ピン番号6)。
    • userKey: Ambientユーザキー。
  3. setup()関数
    • デバイスの初期化を行います:
      • シリアル通信の開始。
      • デバイスのWi-Fi MACアドレスを取得し、devKeyに保存。
      • センサーの電源制御ピンを出力モードに設定し、初期状態で電源オフ。
      • Discord WebHookとWi-Fiに接続。
      • Ambientのチャンネル情報を取得し、設定。
      • DS18B20センサーの初期化。
  4. loop()関数
    メイン処理:
    • センサーの電源をオンにし、温度読み取り。
    • 温度をDiscordおよびAmbientに送信:
      • 温度が28°Cを超える場合、または-127°Cの場合はDiscordにアラート送信。
      • Ambientには常に温度を送信。
    • センサーの電源をオフ。
    • デバイスを5分間のディープスリープに入る。

専用基板

DS18B20を2本実装可能 その他BME280搭載 温湿度・気圧センサモジュール用ピン、バッテリー電圧監視用ピンを取り出した。

Discordの画面

今後の展望

DiscordのWebHook機能を使用した通知システムは柔軟性が高いため、将来的には以下のような拡張も可能です:

  • 複数のデータフィールドやセンサーを統合して、より詳細な通知を実現。
  • データの可視化や分析のために、他のクラウドサービスと連携。
  • 通知内容の多言語化やカスタマイズ。

Line Notifyからの移行に伴い、今回のコードは代替手段として適切な機能を提供するものです。Discordを活用することで、今後も信頼性の高い通知システムを維持することが期待されます。

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

この記事の著者

momo

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

この著者の最新の記事

関連記事

コメント

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

  1. この記事へのトラックバックはありません。

2025年1月
 12345
6789101112
13141516171819
20212223242526
2728293031  

カテゴリー

ページ上部へ戻る