Main Content

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

ESP32によるチャネル更新と照明制御

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

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

チャネルを更新すると同時に、 TalkBackキューに保存されている最新のコマンドを取得できます。パラメーターtalkback_key をPOST要求に追加すると、 ThingSpeak は応答で最新のTalkBackコマンドを返します。

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

  • ESP32

前提条件

この例を完了するには、少なくとも 1 つのチャネルを設定する必要があります。Create a Channel、「新しいチャネルでデータを収集し、書き込み API キーを記録する」に示すように。TalkBackも設定する必要があります。«アプリ» > «TalkBacks» に移動し、«新しいTalkBack» を選択します。

« TalkBackキューにコマンドを追加»

2 つの方法のいずれかでコマンドをTalkBackキューに追加できます。

  • ThingSpeak «TalkBack» Web インターフェイスを使用して、 TalkBackキューにコマンドを追加します。TalkBack は、最大で 8000 のコマンドを保持するように構成できます。

  • ThingSpeak API を使用します。HTTP POST要求を使用してコマンドをキューに追加できます。次の POST で、 TALKBACK_IDYOUR_TALKBACK_API_KEYTALKBACK_COMMAND、およびPOSITION_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 コアをインストールします。詳細については、 「Install Arduino ESP32 Support」を参照してください。

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

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

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

コード

1) 適切なライブラリを組み込み、変数を定義することから始めます。ネットワークの SSID とパスワードを入力します。チャネル番号とTalkBackパラメーターを入力します。myTalkBackIDおよびmyTalkBackKey

WriteMultipleFieldsAndFetchCommandFromTalkBack

Description: Checks a TalkBack queue every 60 seconds and sets the state of the built 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 myChannelNumber = <enter your channel ID>;
unsigned long myTalkBackID = <enter your talkback ID>;
const char * myTalkBackKey = <enter your TalkBack API Key>;

// Initialize values for ThingSpeak updates
int number1 = 0;
int number2 = random(0,100);
int number3 = random(0,100);
int number4 = random(0,100);

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コマンドを確認します。次に、新しい乱数を生成して、20 秒後に再度投稿します。

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 message body for the POST out of the values
  String postMessage =  String("field1=") + String(number1) +
                        String("&field2=") + String(number2) +
                        String("&field3=") + String(number3) +
                        String("&field4=") + String(number4) +
                        String("&api_key=") + String(myWriteAPIKey) +
                        String("&talkback_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(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));
  }

  // Confirm code works by changing values
  number1++;
  if(number1 > 99){
    number1 = 0;
  }
  number2 = random(0,100);
  number3 = random(0,100);
  number4 = random(0,100);
  
  delay(20000); // Wait 20 seconds to update the channel again
}

4) httpPOST関数を使用して、データをThingSpeakに送信し、次のTalkBackコマンドを読み取ります。

int httpPOST(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 /update 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;
}