メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

温度データを投稿し、チャネルから読み取る

この例では、デバイスから環境データを収集し、デバイスから ThingSpeak ™チャネルに投稿する方法を示します。この例では、ESP8266 と ThingSpeak 通信ライブラリを使用して、データを投稿し、チャネルからデータを取得します。

サポート対象のハードウェア

  • ESP8266-12

  • ESP8266-12E

この例では、アナログ サーミスタと ESP8266-12 の内蔵 ADC を使用して電圧を読み取って温度に変換します。サーミスタは、温度に反比例する抵抗を持つデバイスです。サーミスタのキャリブレーション データはチャネルに保存され、デバイスによって読み取られます。キャリブレーションデータは、Steinhart-Hart モデルへの適合に基づいています。一部のメーカーでは、このキャリブレーション データをデバイスとともに提供しています。3 つの異なる温度でサーミスタの抵抗を測定することにより、パラメーターを自分で調整できます。詳細については、「温度係数のキャリブレーション」を参照してください。

設定

  • 新しいチャネルでデータを収集するに示すように、ThingSpeakチャネルを作成します。

  • 少なくとも 2 つのフィールドを有効にします。1 つは読み取り用、もう 1 つは書き込み用です。データはフィールド 1、2、3 に書き込まれます。フィールド 6、7、および 8 は、温度キャリブレーション係数を保存するために使用されます。この画像は、単一チャネル設定の チャネル設定 ビューを示しています。

  • 読み取り API キーと書き込み API キーを記録します。これらのキーは、 [チャネル設定] ビューの [API キー] タブで確認できます。

  • Web ブラウザのアドレス バーを使用して、キャリブレーション フィールドに入力します。次の abc の値は推定値です。これらの値から始めて、温度係数のキャリブレーションの説明に従ってサーミスタをキャリブレーションすることができます。次のテキストを書き込み 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
  • 応答はチャネル内のエントリの数です。チャネルが新しく作成された場合、最初の、2 番目の、および 3 番目のキャリブレーション フィールドを作成した後、ブラウザーはそれぞれ 1、2、および 3 を返します。

必要なハードウェア

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

  • 10 kΩ サーミスタ (例: Cantherm MF52A2103J3470)。

  • 10kΩの抵抗器。許容誤差が 1% 以下の高抵抗器を使用すると、より良い結果が得られます。

  • ブレッドボード。

  • ジャンパー線(少なくとも 3 本)。

回路図と接続

次のピンを接続します。

  • サーミスタの1つのピンをNodeMCUのピンA0に接続します

  • サーミスタの2番目のピンを10kΩの抵抗に接続します

  • 2番目の抵抗ピンはグランドに接続され、ESP8266と共通である必要があります。

NodeMCU ボードには、ESP8266 ADC の 1 V 入力範囲を 3.3 V範囲に変換する電圧分圧器が組み込まれています。電圧分割器が内蔵されていない別のボードを使用している場合は、グランドに 100 kΩ の抵抗を追加し、電源に 220 kΩ の抵抗を追加することを検討してください。

ESP8266 をプログラムする

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

2) ThingSpeak Library for Arduino and ESP8266 を追加します。

a.[Sketch] >[Include Library] >[Manage Libraries]を選択します。

b.ThingSpeak を選択してスケッチに追加します。

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

a) [File] > [Preferences] の下で、[Additional Board Manager URLs]https://arduino.esp8266.com/stable/package_esp8266com_index.json と入力します。

b) [Tools] > [Boards] > [Board Manager] を選択します。検索バーに「ESP8266」と入力してパッケージをインストールします。

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

5) アプリケーションを作成します。Arduino IDE で新しいウィンドウを開き、ファイルを保存します。ここで提供されているコードを追加します。ワイヤレス ネットワーク情報、チャネルID (1 つのチャネルを使用できます)、読み取り API キー、書き込み API キーを必ず変更してください。プログラムはチャネルから係数を読み取るため、コード内の係数を変更する必要はありません。接続されると、デバイスはサーミスタの両端の電圧を 2 分ごとに測定します。チャネルに保存されているキャリブレーションに基づいて温度を計算し、その温度をチャネルに投稿します。

コード

1) 最初のセクションでは変数を初期化します。読み取り API キーと書き込み 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 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() {
    
  
 // Update only if the 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 , fahrenheitTemperature , dataFieldTwo , celsiusTemperature , 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 を使用して、チャネル上の単一のフィールドからデータを読み取ります。writeTSDataand を使用して ThingSpeak に単一の値を書き込み、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 to write 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℃に非常に近く、室温は通常24~26℃です。沸騰したお湯があれば、100℃になります。沸騰したお湯がない場合は、サーミスターを指で挟んで、表面温度を33℃と推定できます。この手順でデバイスを使用して係数を校正できます。

1) 係数を初期化します。以前に提案された値またはその他の推測値を使用します。

2) デバイスを起動し、シリアルモニターを監視します。シリアル モニターに表示される ADC 値は電圧の正確な測定値ですが、キャリブレーションが完了する前は温度が正しくありません。

3) サーミスタを氷水浴(0℃)に入れます。次のサーミスタ抵抗の式を使用して、ADC 値を抵抗測定値に変換します。

R=105*(1024ADC-1)

4) 室温 (約 25 °C) と高温での温度と ADC 値を記録します。沸騰したお湯が手に入らない場合は、サーミスタを指で押すと 33 °C と推定できます。

5) すべての ADC 値を抵抗に変換します。サーミスタ計算機を使用して、サーミスタの係数を計算します。新しい係数をチャネルにアップロードし、デバイスをリセットします。

参考

トピック