发布温度数据并从通道读取
此示例显示如何从设备收集环境数据并将其从设备发布到 ThingSpeak™ 通道。该示例使用 ESP8266 和 ThingSpeak 通信库来发布数据和从通道检索数据。
支持的硬件
ESP8266-12
ESP8266-12E
此示例使用模拟热敏电阻和 ESP8266-12 的内置 ADC 读取电压并将其转换为温度。热敏电阻是一种电阻与温度成反比的装置。热敏电阻的校准数据存储在您的通道中并由设备读取。校准数据基于对 Steinhart-Hart 模型的拟合。一些制造商在设备中提供该校准数据。您可以通过测量三个不同温度下热敏电阻的电阻来自己调整参数。欲了解更多信息,请参阅校准温度系数。
设置
创建一个 ThingSpeak 通道,如在新通道中收集数据所示。
启用至少两个字段:一个字段用于读取,一个字段用于写入。数据写入字段 1、2 和 3。字段 6、7 和 8 用于存储温度校准系数。此图显示了通道设置的通道设置 视图。
记录您的读取 API 密钥和写入 API 密钥,您可以在通道设置视图的 API 密钥选项卡上找到该密钥。
使用网络浏览器地址栏填充校准字段。以下
a
、b
和c
的值是估计值。您可以从这些值开始,然后按照校准温度系数中的说明校准热敏电阻。使用您的写入 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
响应是通道中的条目数。如果该通道是新创建的,则创建第一、第二、第三个校准字段后,浏览器分别返回 1、2、3。
所需硬件
ESP8266。此示例使用 NodeMCU 开发板上的 ESP8266-12E。ESP8266-01 没有暴露 ADC 引脚。可以将数字接口温度传感器与 ESP8266-01 一起使用。
10 kΩ 热敏电阻,例如 Cantherm MF52A2103J3470。
10 kΩ 电阻。容差较高的电阻(1% 或更低)可产生更好的结果。
面包板。
跳线(至少 3 根)。
示意图和连接
连接以下引脚:
热敏电阻的一个引脚连接到 NodeMCU 上的 A0 引脚
热敏电阻的第二个引脚连接到 10 kΩ 电阻
第二个电阻引脚接地,必须与 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(可以使用单个通道)、读取 API 密钥和写入 API 密钥。您不需要更改代码中的系数,因为程序会从您的通道中读取它们。一旦连接,该设备每两分钟测量一次热敏电阻两端的电压。它根据您通道中存储的校准计算温度,并将温度发布到您的通道。
代码
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 模型将测量的热敏电阻电阻转换为温度。该模型具有以下形式:
您可以通过测量三种不同温度下热敏电阻的电阻来确定系数。冰水浴非常接近 0°C,室温通常为 24-26°C。如果您有开水,则温度为 100°C。如果您没有开水,您可以用手指挤压热敏电阻,并使用 33°C 作为表面温度的估计值。您可以使用您的设备按照此过程校准系数。
1) 初始化系数。使用先前建议的值或其他猜测。
2) 启动您的设备并观察串行监视器。串行监视器中显示的 ADC 值是电压的精确测量值,但在校准完成之前会产生不正确的温度。
3)将热敏电阻放入冰水浴中(0°C)。使用以下热敏电阻电阻公式将 ADC 值转换为电阻测量值。
4)记录室温(约 25°C)和高温下的温度和 ADC 值。如果没有沸水,用手指挤压热敏电阻,33°C 是一个合理的估计值。
5) 将所有 ADC 值转换为电阻。使用热敏电阻计算器求解热敏电阻的系数。将您的新系数上传至您的通道并重置设备。