ESPr® DeveloperでAmbientにデバイスキーでデータ送信

Ambientでは、端末ごとの固有のキー(デバイスキー)をチャネルに対応付け、端末からデバイスキーを送って、対応するチャネルIDとライトキーを取得する機能があります。
デバイスキーとしては端末の通信デバイスの物理アドレス(MACアドレス)など端末ごとに固有のデーターを使います。
Ambientのgetchannel()関数を使って、複数台の端末でも同じプログラムで端末ごとに別のチャネルにデーターを送信できるようになる機能を使用します。
Ambientでは4ヶ月間使用しないとチャンネルを削除されてしまいます。
チャンネルキーとライトキーの指定でスケッチを書いている場合は再度チャンネルを作り、それに合わせてスケッチ書き込みをしなければなりません。
デバイスキーとユーザーキーの指定であれば、チャンネル削除された場合Ambient側の再設定だけで済みます。
スケッチはAmbient再設定後でもそのまま使用出来ますので、改めて書き込みする必要がありません。


ESPr® Developerのセットアップ

こちらはESPr® Branch 32(Groveコネクタ付き)を使って、
温度センサーモジュールDS18B20の値をスマホに表示
設定温度を超えたらLINEに通知するのが目的です。

後述するスケッチをこちらの投稿のものにすることで、デバイスキーでのアクセスが可能となります。

ESPr® Developer32

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);

  // ESPr個体ごとのID設定
  const char* kotaiId = "1";

  // ESP32が接続するWi-Fiアクセスポイントの設定
  const char* ssid = "SSID";  //無線ルーターのSSID
  const char* password = "PASS";  //無線ルーターのパスワード

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

    //IFTTTの設定
  const char* host = "maker.ifttt.com";
  const char* secretkey = "シークレットキー";

  WiFiClient client;
  Ambient am;          // Ambientオブジェクトを作る

 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); 

  uint8_t mac[6];
  WiFi.macAddress(mac);  // 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);

  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());

    if (am.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);  

    am.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化   

    DS18B20.begin();
 }
  void loop() {

      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に送信する
    am.set(1, celsius);
  //am.set(2, celsius2);

    am.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");
  }

ESPr® Developer

こちらは参考まで。
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "Ambient.h"  
#define ONE_WIRE_BUS 14  //温度センサーをESP-WROOM-02の14番ピンに接続

  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature DS18B20(&oneWire);
  
  // ESPr個体ごとのID設定
  const char* kotaiId = "1";
  
  // ESP8266が接続するWi-Fiアクセスポイントの設定
  const char* ssid = "SSID";
  const char* password = "pass";

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

  //IFTTTの設定
  const char* host = "maker.ifttt.com";
  const char* secretkey = "シークレットキー";

  WiFiClient client;
  Ambient am;           // Ambientオブジェクトを作る

 void setup() {

  Serial.begin(115200);  //デバッグ用にシリアルを開く
  delay(10);
    uint8_t mac[6];
    WiFi.macAddress(mac);  // 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);   

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid,password);
  
  while (WiFi.status() != WL_CONNECTED) {  //接続が確立するまで、・・・を表示
    delay(500);
    Serial.print(".");
  }
 
  //ここに来たら、接続完了している。
 
  Serial.println("");             //改行して繋がったことをシリアルで伝える。
  Serial.println("WiFi connected");  
   
  Serial.println("IP address: ");   //WiFiの状態を表示
  Serial.println(WiFi.localIP());

    if (am.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);

    am.begin(channelId, writeKey, &client);
    
    DS18B20.begin();
   }  
    int value = 0; 

  void loop() {
      float celsius = 0;
      //float celsius2 = 0;
      DS18B20.requestTemperatures();
      celsius = DS18B20.getTempCByIndex(0);
      //celsius2 = DS18B20.getTempCByIndex(1);     
    
    Serial.println("");
    Serial.println("TEMP:" + String(celsius));
    //Serial.println("TEMP:" + String(celsius2));
    ++value; 
      delay(10);

  char* event = "";
  if (celsius >= 32 || celsius == -127) {
    event = "イベント名";  
  }

  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に送信する
    am.set(1, celsius);
    //am.set(2, celsius2);

    am.send();    

      delay(2000);

  ESP.deepSleep(300 * 1000 * 1000, RF_DEFAULT); //復帰までのタイマー時間設定
  delay(1000); 
  }
  • このエントリーをはてなブックマークに追加
  • follow us in feedly

この記事の著者

momo

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

この著者の最新の記事

関連記事

コメント

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

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

2024年4月
1234567
891011121314
15161718192021
22232425262728
2930  

カテゴリー

ページ上部へ戻る