我是靠谱客的博主 爱笑早晨,最近开发中收集的这篇文章主要介绍使用Arduino开发ESP8266应用(OneNET平台实现温湿度数据存储和LED灯控制),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

近期在做一个教学案例时,用到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灯控制)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部