このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
チャネルへの HTTP POST要求を使用する水分センサー
この例では、ディープ スリープから復帰するデバイスから複数フィールドのデータをThingSpeak™チャネルに送信する方法を示します。土壌水分センサーを読み取り、その値をThingSpeakチャネルに投稿します。HTTP POST 要求は、別個のライブラリを使用せずに通信クライアントに書き込むことによって実行されます。HTTP要求をワイヤレス ネットワーク クライアントに直接書き込むと、 ThingSpeak Communication Library よりも柔軟性と速度が向上します。
《サポートされているハードウェア》
ESP8266-12
ノードMCU ESP8266-12
Ethernet またはワイヤレス接続を備えた Arduino (コード調整あり)
この例では、オンボード ADC が水分センサーを読み取り、その値と経過時間をThingSpeakチャネルの 2 つのフィールドにポストします。POST を変更して、最大 8 つのフィールドにデータを入力できます。
この画像は、NodeMCU ESP8266-12 に接続された湿気センサーを備えたオフィス植物を示しています。NodeMCU はワイヤレス ネットワーク接続を提供します。水分センサーはボード上のデータ ピンから電力を供給され、センサーの電源がオンになる時間が制限されます。この設計により電力が節減され、センサーの寿命が延びます。測定の合間には、デバイス全体がディープスリープ モードになり、電力を節約します。データがチャネルに投稿されると、データに対する反応を設定できます。たとえば、React アプリを設定して、水分レベルが低いことを通知することができます。
≪前提条件≫
1) Collect Data in a New Channelに示すように、 ThingSpeakチャネルを作成します。
2) 「チャネル設定」「」タブで、フィールド 1 を有効にします。Moisture Value
などの情報フィールド名を指定できます。
3) 「API キー」「API キー」タブから書き込み API キーをメモします。この値は、デバイスのプログラミングに使用されるコードに必要です。詳細は、Channel ConfigurationsとChannel Propertiesを参照してください。
≪必要なハードウェア≫
ESP8266 ベースのボードまたは Inernet 接続を備えた Arduino ボード (このデモンストレーションには NodeMCU ESP8266-12E を使用)
土壌水分センサー (例: Sparkfun Moisture Sensor)
ジャンパー ワイヤー (4 本以上)
USB ケーブル
回路図と接続
1) 水分センサーの VCC を NodeMCU のピン D7 に接続します。
2) センサーの Gnd を NodeMCU のグランドに接続します。
3) センサーの Sig ピンを NodeMCU ピン A0 に接続します。
4) NodeMCU Rst ピンを NodeMCU ピン D0 に接続して、ディープ スリープからのウェイクアップを有効にします。
デバイスをプログラムする
1) 最新の Arduino® IDE をダウンロードします。
2) ESP8266 ボード パッケージを追加します。
a) File > Preferences の Additional ボード マネージャー URLs にhttps://arduino.esp8266.com/stable/package_esp8266com_index.json
と入力します。
b) ツール > ボード > ボード マネージャーを選択します。検索バーで ESP8266
を検索し、パッケージをインストールします。
3) Arduino IDE で適切なポートとボードを選択します。この例の生成に使用されたハードウェアでは、Node MCU 1.0 (ESP 8266–12E)
オプションが使用されています。
4) アプリケーションを作成します。Arduino IDE で新しいウィンドウを開き、ファイルを保存します。「コード」セクションに提供されているコードを追加します。コード内のワイヤレス ネットワーク情報と API キーを必ず編集してください。
5) プログラムが正常にアップロードされたら、シリアル モニターまたはチャネルビュー ページを使用して出力を監視できます。
コード
1) ESP8266WiFi
ライブラリをインクルードし、ハードウェアとデータ収集用の変数を初期化します。ネットワーク情報を編集し、コードに API キーを記述します。
#include <ESP8266WiFi.h> // Network information. #define WIFI_NAME "YOUR_WIFI_NAME" #define PASSWORD "WIFI_PASSWORD" // Hardware information. #define SENSOR_POWER 13 // Connect the power for the soil sensor here. #define SOIL_PIN A0 // Connect the sensor output pin here. #define TIMEOUT 5000 // Timeout for server response. #define SLEEP_TIME_SECONDS 1800 // ThingSpeak information. #define NUM_FIELDS 2 // To update more fields, increase this number and add a field label below. #define SOIL_MOISTURE_FIELD 1 // ThingSpeak field for soil moisture measurement. #define ELAPSED_TIME_FIELD 2 // ThingSpeak field for elapsed time from startup. #define THING_SPEAK_ADDRESS "api.thingspeak.com" String writeAPIKey="XXXXXXXXXXXXXXXX"; // Change this to the write API key for your channel. // Global variables. int numMeasure = 5; // Number of measurements to average. int ADCValue = 0; // Moisture sensor reading. WiFiClient client;
2) setup
関数で、シリアル モニターを起動し、無線ネットワークに接続し、使用するデバイスのピンを初期化します。
// Put your setup code here, to run once: void setup() { Serial.begin( 115200 ); // You may need to adjust the speed depending on your hardware. connectWifi(); pinMode( SENSOR_POWER , OUTPUT ); digitalWrite( SENSOR_POWER , LOW ); // Set to LOW so no power is flowing through the sensor. }
3) メインループで、土壌モニターを読み取り、 data
配列に保存します。データをThingSpeakに POST し、デバイスを低電力モードにします。
// Put your main code here, to run repeatedly: void loop() { // Write to successive fields in your channel by filling fieldData with up to 8 values. String fieldData[ NUM_FIELDS ]; // You can write to multiple fields by storing data in the fieldData[] array, and changing numFields. // Write the moisture data to field 1. fieldData[ SOIL_MOISTURE_FIELD ] = String( readSoil( numMeasure ) ); Serial.print( "Soil Moisture = " ); Serial.println( fieldData[ SOIL_MOISTURE_FIELD ] ); // Write the elapsed time from startup to Field 2. fieldData[ ELAPSED_TIME_FIELD ] = String( millis() ); HTTPPost( NUM_FIELDS , fieldData ); delay( 1000 ); Serial.print( "Goodnight for "+String( SLEEP_TIME_SECONDS ) + " Seconds" ); ESP.deepSleep( SLEEP_TIME_SECONDS * 1000000 ); // If you disable sleep mode, add delay so you don't post to ThingSpeak too often. // delay( 20000 ); }
4) readSoil
関数を使用してセンサーに電力を供給し、ADC を使用して出力の電圧を読み取ります。測定後は電源を切ってください。
// This function reads the soil moisture sensor numAve times and returns the average. long readSoil(int numAve) { long ADCValue = 0; for ( int i = 0; i < numAve; i++ ) { digitalWrite( SENSOR_POWER, HIGH ); // Turn power to device on. delay(10); // Wait 10 milliseconds for sensor to settle. ADCValue += analogRead( SOIL_PIN ); // Read the value from sensor. digitalWrite( SENSOR_POWER, LOW ); // Turn power to device off. } ADCValue = ADCValue / numAve; return ADCValue; // Return the moisture value. }
5) connectWiFi
関数を使用してデバイスをワイヤレス ネットワークに接続します。
// Connect to the local Wi-Fi network int connectWifi() { while (WiFi.status() != WL_CONNECTED) { WiFi.begin( WIFI_NAME , PASSWORD ); Serial.println( "Connecting to Wi-Fi" ); delay( 2500 ); } Serial.println( "Connected" ); // Inform the serial monitor. }
6)チャネルに投稿するデータ文字列を構築します。ThingSpeakに接続し、Wi-Fi クライアントを使用して HTTP POST を完了します。
// This function builds the data string for posting to ThingSpeak // and provides the correct format for the wifi client to communicate with ThingSpeak. // It posts numFields worth of data entries, and takes the // data from the fieldData parameter passed to it. int HTTPPost( int numFields , String fieldData[] ){ if (client.connect( THING_SPEAK_ADDRESS , 80 )){ // Build the postData string. // If you have multiple fields, make sure the sting does not exceed 1440 characters. String postData= "api_key=" + writeAPIKey ; for ( int fieldNumber = 1; fieldNumber < numFields+1; fieldNumber++ ){ String fieldName = "field" + String( fieldNumber ); postData += "&" + fieldName + "=" + fieldData[ fieldNumber ]; } // POST data via HTTP. Serial.println( "Connecting to ThingSpeak for update..." ); Serial.println(); client.println( "POST /update HTTP/1.1" ); client.println( "Host: api.thingspeak.com" ); client.println( "Connection: close" ); client.println( "Content-Type: application/x-www-form-urlencoded" ); client.println( "Content-Length: " + String( postData.length() ) ); client.println(); client.println( postData ); Serial.println( postData ); String answer=getResponse(); Serial.println( answer ); } else { Serial.println ( "Connection Failed" ); } }
7) getResponse
を使用してサーバーからの応答を待って受信します。
// Wait for a response from the server indicating availability, // and then collect the response and build it into a string. String getResponse(){ String response; long startTime = millis(); delay( 200 ); while ( client.available() < 1 && (( millis() - startTime ) < TIMEOUT ) ){ delay( 5 ); } if( client.available() > 0 ){ // Get response from server. char charIn; do { charIn = client.read(); // Read a char from the buffer. response += charIn; // Append the char to the string response. } while ( client.available() > 0 ); } client.stop(); return response; }
湿潤と乾燥のサイクルを通じてチャネルを監視することにより、有用な値の範囲を決定できます。ADC で読み取られチャネルにポストされる数値は、電圧に比例し、したがって土壌水分に比例します。値は、温度、湿度、および土壌の種類によって変わります。乾燥した土の値がわかったら、React アプリを使用して、植物に水をやる時間であるという通知を生成できます。React の設定の詳細については、React Appを参照してください。