概述
近期在做一个教学案例时,用到ESP8266来实现物联网平台的数据传输和控制。中间走过了很多波折,查阅了很多资料和博主的资料,基本搞定。为了避免大家少走弯路,把我开发这个应用过程中的经验整理一篇文档,供大家参考。
硬件:
1. ESP8266开发板(NodeMCU)
某东、某宝上都能买到,或者直接买乐鑫的官方原版(要带USB串口连接线)
2. 温湿度传感器
3. LED灯、杜邦线、电阻灯若干
一、Arduino IDE软件开发环境准备
1. 安装ESP8266库
(1)文件菜单下的首选项对话框的附加开发板管理器网址,输入:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
(2)重启Arduino,选择工具->开发板->开发板管理器,安装ESP8266库(此过程会比较慢,可以多试几次,或者找一下离线版安装指南)
(3)安装温湿度传感器等DHT库文件:工具->管理库
安装DHT sensor library 和 DHT sensor library for ESPx等DHT所需库文件
二、测试ESP8266开发板
1. 选择开发板和ESP8266对应的端口
注意:端口要根据实际电脑中安装好ESP8266开发板驱动后分配的串口
(不知道的话,可以打开设备管理器查一下即可)
2. 打开ESP8266库自带的案例程序blink(这个要在ESP8266库安装好以后才能看到的)
上面的代码很简单,加载到ESP8266开发板之后,就会看到板载的LED灯在闪烁。到这一步就说明ESP8266的软件开发环境、库文件和硬件都安装成功。
可以看出,Arduino IDE对ESP8266开发的支持还是很友好的,和Arduino程序开发没什么不同。可以通过以下通过ESP8266开发板控制LED灯亮灭的程序来感受一下使用Arduino开发ESP8266程序的简洁之处。
硬件线路图:(LED灯正极接在了ESP8266的D7引脚)
注意ESP8266引脚的编号:
* Node MCU开发板和Arduino开发板一样的操作方式
* 数字 13=D7;16=D0;15=D8;14=D5;4=D2;3=D9;2=D4;1=D10;0=D3;
三、测试ESP8266开发板接入WiFi
1. 软件代码(代码上的都是截图,需要大家自己敲代码找感觉,据说代码要自己敲才能找的感觉)
以上代码在使用时,要注意吧ssid修改为接入的WiFi路由器名称,password修改为接入密码。
代码下载到ESP8266开发板以后,打开串口监视器时,通过串口输出的调试信息可能已经结束,此时,可以按一下ESP8266开发板的复位键,让ESP8266重新启动,就可以看到WiFi连接成功所获得的IP地址了。
我用ESP8266时,先用手机的热点来测试的WiFi,但始终没有成功,就设置了一个路由器测试,终于成功。不知道原因何在。
四、ESP8266获得温湿度传感器检测到的温湿度值
1. 硬件连接图(DHT11温湿度传感器的S信号端口,接在ESP8266开发板的D4端口)
2. 软件代码
五、中移动OneNET平台注册设备和应用。
1. 登录中移动OneNET平台
2. 新建产品
选择全部产品服务->基础服务->多协议接入,添加产品(注意要选中HTTP协议:后面的案例都是采用HTTP协议进行数据的传输)
3. 添加设备
要给添加的设备设置一个APIKey,作为设备的唯一标识。
4. 添加数据流
添加存储温湿度传感器传来的温度、湿度数据,以及控制LED灯对应的数据流。
5. 创建应用
(1)创建展示ESP8266通过WiFi传输到OneNET平台的温湿度数据,通过OneNET平台发送指令,控制ESP8266连接LED灯的亮灭。
(2)添加仪表盘、折线图和开关三个组件,仪表盘展示湿度值,折线图显示温度值,开关控制LED灯亮灭
(3)为相关组件指定数据流(仪表盘--Humidity,折线图--Temperature,开关--LED)
刷新频率最高设置为每3秒一次。
6. 测试应用
应用创建好后,可以观察设备的数据流展示,当单击开关按钮的ON时,LEDLinghControl会变成1,单击OFF时,LEDLightControl会变成0。在ESP8266中,可以通过HTTP协议来读取改数据的值,根据1或0来控制LED灯的亮灭。
因为温湿度还没有上传数据,所以对应的两个数据流展示的都是null。
六、ESP8266通过WiFi连接到OneNET平台上创建的设备
1. 连接OneNet服务器
根据OneNET服务的IP地址(183.230.40.33)和默认端口(80),以客户端的的方式建立和OneNET服务器的连接。做好数据上传和下载的准备。
const char *host = "183.230.40.33"; //OneNet 服务器的IP地址
const int tcpPort = 80; //OneNET 服务器连接的端口号
WiFiClient client;
while(!client.connected()) {
if(!client.connect(host,tcpPort)) { //OneNET服务器IP地址:183.230.40.33,默认端口号为:80
Serial.print("Connecting Sever...");
delay(500);
}
}
Serial.println("成功连接OneNET平台");
2. 上传数据
float humidity, temperature;
char buf[10];
DHT11.read(DHT11PIN); //读取传感器发送来的温湿度数据
humidity = (float)DHT11.humidity;
temperature = (float)DHT11.temperature;
Serial.print("当前湿度(%):");
Serial.println(humidity, 2);
Serial.print("当前温度(°C):");
Serial.println(temperature, 2);
if(client.connected()) {
String url = "http://api.heclouds.com/devices/786069927/datapoints?type=3"; //786069927:OneNET平台上创建设备的ID
client.print(String("POST ") + url + " HTTP/1.1rn");
client.print(String("api-key: ") + "QobZgseveE0fdhA=9ilxRIXPTmc=rn"); //OneNET平台上生成的设备APIkey
client.print(String("Host: ") + "api.heclouds.comrn");
//按照JSON格式上传数据
String jsonToSend = "{"Temperature":";
dtostrf(temperature, 1, 2, buf);
jsonToSend += """ + String(buf) + """;
jsonToSend += ","Humidity":";
dtostrf(humidity, 1, 2, buf);
jsonToSend += """ + String(buf) + """;
jsonToSend += "}";
client.print("Content-Length:" + String(jsonToSend.length()) + "rnrn");
client.print(jsonToSend);
}
Serial.println("上传数据到OneNET平台成功!");
delay(5000);
3. 读取OneNET平台上的数据
if(client.connected()) {
String url = "http://api.heclouds.com/devices/786069927/datastreams/LEDLightControl?type=3";
client.print(String("GET ") + url + " HTTP/1.1rn");
client.print(String("api-key: ") + "OJ1fgSphDtrUf7LziV=8eA5Mt4I=rn");
client.print(String("Host: ") + "api.heclouds.comrn");
delay(4000);
}
4. 根据读取到的通过OneNET平台设置的开关值,控制LED灯亮灭
这里使用的是一个非常简单的字符串查找函数来实现,比较优雅的代码应该是通过出来JSON数据来进行。
String shuju;
while(client.available()) {
shuju += char(client.read());
delay(2);
mark = 1;
}
Serial.println("成功读取服务器端数据");
if(mark == 1) { // 对获取的数据进行处理
Serial.println(shuju);
led1 = String(shuju).substring(315,316); ///赋值led灯是shuju的第315个数据到第316个数据
Serial.println(led1);
}
if(led1 == "1") {
digitalWrite(LED, HIGH);
}
if(led1 == "0") {
digitalWrite(LED, LOW);
}
mark = 0;
}
至此,可以通过OneNET发送开关信号给ESP8266开发板控制LED灯亮灭。也可以把温湿度传感器采集到的温湿度数据上传到OneNET平台上显示出来。
存在的问题:
1. 单独调试温湿度数据上传OneNET平台没有问题;
2. 单独调试读取OneNET(GET方式)无法成功;
3. 把数据上传(POST)、读取OneNET平台中的开关控制数据流,放在一起的时候,能够读取开关控制数据流,但是不能上传数据到OneNET平台;
原因:对HTTP协议实现OneNET平台数据原理研究的不够彻底。POST和GET方式的处理存在问题。后期需要加强这方面的研究。
完整源代码下载链接(发个广告,赚点C币):
https://download.csdn.net/download/aaronmeng/24368037
最后
以上就是爱笑早晨为你收集整理的使用Arduino开发ESP8266应用(OneNET平台实现温湿度数据存储和LED灯控制)的全部内容,希望文章能够帮你解决使用Arduino开发ESP8266应用(OneNET平台实现温湿度数据存储和LED灯控制)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复