このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
ESP32 のTalkBackでライトを制御する
この例では、 ThingSpeak™ TalkBackキューからコマンドをフェッチし、それを使用してオンボード LED のステータスを変更する方法を示します。
キューにコマンドがある場合にのみ実行したいマシンがアプリケーションに含まれる場合は、 TalkBack を使用します。
この例では、 TURN_ON
またはTURN_OFF
をTalkBackキューに書き込むと、デバイスはコマンドに一致するようにオンボード LED の状態を変更します。TalkBack Appを使用して、デバイスのコマンドを保存します。web interfaceまたは HTTP コマンドを使用して、デバイス コマンドをリストに書き込みます。リストには最大 8000 個のコマンドを保存できます。デバイスがコマンド リストを読み取るたびに、単一のコマンドを読み取り、リストから最新のコマンドを削除します。
《サポートされているハードウェア》
ESP32
前提条件
この例を完了するには、少なくとも 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_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
ESP32をプログラムする
1) 最新の Arduino® IDE をダウンロードします。
2) ESP32 コアをインストールします。詳細については、Install Arduino ESP32 Supportを参照してください。
3) 「ツール」メニューで、Arduino IDE の適切なポートとボードを選択します。この例は、Sparkfun ESP32 Thing
オプションを使用してテストされています。
4) コードを Arduino IDE に貼り付けます。Wi-Fi ネットワーク情報、 TalkBack API キー、 TalkBack番号を追加します。
5) デバイスをプログラムし、シリアル モニターと LED を監視して、コマンドが消費されたときの変化を観察します。実行された各コマンドはリストから削除されます。コマンドが使用された後、リストにコマンドを追加する必要があります。
コード
1) 適切なライブラリを組み込み、変数を定義することから始めます。ネットワークの SSID とパスワードを入力します。チャネル番号とTalkBackパラメーターを入力します: myTalkBackID
および myTalkBackKey
。
/* 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; }