Main Content

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

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

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

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

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

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

  • ESP8266 およびその他の ESP8266 ベースのボード

  • ノードMCU

  • ウェモス

前提条件

この例を完了するには、少なくとも 1 つのチャネルを設定する必要があります。 Collect Data in a New 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

ESP8266をプログラムする

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

2) ESP8266 ボード パッケージを追加します。

3) File > Preferences で、Additional ボード マネージャー URLs に<a href="https://arduino.esp8266.com/stable/package_esp8266com_index.json">https://arduino.esp8266.com/stable/package_esp8266com_index.json</a>を入力します。

4) Tools > Boards > Board Managerを選択します。検索バーに「ESP8266」と入力し、パッケージを選択してインストールします。

5) 「ツール」メニューで、Arduino IDE の適切なポートとボードを選択します。この例の生成に使用されたハードウェアでは、Node MCU 1.0 (ESP 8266–12E) オプションが使用されています。

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

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

コード

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

/*
WriteMultipleFieldsAndFetchCommandFromTalkBack

Description: Writes values to fields 1,2,3, and 4 and checks a TalkBack queue every 20 seconds for new commands.
             The TalkBack documentation can be found at https://www.mathworks.com/help/thingspeak/talkback-app.html.
             
Hardware: ESP8266-based boards

Notes:
- Requires ESP8266WiFi library and ESP8266 board add-on. See https://github.com/esp8266/Arduino for details.
- Select the target hardware from Tools > Board

Copyright 2018, The MathWorks, Inc.
*/

#include <ESP8266WiFi.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
}

3) メイン ループでは、まずローカル Wi-Fi ネットワークへの接続を確立します。ランダムに生成された数値から POST メッセージを作成します。POST を送信し、結果を確認して、 TalkBackコマンドを確認します。次に、20 秒以内に次の POST要求用に新しい乱数を生成します。

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 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コマンドを読み取ります。

// General function to POST to ThingSpeak
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;
    
}