このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
Arduino でのチャネル更新と照明制御
この例では、チャネルを更新し、ThingSpeak ™ TalkBackキューからコマンドを取得する方法を示します。コマンドを使用して、オンボード LED のステータスを変更します。
キューにコマンドがある場合にのみ実行するマシンがアプリケーションに関係する場合は、 TalkBack を使用します。
チャネルを更新すると同時に、 TalkBackキューに保存された最新のコマンドを取得できます。POST要求にパラメーターtalkback_key
を追加すると、ThingSpeak は応答で最新のTalkBackコマンドを返します。
サポートされているハードウェア
Wi-Fiシールドを備えたArduino Unoまたは同様のArduinoボード
MKR1000
前提条件
この例を完了するには、少なくとも 1 つのチャネルを設定する必要があります。新しいチャネルでデータを収集するに示すようにチャネルを作成し、書き込み API キーを記録します。TalkBackも設定する必要があります。[Apps] > [TalkBack] に移動して、[New TalkBack] を選択します。
TalkBackキューにコマンドを追加する
TalkBackキューにコマンドを追加するには、次の 2 つの方法があります。
TalkBackキューにコマンドを追加するには、ThingSpeak TalkBack Web インターフェースを使用します。TalkBack は最大 8000 個のコマンドを持つように設定できます。
ThingSpeak API を使用します。HTTP POST要求を使用して、コマンドをキューに追加できます。次の POST で、
TALKBACK_ID
、YOUR_TALKBACK_API_KEY
、TALKBACK_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
デバイスをプログラムする
1) 最新の Arduino® IDE をダウンロードします。
2) WiFi101
が ライブラリ マネージャー に追加されていない場合は追加します。
a) [Sketch] > [Include Library] > [Manage Libraries] を選択します。
b) WiFi101 ライブラリを選択し、インストール をクリックします。
3) SPI
が ライブラリ マネージャー に追加されていない場合は追加します。
a) [Sketch] > [Include Library] > [Manage Libraries] を選択します。SPI
を検索してください。
b) SPI
を選択してスケッチに追加します。
4) ツール メニューで、Arduino IDE で適切なポートとボードを選択します。
5) コードを Arduino IDE に貼り付けます。Wi-Fi ネットワーク情報、 TalkBack API キー、 TalkBack番号を追加します。
6) デバイスをプログラムし、シリアル モニターと LED を監視して、コマンドが実行されたときの変化を観察します。実行された各コマンドはリストから削除されます。コマンドが消費された後、リストにさらにコマンドを追加する必要があります。
コード
1) まず、適切なライブラリをインクルードし、変数を定義します。ネットワークのSSIDとパスワードを入力します。ID と API キーのチャネル番号とTalkBackパラメーターを編集します。
/* 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: Arduino Wi-Fi Shield 101 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 this 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 "ThingSpeak.h" #include <SPI.h> #include <WiFi101.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>; // Some values to send to ThingSpeak 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) メイン ループでは、まずローカル ワイヤレス ネットワークへの接続を確立します。ランダムに生成された番号から 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 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; }