Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

チャネルへの HTTP POST とディープ スリープ機能をもつ水分モニター

この例では、ディープ スリープから復帰するデバイスを使用して、複数のフィールドのデータを ThingSpeak™ チャネルにポストする方法を説明します。土壌水分センサーを読み取り、その値を ThingSpeak チャネルにポストします。HTTP POST 要求は、別個のライブラリを使用せずに通信クライアントに書き込むことによって実行されます。HTTP 要求をワイヤレス ネットワーク クライアントに直接書き込むことで、ThingSpeak Communication Library よりも高い柔軟性と速度を提供できます。

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

  • ESP 8266–12

  • NodeMCU ESP8266–12

  • イーサネット接続またはワイヤレス接続 (およびいくつかのコード調整) を伴う Arduino

この例では、オンボードの ADC は水分センサーを読み取り、その値と経過時間を ThingSpeak チャネルの 2 つのフィールドにポストします。ポストは、最大 8 つのフィールドにデータを入力するように変更できます。

次のイメージは、オフィスの観葉植物と NodeMCU ESP 8266-12 に有線接続されている水分センサーを示しています。NodeMCU はワイヤレス ネットワーク接続を提供します。水分センサーは、ボード上のデータ ピンから給電され、電力がオンになる時間が制限されています。この設計により電力が節減され、センサーの寿命が延びます。測定していない間、デバイスはディープ スリープ モードに入り、電力が節約されます。データがチャネルにポストされると、データに対する反応を設定できます。たとえば、React アプリを設定して、水分レベルが低いことを通知することができます。

前提条件

  1. ThingSpeak チャネルを作成します。

  2. [Channel Settings] タブで、Field 1 を有効にします。Moisture Value のような、内容を表すフィールド タイトルを指定することができます。

  3. [API Keys] タブの Write API キーを確認します。この値は、デバイスをプログラムするために使用するコードで必要です。

必要なハードウェア

  • 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 ボードのパッケージを追加します。

    1. [ファイル][環境設定] にある [追加のボードマネージャの URL] に、http://arduino.esp8266.com/stable/package_esp8266com_index.json と入力します。

    2. [ツール][ボード][ボードマネージャ] を選択します。検索バーで ESP8266 を検索し、パッケージをインストールします。

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

  4. アプリケーションを作成します。

    Arduino IDE で新しいウィンドウを開き、ファイルを保存します。ここに提供されたコードを追加します。コード中のワイヤレス ネットワーク情報と API キーを必ず調整してください。

  5. プログラムが正常にアップロードされると、シリアル モニターまたはチャネルのビュー ページを使用して出力を監視できるようになります。

     コピーと貼り付け用の完全なコード

    1. ESP8266WiFi ライブラリをインクルードし、変数を初期化します。コード内のネットワーク情報と Write API キーを編集します。

      #include <ESP8266WiFi.h>
      
      #define soilPin A0
      #define sensorPower 13
      
      // Network Information
      const char* ssid     = "ssid";
      const char* password = "PPPPP";
      
      // Global Variables
      int ADCValue = 0;
      long sleepTimeSeconds = 1800;
      char thingSpeakAddress[] = "api.thingspeak.com";
      String writeAPIKey="XXXXXXXXXXXXXXXX";            // Be sure to change this to your channel Write API key
      WiFiClient client;
      int numFields = 2;
    2. 関数 setup でシリアル モニターを起動し、ワイヤレス ネットワークに接続して、使用するデバイスのピンを初期化します。

      void setup()
      {
          Serial.begin( 115200 );   // You may need to adjust the speed depending on your hardware.
          
          connectWifi();
          pinMode( sensorPower , OUTPUT );
          digitalWrite( sensorPower , LOW );   // Set to LOW so no power is flowing through the sensor.
      }
    3. メイン ループで、土壌モニターを読み取り、配列 data[] に格納します。データを ThingSpeak にポストし、デバイスを低電力モードにします。

      void loop()
      {
          String data[ 8 ];  // You can fill data with up to 8 values to write to successive fields in your channel.
          
          
          data[ 1 ] = String( readSoil() ); //you can write to multiple fields by storing data in the data[] array.  Be sure to increase numFields
          Serial.print( "Soil Moisture = " );
          Serial.println( data[ 1 ] );
          data[ 2 ] = String( millis() );
          
          HTTPPost( data );
          
          delay( 1000 );
          Serial.print( "Goodnight" );
          ESP.deepSleep( sleepTimeSeconds * 1000000 );
          // If you remove the sleep, be sure to add more delay so you don't post to ThingSpeak too often.
          
      }
    4. 関数 readSoil を使用してセンサーに電力を供給し、ADC を使用して出力の電圧を読み取ります。測定後に電力供給を解除します。

      // This is a function used to get the soil moisture sensor.
      int readSoil()
      {
          digitalWrite(sensorPower, HIGH);  // Turn power to device on
          delay(10);    // Wait 10 milliseconds for sensor to settle
          ADCValue = analogRead(soilPin);     // Read the value from sensor
          digitalWrite(sensorPower, LOW);   // Turn power to device off
          return ADCValue;                    // Return the moisture value
      }
    5. 関数 connectWiFi を使用して、デバイスをワイヤレス ネットワークに接続します。

      int connectWifi()
      {
          WiFi.begin( ssid , password );
          while (WiFi.status() != WL_CONNECTED) {
              Serial.println( "Connecting to WiFi" );
              delay( 2500 );
          }
          Serial.println( "Connected" );  // Inform the serial monitor
      }
    6. チャネルにポストするデータ文字列を作成します。ThingSpeak に接続し、クライアントを使用して HTTP POST を完了します。

      int HTTPPost(String fieldData[]){
        
          // This function builds the data string for posting to ThingSpeak and provides the correct format for the wifi client to communicate with ThingSpeak.
          // It will post "numFields" worth of data entries, and take the data from the fieldData parameter passed to it.
          // Be sure to increase numFields to the number of fields you need, and activate the fields in your channel view.
        
          if (client.connect( thingSpeakAddress , 80 )){
      
            // Build the Posting data string.  If you have multiple fields, make sure the sting does not exceed 1440 characters.
              String PostData= "api_key=" + writeAPIKey ;
              for ( int field = 1; field < numFields+1; field++ ){
                  PostData += "&field" + String( field ) + "=" + fieldData[ field ];
              }
      
              // 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 );
              client.stop();
          }
      }

湿潤と乾燥のサイクルを通じてチャネルを監視することにより、有用な値の範囲を決定できます。ADC で読み取られチャネルにポストされる数値は、電圧に比例し、したがって土壌水分に比例します。値は、温度、湿度、および土壌の種類によって変わります。乾燥した土の値がわかったら、React アプリを使用して、植物に水をやる時間であるという通知を生成できます。React の設定の詳細については、を参照してください。

関連するトピック

外部の Web サイト