发布温度数据并从通道读取
此示例演示如何从设备收集环境数据并将其从设备发布到 ThingSpeak™通道。该示例使用 ESP8266 和 ThingSpeak 通信库从通道发布数据和检索数据。
支持的硬件
ESP8266-12
ESP8266-12E
本示例使用模拟热敏电阻和 ESP8266-12 的内置 ADC 来读取电压并将其转换为温度。热敏电阻是一种电阻与温度成反比的器件。热敏电阻的校准数据存储在您的通道中并由设备读取。校准数据基于 Steinhart-Hart 模型的拟合。一些制造商随设备提供此校准数据。您可以通过测量热敏电阻在三个不同温度下的电阻来自行拟合参数。有关详细信息,请参阅 Calibrate Temperature Coefficients。
设置
创建 ThingSpeak 通道,如 Collect Data in a New Channel 所示。
至少启用两个字段:一个用于读取,一个用于写入。数据写入字段 1、2 和 3。字段 6、7 和 8 用于存储温度校准系数。此图显示了通道设置的“通道设置”视图。
记录您读取的 API 密钥和写入 API 密钥,您可以在“通道设置”视图的“API 密钥”选项卡上找到这些密钥。
使用网络浏览器地址栏填充校准字段。以下
a
、b
和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
响应是通道中的条目数。如果通道是新创建的,则在创建第一个、第二个和第三个校准字段后,浏览器将分别返回 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
,在“附加板卡管理器 URL”中输入 https://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 密钥。您不需要更改代码中的系数,因为程序会从您的通道中读取它们。连接后,设备每两分钟测量一次热敏电阻两端的电压。它根据您通道中存储的校准计算温度,并将温度发布到您的通道。
代码
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℃,室温一般为24-26℃。如果您有沸水,则温度为 100°C。如果没有沸水,可以用手指挤压热敏电阻,并使用 33°C 作为表面温度的估计值。您可以使用您的设备通过此过程来校准系数。
1) 初始化系数。使用之前建议的值或其他一些猜测。
2) 启动您的设备并观察串行监视器。串行监视器中显示的 ADC 值是电压的精确测量值,但在校准完成之前会产生不正确的温度。
3) 将热敏电阻放入冰水浴 (0 °C) 中。使用以下热敏电阻电阻公式将 ADC 值转换为电阻测量值。
4) 记录室温(约 25 °C)和高温的温度和 ADC 值。如果没有沸水,用手指挤压热敏电阻,33°C 是一个合理的估计值。
5) 将所有 ADC 值转换为电阻。使用 Thermistor Calculator 求解热敏电阻的系数。将新系数上传到您的通道并重置设备。