Main Content

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

温度データのポストとチャネルからの読み取り

この例では、環境データの収集を行い、デバイスから ThingSpeak™ チャネルにポストする方法を説明します。ESP8266 と ThingSpeak Communication Library を使用してチャネルにデータをポストし、チャネルからデータを取得します。

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

  • ESP-8266–12

  • ESP8266–12E

この例では、アナログ サーミスターと ESP8266–12 の内蔵 ADC を使用して電圧を読み取り、温度に変換します。サーミスターは、温度に反比例する抵抗をもつデバイスです。サーミスターのキャリブレーション データはチャネルに保存され、デバイスによって読み取られます。キャリブレーション データは、Steinhart-Hart モデルへの近似から求められます。一部の製造業者は、このキャリブレーション データをデバイスと共に提供しています。サーミスターの抵抗値を 3 つの異なる温度で測定することによって、ユーザー自身がパラメーターを近似することができます。詳細については、温度係数のキャリブレーションを参照してください。

前提条件

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

  • 少なくとも 2 つのフィールドを必ず有効にします。1 つは読み取り用で、1 つは書き込み用です。データは、Field 1、2、および 3 に書き込まれます。Field 6、7、および 8 は、温度キャリブレーション係数を格納するために使用します。次のイメージは、1 つのチャネル設定の [Channel Settings] ビューを示しています。

  • Read API キーと Write API キーを記録します。これらは、[Channel Settings] ビューの [API Keys] タブ (イメージ内の丸印) にあります。

  • Web ブラウザーのアドレス バーを使用して、キャリブレーション フィールドに入力します。ここでの値は推定値です。これらの値から始めて、温度係数のキャリブレーションの説明に従ってサーミスターのキャリブレーションを行うことができます。以下のテキストを実際の Write API キーに変更し、ブラウザーのアドレス バーに直接貼り付けます。

    係数 a を設定します。

    https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field6=0.002039
    係数 b を設定します。
    https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field7=0.0000672
    係数 c を設定します。
    https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field8=0.0000008929

    ブラウザーがチャネル内のエントリ数を返します。チャネルを作成したばかりの場合、3 つの必須キャリブレーション フィールドに入力すると、ブラウザーが 1、2、および 3 を返します。

必要なハードウェア

  • ESP8266。この例では、NodeMCU 開発ボードで ESP8266–12E を使用します。ESP8266–01 では ADC ピンを利用できません。ESP8266–01 でデジタル インターフェイス温度センサーを使用することは可能です。

  • 10 kΩ のサーミスター (例、Cantherm MF52A2103J3470)

  • 10 kΩ の抵抗器 (耐性の高い (1% 以下) 抵抗器によって、よりよい結果が得られます)

  • ブレッドボード

  • ジャンパー ワイヤー (3 本以上)

回路図と接続

接続:

  • サーミスターの 1 つのピンから NodeMCU の A0 ピンへ。

  • サーミスターの 2 番目のピンから 10 kΩ の抵抗器へ。

  • 抵抗器の 2 番目のピンからグラウンドへ。グラウンドは、必ず NodeMCU と共通にしてください。

ESP8266 のプログラム

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

  2. Arduino と ESP8266 用に ThingSpeak ライブラリを追加します。

    [スケッチ][ライブラリをインクルード][ライブラリを管理] を選択します。[ThingSpeak] を選択してスケッチに追加します。

  3. ESP8266 ボードのパッケージを追加します。

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

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

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

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

    Arduino IDE で新しいウィンドウを開き、ファイルを保存します。ここに提供されたコードを追加します。ワイヤレス ネットワーク情報、チャネル ID (1 つのチャネルを使用可能)、Read API キー、および Write API キーを必ず変更してください。コード内の係数は、プログラムがチャネルから読み取るため、変更する必要がありません。

    接続すると、デバイスは 2 分ごとにサーミスターにかかった電圧を測定します。また、チャネルに格納されたキャリブレーションを基に温度を計算し、その温度をチャネルにポストします。

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

    1. 最初のセクションは、変数の初期化です。Read API キーと Write API キー、チャネル番号、およびワイヤレス ネットワークの接続情報を必ず編集してください。

      #include <ThingSpeak.h>
      #include <ESP8266WiFi.h>
      
      // Network Parameters
      const char* ssid     = "SSSSSSS";
      const char* password = "PPPPPPPPPP";
      
      // ThingSpeak information
      char thingSpeakAddress[] = "api.thingspeak.com";
      unsigned long channelID = NNNNNN;
      char* readAPIKey = "XXXXXXXXXXXXXXXX";
      char* writeAPIKey = "YYYYYYYYYYYYYYYY";
      const unsigned long postingInterval = 120L * 1000L;
      unsigned int dataFieldOne = 1;                            // Field to write temperature data
      unsigned int dataFieldTwo = 2;                       // Field to write temperature data
      unsigned int dataFieldThree = 3;                     // Field to write elapsed time data
      unsigned int aField = 6;                             //Field to hold first constant of the thermistor calibration                
      unsigned int bField = 7;                             //Field to hold second constant of the thermistor calibration
      unsigned int cField = 8;                             //Field to hold third constant of the thermistor calibration
      
      // Global variables
      // These constants are device specific.  You will need to get them from the manufacturer or determine them yourself.
      float aConst = 2.25E-02;   
      float bConst = -0.003422894649;
      float cConst = 0.00001518485044;
      
      unsigned long lastConnectionTime = 0;
      long lastUpdateTime = 0; 
      WiFiClient client;                                  
                                       
      
    2. 関数 setup で、シリアル モニターを開始し、キャリブレーションの定数を読み取ります。

      void setup() {
      
      Serial.begin(9600);
      Serial.println("Start");
      connectWiFi();
      
      // Read the constants at startup.
      aConst = readTSData( channelID, aField );
      bConst = readTSData( channelID, bField );
      cConst = readTSData( channelID, cField );
      }
    3. メイン ループでは、温度を読み取ってからの時間を継続的に確認します。設定された時間が経過すると、デバイスが読み取られ、温度が計算され、出力がチャネルに書き込まれます。

      void loop() {
          
          // Only update if posting time is exceeded
          if (millis() - lastUpdateTime >=  postingInterval) {
              
              float fahrenheitTemperature, celsiusTemperature;
              
              lastUpdateTime = millis();
              
              float readValue = analogRead(A0);
              float logR = log( 10000 * ( 1024 / readValue - 1 ));                 // Separate the calculation for simplicity and debugging
              
              celsiusTemperature = 1 / ( aConst + bConst * logR + cConst * pow(logR,3) ) - 273.15;   // Calculate the temperature in Celsius
              fahrenheitTemperature = celsiusTemperature * 9 / 5 + 32;
              Serial.println("ADC =  " + String( readValue )+ " Temp = "+String( fahrenheitTemperature ));
              write2TSData( channelID , dataFieldOne , celsiusTemperature , dataFieldTwo , fahrenheitTemperature , dataFieldThree , millis() );      // Write the temperature in F, C, and time since starting.
          }
      }
    4. 関数 connectWiFi を使用して、デバイスをワイヤレス ネットワークに接続します。

      int connectWiFi(){
          
          while (WiFi.status() != WL_CONNECTED) {
            
              WiFi.begin( ssid, password );
              delay(2500);
              Serial.println("Connecting to WiFi");
          }
          
          Serial.println( "Connected" );
          ThingSpeak.begin( client );
      }
    5. readTSData により、チャネル上の単一のフィールドからデータを読み取ります。writeTSData を使用して ThingSpeak に 1 つの値を書き込み、write2TSdata で複数の値を同時に書き込みます。

      float readTSData( long TSChannel,unsigned int TSField ){
          
        float data =  ThingSpeak.readFloatField( TSChannel, TSField, readAPIKey );
        Serial.println( " Data read from ThingSpeak: " + String( data, 9 ) );
        return data;
        
      }
      
      // Use this function if you want to write a single field
      int writeTSData( long TSChannel, unsigned int TSField, float data ){
        int  writeSuccess = ThingSpeak.writeField( TSChannel, TSField, data, writeAPIKey ); // Write the data to the channel
        if ( writeSuccess ){
          
          Serial.println( String(data) + " written to Thingspeak." );
          }
          
          return writeSuccess;
      }
      
      //use this function if you want multiple fields simultaneously
      int write2TSData( long TSChannel, unsigned int TSField1, float field1Data, unsigned int TSField2, long field2Data, unsigned int TSField3, long field3Data ){
      
        ThingSpeak.setField( TSField1, field1Data );
        ThingSpeak.setField( TSField2, field2Data );
        ThingSpeak.setField( TSField3, field3Data );
         
        int writeSuccess = ThingSpeak.writeFields( TSChannel, writeAPIKey );
        return writeSuccess;
      }

温度係数のキャリブレーション

この例では Steinhart-Hart モデルを使用して、測定されたサーミスターの抵抗値を温度に変換します。モデルの形式は次のとおりです。

T = 1 / ( A + B * ln( R ) + C * ln( R ) )3

係数は、サーミスターの抵抗値を異なる 3 つの温度で測定することにより決定できます。氷水槽は 0°C に極めて近く、室温は一般に 24~26°C です。熱湯が手に入る場合は、100°C を利用できます。熱湯がない場合は、サーミスターを指でつまみ、推定の表面温度として 33°C を用いることができます。次の手順によって、デバイスを使用して係数のキャリブレーションを行うことができます。

  1. 係数を初期化します。これらの値か、他の推定値を使用してください。

    A = 3.76595E-03
    B = -1.98462E-04
    C = 1.81973E-06
  2. デバイスを起動して、シリアル モニターを確認します。ADC の値は正確な電圧の測定値ですが、温度は正しく計算されません。

  3. 氷水槽 (0°C) にサーミスターを浸けます。ADC の値を次の式で抵抗値に変換します。

    サーミスタ抵抗値 R = 105*( 1024 / ADC-1 )

  4. 室温 (約 25°C) と高い温度について、その温度と ADC の値を記録します。熱湯が入手できない場合は、サーミスターを指でつまんで 33°C と推定するのが妥当です。

  5. すべての ADC 値を抵抗値に変換し、この Thermistor Calculator を使用して、サーミスターの係数の解を求めます。新しい係数をチャネルにアップロードして、デバイスをリセットします。

参考

| | |