主要内容

后温度数据和读取通道

此示例显示了如何从设备中收集环境数据并将其从设备发布到ithiteSpeak™通道。该示例使用ESP8266和ThingSpeak通信库来发布数据并从通道检索数据。

金宝app支持的硬件

  • ESP8266-12

  • ESP8266-12E

本例使用模拟热敏电阻和ESP8266-12的内置ADC来读取电压并将其转换为温度。热敏电阻是一种电阻与温度成反比的器件。热敏电阻的校准数据存储在通道中并由设备读取。校准数据是基于对Steinhart-Hart模型的拟合。一些制造商在设备中提供这种校准数据。你可以通过测量热敏电阻在三种不同温度下的电阻来拟合这些参数。有关更多信息,请参见校准温度系数

设置

  • 创建一个ThingSpeak频道,如图所示在新通道中收集数据

  • 至少启用两个字段:一个用于读,一个用于写。数据写入字段1、2、3。字段6、7和8用于存储温度校准系数。这张图片显示了频道设置查看单个通道设置。

  • 录制您的读取API键并写入API键,您可以在此处找到API密钥选项卡的频道设置视图。

  • 使用web浏览器地址栏填充校准字段。的下列值一个b, 和c是估计。你可以从这些值开始,然后校准你的热敏电阻,如所述校准温度系数.修改以下文本与您的写入API键,并直接粘贴到浏览器的地址栏。

  • 设置一个系数:

https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field6=0.002039
  • 设置b系数:

https://api.thingspeak.com/update?api_key=your写API键和Field7 = 0.0000672
  • 设置c系数:

https://api.thingspeak.com/update?api_key=your写API键和Field8 = 0.000000008929
  • 响应是通道中的条目数。如果通道是新创建的,则在分别创建第一个、第二个和第三个校准字段之后,浏览器返回1、2和3。

所需的硬件

  • ESP8266。此示例在Nodemcu开发板上使用ESP8266-12E。ESP8266-01不会暴露ADC引脚。可以使用带有ESP8266-01的数字接口温度传感器。

  • 10kΩ热敏电阻,如牛章MF52A2103J3470。

  • 10 kΩ电阻。高容限电阻器,1%或更少,产生更好的结果。

  • 试验板。

  • 跳线(至少3根)。

原理图和连接

连接以下引脚:

  • Nodemcu上的热敏电阻的一个引脚以PIN A0

  • 热敏电阻的第二个引脚到10kΩ电阻

  • 第二个电阻引脚接地,必须与ESP8266共用

NodeMCU板有一个内置的分压器,将ESP8266 ADC的1v输入范围转换为3.3 V范围。如果你有一块没有内置分压器的电路板,可以考虑增加一个100 kΩ的接地电阻和220 kΩ的电源。

计划你的ESP8266

1)下载最新Arduino®IDE。

2)添加ThingSpeak库Arduino和ESP8266

一。选择草图>包括图书馆>管理库

b。选择ThingSpeak把它加到你的素描里。

3)增加ESP8266单板包。

一个)文件>首选项,输入https://arduino.esp8266.com/stable/package_esp8266com_index.json额外的Board Manager url

b)选择工具>董事会>董事会的经理.进入ESP8266.在搜索栏中并安装包。

4)在Arduino IDE中选择相应的端口和电路板。用于生成此示例的硬件使用了节点MCU 1.0(ESP 8266-12E)选项。

5)创建应用。在Arduino IDE中打开一个新窗口,并保存文件。添加这里提供的代码。请确保更改无线网络信息、通道id(您可以使用单个通道)、读取API密钥和写入API密钥。您不需要更改代码中的系数,因为程序从您的通道读取它们。一旦连接上,该设备每两分钟测量一次热敏电阻上的电压。它根据存储在通道中的校准计算温度,并将温度发送到通道。

代码

1)第一部分初始化变量。请确保编辑读API密钥和写API密钥、通道编号和无线网络连接信息。

#include < thingtalk .h> #include  //网络参数const char* ssid = "SSSSSSS";const char* password = "PPPPPPPPPP";// ThingSpeak information char thingSpeakAddress[] = "api.thingspeak.com";unsigned long channelID = NNNNNN;char* readAPIKey = "XXXXXXXXXXXXXXXX";char* writeAPIKey = " yyyyyyyyyyyyyy ";const unsigned long postingInterval = 120L * 1000L;unsigned int dataFieldOne = 1;//写入温度数据的字段unsigned int dataFieldTwo = 2;//写入温度数据的字段unsigned int datfieldthree = 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)在设置功能,启动串行监视器并读取校准常数。

void setup() {Serial.begin(9600);以“开始”);connectWiFi ();//在启动时读取常量。const = readTSData(channelID, field);bConst = readTSData(channelID, bField);cConst = readTSData(channelID, cField);}

3)主循环连续检查,看看自读取温度以来已经多长时间。如果已经过了设定的时间段,则读取设备,计算温度,并将输出写入您的频道。

void循环(){//才能更新,仅在超出发布时间(millis() -  lastupdatetime> = postinginterval){float fahrenheittemperature,celsiustemperature;lastupdatetime = millis();Float ReadValue = Analogread(A0);float logr = log(10000 *(1024 / Readvalue  -  1));//单独计算简单和调试Celsiustemperature = 1 /(Aconst + BConst * Logr + CConst * Pow(LogR,3)) -  273.15;//计算摄氏温度Fahrenheittemperature = Celsiustemperature * 9/5 + 32;serial.println(“ADC =”+ String(ReadValue)+“temp =”+字符串(Fahrenheittemperature));write2tsdata(ConnestID,Datafieldone,Fahrenheittemperature,DatafieldTWO,Celsiustemperatucte,DatafieldThree,Millis());//自开始以来的F,C和时间内的温度。}}

4)将您的设备连接到无线网络使用connectwifi.函数。

int connectwifi(){wifi.status()!= wl_connected){wifi.begin(SSID,密码);延迟(2500);serial.println(“连接到WiFi”);serial.println(“连接”);ThingSeak.Begin(客户);}

5.使用。从通道上的单个字段读取数据readTSData.你可以使用writeTSDataand将一个值写入ThingSpeak,并同时写入多个值write2tsdata.

float readTSData(long tchannel,unsigned int TSField){float data = ThingSpeak。readFloatField(tchannel, TSField, readAPIKey);系列。println(" Data read from ThingSpeak: " + String(Data, 9));返回数据;} //如果要编写单个字段,请使用此函数。int writesdata (long tchannel, unsigned int TSField, float data){int writessuccess = ThingSpeak. write ();writeField(tchannel, TSField, data, writeAPIKey);//将数据写入通道if (writessuccess){Serial. Write ();println(String(data) + " written to Thingspeak.");}返回writeSuccess;} //如果你想同时写多个字段,可以使用这个函数。int write2TSData(long tchannel, 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 一个 + B ln R + C ln R 3.

你可以通过测量热敏电阻在三种不同温度下的电阻来确定这些系数。冰水浴的温度非常接近0°C,而室温通常是24-26°C。如果有沸水,温度是100°C。如果你没有沸水,你可以挤压热敏电阻之间你的手指和使用33°C作为表面温度的估计。您可以使用您的设备通过这个程序校准系数。

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

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

3)将热敏电阻放入冰水中(0°C)。将ADC值转换为电阻测量与下列公式的热敏电阻。

R 10 5 1024 ADC - 1

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

5)将所有ADC值转换为电阻。使用热敏电阻的计算器为热敏电阻的系数解决。将新系数上传到频道并重置设备。

另请参阅

相关话题