使用arduino IDE开发ESP8266NodeMCU连接DHT11实现温湿度检测并上传onenet官网

前言:

        本篇博客记录一下以arduino IDE来开发一下ESP8266NodeMCU,实现用DHT11进行温湿度检测,并且上传新版的onenet官网;我在实现这个小项目的时候,发现网上资料有关onenet的资料都是旧版的,这就有点难受了,本着开源的精神,这篇博客就来弥补一下这方面资料的缺失。

前期准备工作:

硬件方面:

        1、ESP8266NodeMCU

         2、DHT11传感器

         3、一根USB转micoUSB线,杜邦线若干

在新版Onenet上创建一个设备

        1、首先我们要先注册一个onenet账号,这里我就不再给大家写具体步骤了。

        2、注册完之后,点击箭头所指,进入开发者中心

         3、继续点击费用中心

扫描二维码关注公众号,回复: 15369751 查看本文章

         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官网看一下效果。

猜你喜欢

转载自blog.csdn.net/weixin_51651698/article/details/131262456