Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

发布温度数据并从通道读取

此示例演示如何从设备收集环境数据并将其从设备发布到 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 密钥”选项卡上找到这些密钥。

  • 使用网络浏览器地址栏填充校准字段。以下 abc 为估计值。您可以从这些值开始,然后按照 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 模型将热敏电阻的测量电阻转换为温度。该模型的形式为:

T=1(a+B*ln(R)+C*ln(R)3)

您可以通过测量热敏电阻在三个不同温度下的电阻来确定系数。冰水浴非常接近0℃,室温一般为24-26℃。如果您有沸水,则温度为 100°C。如果没有沸水,可以用手指挤压热敏电阻,并使用 33°C 作为表面温度的估计值。您可以使用您的设备通过此过程来校准系数。

1) 初始化系数。使用之前建议的值或其他一些猜测。

2) 启动您的设备并观察串行监视器。串行监视器中显示的 ADC 值是电压的精确测量值,但在校准完成之前会产生不正确的温度。

3) 将热敏电阻放入冰水浴 (0 °C) 中。使用以下热敏电阻电阻公式将 ADC 值转换为电阻测量值。

R=105*(1024ADC-1)

4) 记录室温(约 25 °C)和高温的温度和 ADC 值。如果没有沸水,用手指挤压热敏电阻,33°C 是一个合理的估计值。

5) 将所有 ADC 值转换为电阻。使用 Thermistor Calculator 求解热敏电阻的系数。将新系数上传到您的通道并重置设备。

另请参阅

相关主题