Main Content

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

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

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

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

  • ESP8266-12

  • ESP8266-12E

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

設定

  • Collect Data in a New Channelに示すように、 ThingSpeak チャネルを作成します。

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

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

  • Web ブラウザのアドレス バーを使用して調整フィールドに値を入力します。次のab、およびcの値は推定値です。これらの値から始めて、Calibrate Temperature Coefficientsの説明に従ってサーミスターのキャリブレーションを行うことができます。次のテキストを書き込み 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ではデジタルインターフェース温度センサーを使用することが可能です。

  • Cantherm MF52A2103J3470 などの 10 kΩ サーミスタ。

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

  • ブレッドボード。

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

回路図と接続

次のピンを接続します。

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

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

  • グランドへの 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. スケッチ > ライブラリを含める > ライブラリの管理 を選択します。

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

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

a) File > Preferences で、追加のボード マネージャーURLhttps://arduino.esp8266.com/stable/package_esp8266com_index.jsonを入力します。

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

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

5) アプリケーションを作成します。Arduino IDE で新しいウィンドウを開き、ファイルを保存します。ここに提供されたコードを追加します。ワイヤレス ネットワーク情報、チャネルID (単一のチャネルを使用できます)、読み取り 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 °C に非常に近く、室温は通常 24 ~ 26 °C です。沸騰したお湯があれば、100℃になります。熱湯がない場合は、サーミスターを指で挟み、表面温度の推定値として 33°C を使用できます。次の手順によって、デバイスを使用して係数のキャリブレーションを行うことができます。

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

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

3) サーミスターを氷水バス (0 °C) に置きます。次のサーミスター抵抗の式を使用して、ADC 値を抵抗測定値に変換します。

R=105*(1024ADC-1)

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

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

参考

関連するトピック