メインコンテンツ

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

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

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

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

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

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

  • Wi-Fi モジュールまたは Wi-Fi 接続を備えた Arduino UNO または類似製品

  • MKR1000

前提条件

この例を実行するには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

Arduino をプログラムする

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

2) WiFi101ライブラリ マネージャー に追加されていない場合は追加します。

a) [Sketch] > [Include Library] > [Manage Libraries] を選択します。WiFi101を検索してください。

b) WiFi101 ライブラリを選択し、インストール をクリックします。

3) スケッチに WiFi101 ライブラリを追加します。

a) [Sketch] > [Include Library] > [Manage Libraries] を選択します。

b) WiFi101 を選択してスケッチに追加します。

4) スケッチに SPI ライブラリを追加します。

a) [Sketch] > [Include Library] > [Manage Libraries] を選択します。

b) SPI を選択してスケッチに追加します。

5) ツール メニューで、Arduino IDE で適切なポートとボードを選択します。

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

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

コード

1) まず、適切なライブラリをインクルードし、変数を定義します。

/*
FetchCommandFromTalkBack

Description: Checks a TalkBack queue every 60 seconds and set 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: Arduino WiFi Shield 101 or MKR

Notes:
 - Requires WiFi101 library. Use the WiFi101 library version 0.13.0 or older. WiFi101 library versions 0.14.0 and newer have a bug
   that prevents the ThingSpeak library from working properly.
 - Make sure the WiFi Shield 101 has updated firmware. Find instructions at https://www.arduino.cc/en/Tutorial/FirmwareUpdater.

Copyright 2018, The MathWorks, Inc.
*/

#include <SPI.h>  // Required for shield communication
#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
}

3) メイン ループでは、まずローカル WiFi ネットワークへの接続を確立します。正しいパラメーターを使用して 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 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;
    
}