メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

ESP32のTalkBackでライトを制御する

この例では、ThingSpeak ™ TalkBackキューからコマンドを取得し、それを使用してオンボード LED のステータスを変更する方法を示します。

キューにコマンドがある場合にのみ実行するマシンがアプリケーションに関係する場合は、 TalkBack を使用します。

この例では、 TalkBackキューに TURN_ON または TURN_OFF を書き込み、デバイスはコマンドに合わせてオンボード LED の状態を変更します。デバイスのコマンドを保存するには、 TalkBackアプリ を使用します。Web インターフェース または HTTP コマンドを使用して、デバイス コマンドをリストに書き込みます。リストには最大 8000 個のコマンドを保存できます。デバイスはコマンド リストを読み取るたびに、コマンドを 1 つ読み取り、リストから最新のコマンドを削除します。

サポートされているハードウェア

  • ESP32

前提条件

この例を完了するには、少なくとも 1 つのチャネルを設定する必要があります。新しいチャネルでデータを収集するに示すようにチャネルを作成し、書き込み API キーを記録します。TalkBackも設定する必要があります。[Apps] > [TalkBack] に移動して、[New TalkBack] を選択します。

TalkBackキューにコマンドを追加する

TalkBackキューにコマンドを追加するには、次の 2 つの方法があります。

  • TalkBackキューにコマンドを追加するには、ThingSpeak TalkBack Web インターフェースを使用します。TalkBack は最大 8000 個のコマンドを持つように設定できます。

  • ThingSpeak API を使用します。HTTP POST要求を使用して、コマンドをキューに追加できます。次の POST で、TALKBACK_IDYOUR_TALKBACK_API_KEYTALKBACK_COMMANDPOSITION_NUMBER を、ご使用のチャネルの適切な値に置き換えます。

POST https://api.thingspeak.com/talkbacks/TALKBACK_ID/commands
 api_key=YOUR_TALKBACK_API_KEY
     command_string=TALKBACK_COMMAND
     position=POSITION_NUMBER

ESP32 をプログラムする

1) 最新の Arduino® IDE をダウンロードします。

2) ESP32 コアをインストールします。詳細については、「Arduino ESP32 サポートのインストール」を参照してください。

3) ツール メニューで、Arduino IDE で適切なポートとボードを選択します。この例は、Sparkfun ESP32 Thing オプションを使用してテストされています。

4) コードを Arduino IDE に貼り付けます。Wi-Fi ネットワーク情報、 TalkBack API キー、 TalkBack番号を追加します。

5) デバイスをプログラムし、シリアル モニターと LED を監視して、コマンドが実行されたときの変化を観察します。実行された各コマンドはリストから削除されます。コマンドが消費された後、リストにさらにコマンドを追加する必要があります。

コード

1) まず、適切なライブラリをインクルードし、変数を定義します。ネットワークのSSIDとパスワードを入力します。チャネル番号とTalkBackパラメーターを入力してください: myTalkBackID と my TalkBackKey

/*
FetchCommandFromTalkBack

Description: Checks a TalkBack queue every 60 seconds and set the state of the build in LED according
             to the latest command fetched. Turn the LED on and off by using the commands TURN_ON and TURN_OFF.
             The TalkBack documentation can be found at https://www.mathworks.com/help/thingspeak/talkback-app.html.
             
Hardware: ESP32-based boards

Notes:
- Requires installation of EPS32 core.
- Select the target hardware from the Tools > Board menu

Copyright 2018, The MathWorks, Inc.
*/

#include <WiFi.h>

char ssid[] = <enter your SSID>;   // Your network SSID (name) 
char pass[] = <enter your password>;   // Your network password

WiFiClient  client;

unsigned long myTalkBackID = <enter your TalkBack ID>;
const char * myTalkBackKey = <enter your TalkBack API key>;

2) setup 関数で LED を初期化し、シリアル モニターを起動します。

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);  // Set up LED
  Serial.begin(115200);          // Initialize serial
  WiFi.mode(WIFI_STA);
}

3) メイン ループでは、まずローカル Wi-Fi ネットワークへの接続を確立します。正しいパラメーターを使用して POST メッセージを作成します。POST要求を送信し、結果を確認し、 TalkBackコマンドをチェックします。60 秒待ってからキューを再度確認してください。

void loop() {

  // Connect or reconnect to Wi-Fi
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(String(ssid));
    while(WiFi.status() != WL_CONNECTED){
      WiFi.begin(ssid, pass);  
      Serial.print(".");
      delay(5000);     
    } 
    Serial.println("\nConnected.");
  }

  // Create the TalkBack URI
  String tbURI = String("/talkbacks/") + String(myTalkBackID) + String("/commands/execute");
  
  // Create the message body for the POST out of the values
  String postMessage =  String("api_key=") + String(myTalkBackKey);                      
                       
   // Make a string for any commands that might be in the queue
  String newCommand = String();

  // Make the POST to ThingSpeak
  int x = httpPOST(tbURI, postMessage, newCommand);
  client.stop();
  
  // Check the result
  if(x == 200){
    Serial.println("checking queue..."); 
    // check for a command returned from TalkBack
    if(newCommand.length() != 0){

      Serial.print("  Latest command from queue: ");
      Serial.println(newCommand);
      
      if(newCommand == "TURN_ON"){
        digitalWrite(LED_BUILTIN, HIGH);  
      }

      if(newCommand == "TURN_OFF"){
        digitalWrite(LED_BUILTIN, LOW);
      }
    }
    else{
      Serial.println("  Nothing new.");  
    }
    
  }
  else{
    Serial.println("Problem checking queue. HTTP error code " + String(x));
  }

  
  delay(60000); // Wait 60 seconds to check queue again
}

4) httpPOST 関数を使用して、次のTalkBackコマンドを読み取ります。

// General function to POST to ThingSpeak
int httpPOST(String uri, String postMessage, String &response){

  bool connectSuccess = false;
  connectSuccess = client.connect("api.thingspeak.com",80);

  if(!connectSuccess){
      return -301;   
  }
  
  postMessage += "&headers=false";
  
  String Headers =  String("POST ") + uri + String(" HTTP/1.1\r\n") +
                    String("Host: api.thingspeak.com\r\n") +
                    String("Content-Type: application/x-www-form-urlencoded\r\n") +
                    String("Connection: close\r\n") +
                    String("Content-Length: ") + String(postMessage.length()) +
                    String("\r\n\r\n");

  client.print(Headers);
  client.print(postMessage);

  long startWaitForResponseAt = millis();
  while(client.available() == 0 && millis() - startWaitForResponseAt < 5000){
      delay(100);
  }

  if(client.available() == 0){       
    return -304; // Didn't get server response in time
  }

  if(!client.find(const_cast<char *>("HTTP/1.1"))){
      return -303; // Couldn't parse response (didn't find HTTP/1.1)
  }
  
  int status = client.parseInt();
  if(status != 200){
    return status;
  }

  if(!client.find(const_cast<char *>("\n\r\n"))){
    return -303;
  }

  String tempString = String(client.readString());
  response = tempString;
  
  return status;
}