前言:
本篇博客记录一下以arduino IDE来开发一下ESP8266NodeMCU,实现用DHT11进行温湿度检测,并且上传新版的onenet官网;我在实现这个小项目的时候,发现网上资料有关onenet的资料都是旧版的,这就有点难受了,本着开源的精神,这篇博客就来弥补一下这方面资料的缺失。
前期准备工作:
硬件方面:
1、ESP8266NodeMCU
2、DHT11传感器
3、一根USB转micoUSB线,杜邦线若干
在新版Onenet上创建一个设备
1、首先我们要先注册一个onenet账号,这里我就不再给大家写具体步骤了。
2、注册完之后,点击箭头所指,进入开发者中心
3、继续点击费用中心
4、接下来会弹出一个崭新的界面
5、将鼠标悬停在左侧箭头所指区域,会展开以下界面
6、选择多协议接入
7、我们点击添加产品
8、根据箭头和方框提示来写一些必要的信息,这个是可以随便写的,只要我们确定联网方式是wifi、接入协议是MQTT(旧版)这几个即可。
9、我们点击立刻添加设备
10、点击添加设备
11、会给我们弹出一个新的界面
12、这里也是可以随便写的,写完必选的选项,点击添加。
13、添加完成之后,我们就可以看到一个新的界面,在这个界面里,设备一开始离线的,这是正常的,此外,我们的设备ID需要记录一下,后续我们需要来根据设备ID来修改一下自己的代码。
14、我们点击这个详情,可以看到我们总的一个设备情况
15、进入新界面后,我们点击添加APIkey
16、这个APIKey是可以由我们自己来设定,这里我就随便写写了,这个官网会给我们生成一个对应的APIKey码,我这里就是随便写的,只要凑够16个就可以。
17、点击提交之后,就会给我们生成一个新的APIKey,这个也要记住,后续写代码也是要记住的。
19、我们点击产品概况,来查看一下我们的产品ID,这个也要记录一下,因为后续写代码我们也要用到的。
到这一步为止,我们的onenet设备就算是配置好了,接下来就是在arduinoIDE上添加一个ESP8266设备了。
arduinoIDE添加ESP8266
如果一开始我们选择使用arduino IDE来编辑ESP8266是需要在编辑器上进行一些操作的
1、打开菜单栏的文件->首选项,将下面的网址复制到指定位置
http://arduino.esp8266.com/stable/package_esp8266com_index.json
2、然后再打开工具,将鼠标悬停在开发板那个位置,会出现开发板管理,如果没有出现的话,也只是说明arduino版本不同罢了,这一点没啥问题的,如图所示
3、我们点击开发板管理,弹出以下界面,我们在箭头所指区域搜索ESP8266,然后找到一个合适的版本进行下载。
4、开始下载。
5、这过程很容易出错,出错了也不要紧,一旦报错,那就多下载几次,一定要保证网络的通畅,否则会下载不了。
6、 下载完成后,我们需要重启一下我们的IDE才能在开发板的位置发现我们的下载下来的开发板,这里一定要选择我鼠标悬停的开发板,我们的ESP8266NodeMCU对应的开发板就是NodeMCU 1.0,这里千万不能选错,否则很容易出现一些错误。
安装CP2102的驱动
我们一开始将ESP8266NodeMCU与我们的电脑连接的话,是没办法识别到我们的串口的,也就是说,一开始烧录代码是烧录不进去的。大家如果插上ESP8266NodeMCU之后,电脑的设备管理器是会出现下面这个界面。
这里我是之前安装过CP2102的驱动,一开始我看错了以为这个ESP8266NodeMCU板载的是CH340驱动呢,后来仔细看了一下不是,我们还需要安装一个CP2102的驱动,这里我也给大家找了一款合适的驱动,我放在了百度网盘里面CP2102驱动 提取码是:brqt
下载下来之后,我们根据电脑的类型来选择对应的驱动。64位的话,我们就选择X64,如果是32位的话,我们选择X86。
双击运行即可。直接点击下一步,傻瓜式安装。
安装完之后,我们就可以发现串口被识别到了。
至此,我们的前期准备工作算是完成了。
硬件引脚连接
DHT11管脚 | ESP8266NODEMCU管脚 |
GND | GND |
VCC | 3V3 |
DATA | D6 |
代码部分:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Ticker.h>
#include <dht11.h>
#define WIFI_DEBUG 0 //1:使用一键配网,其它值则使用默认无线账号密码
#define DHT11PIN 12 //设置DHT引脚为Pin 12
#define ONENET_DISCONNECTED 1 //已经断开
#define ONENET_CONNECTED 2 //已经连接上
#define ONENET_RECONNECT 3 //重连成功
#define VER "ESP8266_MQTT_V1.0" //版本号
const char* ssid = "********";//你的wifi账号
const char* password = "********";//wifi密码
/*OneNet*/
PubSubClient mqttClient;
const char* mqttServer = "183.230.40.39";//mqtt服务器
const uint16_t mqttPort = 6002; //端口号
#define onenet_productId "******" //产品ID
#define onenet_deviceId "**********" //设备ID
#define onenet_apiKey "******************" //API_KEY
int state;
Ticker delayTimer;
WiFiClient espClient;
dht11 DHT11;
/* 延时N秒 */
void delayNs(uint8_t m){
for(uint8_t index = 0;index<m;index ++){
delay(1000);
ESP.wdtFeed();
}
}
/* 延时重启 */
void delayRestart(float t) {
Serial.print("Restart after ");
Serial.print(t);
Serial.println("s");
delayTimer.attach(t, []() {
Serial.println("\r\nRestart now!");
ESP.restart();
});
}
/* 自动连接 */
bool autoConfig()
{
WiFi.begin();
for (int i = 0; i < 20; i++)
{
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("AutoConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
WiFi.printDiag(Serial);
return true;
}
else
{
Serial.print("AutoConfig Waiting......");
Serial.println(WiFi.status());
delay(1000);
}
}
Serial.println("AutoConfig Faild!" );
return false;
}
/* 一键配网 */
void smartConfig()
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig");
WiFi.beginSmartConfig();
while (1)
{
Serial.print(".");
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
if (WiFi.smartConfigDone())
{
Serial.println("SmartConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
WiFi.setAutoConnect(true); // 设置自动连接
break;
}
delay(1000); // 这个地方一定要加延时,否则极易崩溃重启
}
}
/* 连接OneNet */
int connectToOneNetMqtt(){
int cnt = 0;
while(!mqttClient.connected()){
ESP.wdtFeed();
cnt++;
Serial.println("Connect to OneNet MQTT...");
if (mqttClient.connect(onenet_deviceId,onenet_productId,onenet_apiKey)) {
Serial.println("connect success!");
return ONENET_RECONNECT;
} else {
Serial.print("connect fail!");
Serial.println(" try again in 5 seconds");
delayNs(5);
}
if(cnt >=10){
//只做10次连接到OneNet,连接不上重启8266
cnt = 0;
delayRestart(1);
}
}
return ONENET_CONNECTED;
}
/* 云端下发 */
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if ((char)payload[0] == '1') {
digitalWrite(LED_BUILTIN, LOW);
} else {
digitalWrite(LED_BUILTIN, HIGH);
}
}
/* 发布温度信息 */
void Temp_pubMQTTmsg(uint32_t data){
long lastMsg = 0;
char msg[50];
char tmp[28];
char d[3];
snprintf(tmp,sizeof(tmp),"{\"Temp\":%d}",data);
uint16_t streamLen= strlen(tmp);
d[0]='\x03';
d[1] = (streamLen >> 8);
d[2] = (streamLen & 0xFF);
snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp);
mqttClient.publish("$dp", (uint8_t*)msg,streamLen+3,false);
}
/* 发布湿度信息 */
void Humi_pubMQTTmsg(uint32_t data){
long lastMsg = 0;
char msg[50];
char tmp[28];
char d[3];
snprintf(tmp,sizeof(tmp),"{\"Humi\":%d}",data);
uint16_t streamLen= strlen(tmp);
d[0]='\x03';
d[1] = (streamLen >> 8);
d[2] = (streamLen & 0xFF);
snprintf(msg,sizeof(msg),"%c%c%c%s",d[0],d[1],d[2],tmp);
mqttClient.publish("$dp", (uint8_t*)msg,streamLen+3,false);
}
/* 初始化系统 */
void initSystem(){
int cnt = 0;
Serial.begin (115200);
Serial.println("\r\n\r\nStart ESP8266 MQTT");
Serial.print("Firmware Version:");
Serial.println(VER);
Serial.print("SDK Version:");
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
Serial.println(ESP.getSdkVersion());
ESP.wdtEnable(5000);
if(WIFI_DEBUG==1)//开启一键配网模式
{
if (!autoConfig())
{
Serial.println("Start smartConfig");
smartConfig();
}
}
else
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
cnt++;
Serial.print(".");
if(cnt>=40){
cnt = 0;
//重启系统
delayRestart(1);
}
}
}
Serial.print("WIFI Connect \r\n");
}
/* 初始化ONENET通信 */
void initOneNetMqtt(){
mqttClient.setServer(mqttServer,mqttPort);
mqttClient.setClient(espClient);
mqttClient.setCallback(callback);
}
/* 初始化 */
void setup() {
initSystem();
initOneNetMqtt();
}
/* 主函数 */
void loop() {
ESP.wdtFeed();
DHT11.read(DHT11PIN);
state = connectToOneNetMqtt();
Serial.println(WiFi.status());
if(state == ONENET_RECONNECT){
mqttClient.loop();
}
else if(state == ONENET_CONNECTED){
printf("temp:%d \r\n",DHT11.temperature);
printf("humi:%d \r\n",DHT11.humidity);
Temp_pubMQTTmsg(DHT11.temperature);
Humi_pubMQTTmsg(DHT11.humidity);
mqttClient.loop();
}
delay(2000);
}
这里面大家需要修改的就是我上面给大家提醒要记录下来的产品ID,设备ID,APIkey,以及你自己的手机热点和密码。
当然,如果大家进行编译的时候,一定要先将开发板选择为ESP8266NodeMCU。然后还是汇报
而这些库都是可以在官网上找到的,我这里也给大家整理了一下如果没有这些库那该怎么办。
如果没有对应的库,该怎么办
1、将下面的网址复制到浏览器里
https://www.arduino.cc/reference/en/libraries/
2、进入如下界面
3、在箭头所指的地方搜索缺少的库。
4、这里我以PubSubClient.h为例,搜索之后,点击第一个
5、进入以下界面,这里我是选择了最新的版本,点击之后就会自动下载了。
6、进入Arduino IDE,点击项目->加载库->添加.zip库。选到刚下载的文件路径,指定文件后就可直接安装,在IDE命令窗中可以看到安装成功提示。
7、其余几个库也是同样的道理。
进行编译:
编译完之后是这样的,不是报错。
在烧录之前,我们要先选择刚才我们在设备管理器里看到的那个串口,然后点击工具->端口->选择CP2102对应的那个串口,然后才能进行烧录。
如果进行烧录操作,会出现下图所示的效果,就说明已经OK了。
这时候,代码里加入了串口查看部分,我们可以在串口监视器里面看到现在的温度和湿度。我们可以打开串口显示器来查看一下效果。
也可以进入onenet官网看一下效果。
文章来源:https://www.toymoban.com/news/detail-489721.html
文章来源地址https://www.toymoban.com/news/detail-489721.html
到了这里,关于使用arduino IDE开发ESP8266NodeMCU连接DHT11实现温湿度检测并上传onenet官网的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!