ESP8266 DHT11温湿度传感器数据上传OneNET平台教程
ESP8266 DHT11温湿度传感器数据上传OneNET平台教程
本教程将带您一步步实现使用ESP8266连接DHT11温湿度传感器,并将读取到的数据上传至OneNET平台。
所需硬件:
- ESP8266开发板
- DHT11温湿度传感器
- 杜邦线
- Arduino开发板
软件准备:
- Arduino IDE
- OneNET平台账号
步骤:
-
连接硬件
- 将DHT11温湿度传感器连接至Arduino开发板的数字管脚4,并确保连接正确。
- 将ESP8266开发板连接至Arduino开发板的TX和RX管脚,并根据ESP8266的TX和RX管脚进行交叉连接。
- 连接电源模块并上电。
-
配置ESP8266WIFI设置
- 在代码中填写2.4GHz的WIFI名称和密码,确保不要使用校园网。
- 填写OneNET平台的设备ID和APIKey。
-
安装库文件
- 在Arduino IDE中安装
ESP8266.h、dht11.h、SoftwareSerial.h和Servo.h库文件。建议使用教程中修改后的ESP8266.h文件。
- 在Arduino IDE中安装
-
上传代码
- 将以下代码复制到Arduino IDE中并上传到Arduino开发板。
#include 'ESP8266.h'
#include 'dht11.h'
#include 'SoftwareSerial.h'
#include<Servo.h>
//配置ESP8266WIFI设置
#define SSID 'HONOR Play4T' //填写2.4GHz的WIFI名称,不要使用校园网
#define PASSWORD '12345678'//填写自己的WIFI密码
#define HOST_NAME 'api.heclouds.com' //API主机名称,连接到OneNET平台,无需修改
#define DEVICE_ID '1099655073' //填写自己的OneNet设备ID
#define HOST_PORT (80) //API端口,连接到OneNET平台,无需修改
String APIKey = 'IiJSs17atNND2C77wumz03w63hw='; //与设备绑定的APIKey
#define INTERVAL_SENSOR 5000 //定义传感器采样及发送时间间隔
//创建dht11示例
dht11 DHT11;
//创建舵机
Servo myservo;
int servoPin=7;
int light=0;
int servoPos=0;
//定义DHT11接入Arduino的管脚
#define DHT11PIN 4
//定义ESP8266所连接的软串口
/*********************
* 该实验需要使用软串口
* Arduino上的软串口RX定义为D3,
* 接ESP8266上的TX口,
* Arduino上的软串口TX定义为D2,
* 接ESP8266上的RX口.
* D3和D2可以自定义,
* 但接ESP8266时必须恰好相反
*********************/
SoftwareSerial mySerial(3, 2);
ESP8266 wifi(mySerial);
void setup()
{
mySerial.begin(115200); //初始化软串口
Serial.begin(9600); //初始化串口
Serial.print('setup begin\r\n');
myservo.attach(servoPin);
myservo.write(0);
//以下为ESP8266初始化的代码
Serial.print('FW Version: ');
Serial.println(wifi.getVersion().c_str());
if (wifi.setOprToStation()) {
Serial.print('to station ok\r\n');
} else {
Serial.print('to station err\r\n');
}
//ESP8266接入WIFI
if (wifi.joinAP(SSID, PASSWORD)) {
Serial.print('Join AP success\r\n');
Serial.print('IP: ');
Serial.println(wifi.getLocalIP().c_str());
} else {
Serial.print('Join AP failure\r\n');
}
Serial.println('');
Serial.print('DHT11 LIBRARY VERSION: ');
Serial.println(DHT11LIB_VERSION);
mySerial.println('AT+UART_CUR=9600,8,1,0,0');
mySerial.begin(9600);
Serial.println('setup end\r\n');
}
unsigned long net_time1 = millis(); //数据上传服务器时间
void loop(){
if (net_time1 > millis())
net_time1 = millis();
if (millis() - net_time1 > INTERVAL_SENSOR) //发送数据时间间隔
{
int chk = DHT11.read(DHT11PIN);
Serial.print('Read sensor: ');
switch (chk) {
case DHTLIB_OK:
Serial.println('OK');
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println('Checksum error');
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println('Time out error');
break;
default:
Serial.println('Unknown error');
break;
}
float sensor_hum = (float)DHT11.humidity;
float sensor_tem = (float)DHT11.temperature;
Serial.print('Humidity (%): ');
Serial.println(sensor_hum, 2);
Serial.print('Temperature (oC): ');
Serial.println(sensor_tem, 2);
Serial.println('');
if (wifi.createTCP(HOST_NAME, HOST_PORT)) { //建立TCP连接,如果失败,不能发送该数据
Serial.print('create tcp ok\r\n');
char buf[10];
//拼接发送data字段字符串
String jsonToSend = '{\'Temperature\':';
dtostrf(sensor_tem, 1, 2, buf);
jsonToSend += '\'' + String(buf) + '\'';
jsonToSend += ',\'Humidity\':';
dtostrf(sensor_hum, 1, 2, buf);
jsonToSend += '\'' + String(buf) + '\'';
jsonToSend += ',\'light\':';
jsonToSend+= '\'' + String(light) + '\'';
jsonToSend += '}';
//拼接POST请求字符串
String postString = 'POST /devices/';
postString += DEVICE_ID;
postString += '/datapoints?type=3 HTTP/1.1';
postString += '\r\n';
postString += 'api-key:';
postString += APIKey;
postString += '\r\n';
postString += 'Host:api.heclouds.com\r\n';
postString += 'Connection:close\r\n';
postString += 'Content-Length:';
postString += jsonToSend.length();
postString += '\r\n';
postString += '\r\n';
postString += jsonToSend;
postString += '\r\n';
postString += '\r\n';
postString += '\r\n';
const char *postArray = postString.c_str(); //将str转化为char数组
Serial.println(postArray);
wifi.send((const uint8_t *)postArray, strlen(postArray)); //send发送命令,参数必须是这两种格式,尤其是(const uint8_t*)
Serial.println('send success');
if (wifi.releaseTCP()) { //释放TCP连接
Serial.print('release tcp ok\r\n');
} else {
Serial.print('release tcp err\r\n');
}
postArray = NULL; }//清空数组,等待下次传输数据
else {
Serial.print('create tcp err\r\n');
}
//控制舵机转动
Serial.println('');
net_time1 = millis();
}
如果wifi中没有available函数,如何处理onenet的命令,给出代码内容:如果ESP8266没有available函数,可以使用AT指令向OneNet平台发送命令,具体代码如下:
//连接WIFI和OneNet平台的代码不变
void loop(){
//读取串口数据,判断是否有命令
if (Serial.available() > 0){
String cmd = Serial.readStringUntil('\n');
if (cmd.indexOf('light_on') != -1){
digitalWrite(LED_PIN, HIGH);
String response = 'Light on\r\n';
Serial.print(response);
//向OneNet平台回复命令执行结果
String cmd_resp = '{\'id\':123,\'status\':0,\'error\':\'\',\'data\':{\'cmd\':\'light_on\',\'resp\':\'success\'}}\r\n';
sendATcmd(cmd_resp);
}
else if (cmd.indexOf('light_off') != -1){
digitalWrite(LED_PIN, LOW);
String response = 'Light off\r\n';
Serial.print(response);
//向OneNet平台回复命令执行结果
String cmd_resp = '{\'id\':123,\'status\':0,\'error\':\'\',\'data\':{\'cmd\':\'light_off\',\'resp\':\'success\'}}\r\n';
sendATcmd(cmd_resp);
}
//其他命令的处理
}
}
//AT指令发送函数
void sendATcmd(String cmd){
mySerial.println('AT+CIPSTART='TCP','api.heclouds.com',80');
if (mySerial.find('OK')){
Serial.println('TCP connection ready');
}
else{
Serial.println('TCP connection failed');
return;
}
String postRequest = 'POST /cmds?device_id=';
postRequest += DEVICE_ID;
postRequest += ' HTTP/1.1\r\n';
postRequest += 'Host: api.heclouds.com\r\n';
postRequest += 'api-key: ' + APIKey + '\r\n';
postRequest += 'Content-Length: ';
postRequest += cmd.length();
postRequest += '\r\n\r\n';
postRequest += cmd;
postRequest += '\r\n';
mySerial.print('AT+CIPSEND=');
mySerial.println(postRequest.length());
if (mySerial.find('>')){
Serial.print('Sending data: ');
Serial.println(postRequest);
mySerial.print(postRequest);
}
else{
mySerial.println('AT+CIPCLOSE');
Serial.println('Connection closed');
}
delay(1000);
mySerial.println('AT+CIPCLOSE');
Serial.println('Connection closed');
}
-
配置OneNET平台
- 在OneNET平台中创建一个新的设备,并将设备ID和APIKey填入代码中。
- 创建数据流,名称分别为“Temperature”和“Humidity”,数据类型为“数字”。
-
验证
- 上传代码后,打开串口监视器,您应该看到ESP8266连接到WIFI并连接到OneNET平台的日志信息。
- 打开OneNET平台的设备页面,您应该可以看到传感器数据实时更新到平台上。
注意:
- 确保ESP8266.h库文件已正确安装,建议使用教程中修改后的ESP8266.h文件。
- 确保DHT11传感器连接正确,并确保连接到数字管脚4。
- 确保WIFI名称和密码、设备ID和APIKey填写正确。
代码说明:
- 该代码使用
dht11.h库读取DHT11传感器的数据,并使用ESP8266.h库连接WIFI和OneNET平台。 - 使用
createTCP函数建立TCP连接,并使用send函数将数据发送到OneNET平台。 - 使用
releaseTCP函数释放TCP连接。
问题解决:
- 如果您遇到连接问题,请确保WIFI名称和密码填写正确,并确保ESP8266开发板连接到正确的WIFI网络。
- 如果您遇到数据上传问题,请确保设备ID和APIKey填写正确,并检查代码中的POST请求字符串是否正确。
总结:
本教程介绍了如何使用ESP8266连接DHT11温湿度传感器,并将数据上传至OneNET平台。通过学习本教程,您可以掌握使用ESP8266进行传感器数据采集和云平台数据上传的基本方法。
原文地址: https://www.cveoy.top/t/topic/oJWd 著作权归作者所有。请勿转载和采集!