このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
温度データのポストとチャネルからの読み取り
この例では、環境データの収集を行い、デバイスから 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 のプログラム
最新の Arduino® IDE をダウンロードします。
Arduino と ESP8266 用に ThingSpeak ライブラリを追加します。
[スケッチ]
、[ライブラリをインクルード]
、[ライブラリを管理]
を選択します。[ThingSpeak]
を選択してスケッチに追加します。ESP8266 ボードのパッケージを追加します。
[ファイル]
、[環境設定]
で、[追加のボードマネージャの URL] に http://arduino.esp8266.com/stable/package_esp8266com_index.json と入力します。[ツール]
、[ボード]
、[ボードマネージャ]
を選択します。検索バーにESP8266
と入力し、パッケージをインストールします。
Arduino IDE で適切なポートとボードを選択します。この例の生成に使用されたハードウェアでは、
Node MCU 1.0 (ESP 8266–12E)
オプションが使用されています。アプリケーションを作成します。
Arduino IDE で新しいウィンドウを開き、ファイルを保存します。ここに提供されたコードを追加します。ワイヤレス ネットワーク情報、チャネル ID (1 つのチャネルを使用可能)、Read API キー、および Write API キーを必ず変更してください。コード内の係数は、プログラムがチャネルから読み取るため、変更する必要がありません。
接続すると、デバイスは 2 分ごとにサーミスターにかかった電圧を測定します。また、チャネルに格納されたキャリブレーションを基に温度を計算し、その温度をチャネルにポストします。
最初のセクションは、変数の初期化です。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;
関数 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 ); }
メイン ループでは、温度を読み取ってからの時間を継続的に確認します。設定された時間が経過すると、デバイスが読み取られ、温度が計算され、出力がチャネルに書き込まれます。
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. } }
関数 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 ); }
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 を用いることができます。次の手順によって、デバイスを使用して係数のキャリブレーションを行うことができます。
係数を初期化します。これらの値か、他の推定値を使用してください。
A = 3.76595E-03 B = -1.98462E-04 C = 1.81973E-06
デバイスを起動して、シリアル モニターを確認します。ADC の値は正確な電圧の測定値ですが、温度は正しく計算されません。
氷水槽 (0°C) にサーミスターを浸けます。ADC の値を次の式で抵抗値に変換します。
サーミスタ抵抗値 R = 105*( 1024 / ADC-1 )
室温 (約 25°C) と高い温度について、その温度と ADC の値を記録します。熱湯が入手できない場合は、サーミスターを指でつまんで 33°C と推定するのが妥当です。
すべての ADC 値を抵抗値に変換し、この Thermistor Calculator を使用して、サーミスターの係数の解を求めます。新しい係数をチャネルにアップロードして、デバイスをリセットします。
参考
MathWorks Weather Station | Advanced Analysis with MathWorks Weather Station | REST API | ThingSpeak 入門