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

news2024/9/20 22:50:07

前言:

        本篇博客记录一下以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管脚
GNDGND
VCC3V3
DATAD6

代码部分:

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[MAUI]弧形进度条与弧形滑块的交互实现

文章目录 弧形基类定义绘制弧 弧形进度条(ProgressBar)添加动画宽度补偿文本 弧形滑块(Slider)创建控制柄拖动事件处理 项目地址 进度条&#xff08;ProgressBar&#xff09;用于展示任务的进度&#xff0c;告知用户当前状态和预期&#xff1b; 滑块&#xff08;Slider&#xf…

本地安装部署运行 ChatGLM-6B 的常见问题解答以及后续优化

报错 No module named ‘transformers_modules.THUDM/chatglm-6b’ 报错本身的意思是&#xff0c;没有在指定的路径THUDM/chatglm-6b找到推理用模型 一般常见于自己手动下载模型&#xff0c;而不是通过下边这些文件直接启动&#xff0c;自动下载的情况 你需要修改web_demo.py&…

分层测试终究是大梦一场空?

分层测试分了个寂寞&#xff1f; 分层测试这个风吹了好多年&#xff0c;不分层都不好意思说自己是专业测试。各互联网公司更是对此乐此不疲&#xff0c;测试架构、测试平台&#xff0c;搞了一套又一套&#xff0c;然而。。。 理想总是丰满&#xff0c;现实总是骨干&#xff0…

第十三章 反射操作相关函数

1. 【检测对象是否可被调用】callable()函数 语法参考 callable函数的语法格式如下&#xff1a; callable(object)参数说明&#xff1a; object&#xff1a;对象&#xff1b; 返回值&#xff1a;如果对象可调用返回 True&#xff0c;否则返回 False。 说明&#xff1a;对于…

Python 中print 和return 的区别,你了解吗?

1、print() print()函数的作用是输出数据到控制台,就是打印在你能看到的界面上。 2、return return语句[表达式]退出函数&#xff0c;选择性地向调用方返回一个表达式。不带参数值的return语句返回None。 return作为脚本单独运行时则需要print函数才能显示&#xff0c;但是…

【id:17】【1分】A. DS顺序表--类实现

题目描述 用C语言和类实现顺序表 属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09; 操作包括&#xff1a;创建、插入、删除、查找 类定义参考 输入 第1行先输入n表示有n个数据&#xff0c;即n是实际长度&#xff1b;接着输入n个数据 第2行输…

c语言项目——三子棋小游戏(带详细讲解解析)

1.三子棋是什么&#xff1f; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利&#xff0c;而对方就算输了&#xff0c;但是…

【MySQL 索引、事务与存储引擎】

目录 一、索引的介绍2、索引的作用3、创建索引的原刚依据&#xff08;面试题&#xff09; 二、索引的分类和创建1、普通索引2、唯一索引3、主键索引4、组合索引5、全文索引6、查看索引7、删除索引8、分析是否使用索引 三、MySQL事务介绍1、事务的ACID特性2、隔离性 --- 不一致的…

Linux编译器gcc/g++

文章目录 Liinux编译器gcc/g1.背景知识(程序的翻译)2.动态库、静态库 Liinux编译器gcc/g 1.背景知识(程序的翻译) 以gcc编译 以g编译&#xff0c;但是此时会发现没有g这个指令&#xff0c;所有需要安装它&#xff0c;安装指令 yum install gcc gcc-c gcc和g都会形成可执行文…

TransFusion:利用 Transformer 进行鲁棒性融合来进行 3D 目标检测

Query 初始化 Input-dependent 以往 Query 位置是随机生成或学习作为网络参数的&#xff0c;而与输入数据无关&#xff0c;因此需要额外的阶段&#xff08;解码器层&#xff09;来学习模型向真实对象中心移动的过程。 论文提出了一种基于center heatmap 的 input-dependent 初…

在 Python 中使用令牌进行 API 调用

文章目录 在 Python 中进行不带令牌的 API 调用在 Python 中使用令牌调用 API总结 当我们第一次遇到如何在 Python 中调用 API 的问题时&#xff0c;我们的第一个想法是&#xff0c;“什么是 API&#xff1f;”。 API是应用程序编程接口的首字母缩写&#xff1b; 它允许您访问…

【面试】Java并发编程

ThreadLocal ThreadLocal 为什么会导致内存泄漏 hreadLocalMap使用ThreadLocal的弱引用作为key&#xff0c;如果一个ThreadLocal不存在外部强引用时&#xff0c;Key(ThreadLocal)势必会被GC回收&#xff0c;这样就会导致ThreadLocalMap中key为null&#xff0c; 而value还存在着…

15-ajax、实现过程、封装

定义 &#x1f37f;&#x1f37f;&#x1f37f;Async Javascript and XML 异步的JavaScript 和XML&#xff0c;是一种创建交互式网页应用的网页开发技术&#xff0c;可以在不重新加载整个网页的情况下&#xff0c;与服务器交换数据&#xff0c;并且更新部分网页 离不开 XMLH…

【C语言】万字教学,带你分步实现扫雷游戏(内含递归函数解析),剑指扫雷,一篇足矣

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 带你轻松玩转扫雷游戏 前言一. 扫雷游戏的介绍以及内部需要实现的功能解析1.什么是扫雷游戏2.扫雷游戏所需的几个步骤 二.扫雷游戏的具体实现1.打印菜单菜单上的选择功能 2.初始化以及打印棋盘初始化函数InitBoard打印棋…

如何使用测试驱动开发(TDD)来实现100%的测试覆盖率?

本文以 DDM 为例&#xff0c;简单地介绍一下如何用测试驱动开发(TDD, Test-Driven Development)的方法来驱动出这个函数库。 本文以DDM为例&#xff0c;简单地介绍一下如何用测试驱动开发&#xff08;TDD, Test-Driven Development)的方法来驱动出这个函数库。 DDM简介 DDM是…

vue-cli3的安装和项目创建

一 vue-cli3的安装 &#xff08;注意&#xff1a;vue-cli3在安装之前&#xff0c;需要先删除旧版本&#xff0c;即vue-cli2&#xff09; cnpm i -g vue/cli vue-cli3的卸载&#xff1a;cnpm uninstall -g vue/cli 然后用命令“vue -V”查看是否删除vue&#xff0c;如果没有删…

kafka原理架构深入

目录 1. 下载安装2. 命令行命令3. 概述3.1 定义3.2 基本架构 4. 架构深入4.1 生产者4.1.1 分区4.1.2 数据可靠性保证4.1.3 Exactly Once语义4.1.4 发送消息流程 4.2 broker4.2.1 日志结构4.2.2 存储策略4.2.3 Controller & ZooKeeper4.2.4 高效读写数据 4.3 消费者4.3.1 消…

模型-视图-控制器模式(MVC模式,10种常见体系架构模式之一)

、简介&#xff1a; 架构模式是一个通用的、可重用的解决方案&#xff0c;用于在给定上下文中的软件体系结构中经常出现的问题。架构模式与软件设计模式类似&#xff0c;但具有更广泛的范围。 模型-视图-控制器模式&#xff0c;也称为MVC模式。是软件工程中的一种软件架构模式&…

Word模板引擎poi-tl

文章目录 ◆ 方案对比◆ 版本◆ 特性◆ 模板◆ 数据◆ 输出◆ 数据模型◆ 标签1. 文本2. 图片3. 表格4. 列表5. 嵌套6. 区块对 ◆ SpingEL2. 单系列图标3. 多系列图标4. 组合图表 ◆ 配置1. 标签前后缀2. 标签类型3. 标签匹配值4. 标签值计算5. SpringEL6. 数据模型序列化7. 错…

设计模式之抽象工厂笔记

设计模式之抽象工厂模式笔记 说明Abstract Factory(抽象工厂)目录UML抽象工厂示例类图甜品抽象类甜品提拉米苏类甜品抹茶慕斯类 咖啡抽象类美式咖啡类拿铁咖啡类 甜品工厂接口美式风味的甜品工厂意大利风味的甜品工厂 测试类模式扩展 说明 记录下学习设计模式-抽象工厂模式的写…