1. 项目背景

目前,科学技术发展十分迅速,其渗透到各行各业以及生活的方方面面,室内设计和高科技结合便出现了“智能家居”。所谓智能家居就是以居住场所为平台,利用物联网、传感器、智能控制技术将各种家用电器联系起来,实现居住环境的智能化、自动化、人性化。通过语音控制、远程控制、预约控制、个性化设计、一键控制等功能进一步提高生活的舒适性、便利性、安全性。

2.设计目标

本系统主要分为三大模块,分别为传感器监测模块,自动报警模块和远程控制模块。传感器监测模块包括对环境的温湿度和空气质量监测,用户可以在微信小程序上查看到实时传感数据;自动报警模块是当传感数据超过设置的阈值时会进行报警,提醒用户注意火灾的发生;远程控制模块可以通过微信小程序远程控制LED灯,风扇和加湿器的开关,实现了不在家也能远程控制家里的电器的开关。

3.设备端硬件设计

3.1硬件总体设计

硬件总体框架如下图所示。

3.2单片机选型及传感器选型

3.2.1 ESP32模块

SP32-WROOM-32 是一款通用型Wi-Fi+BT+BLE+MCU的模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和MP3解码等。ESP32还集成了丰富的外设,包括电容式触摸传感器、霍尔传感器、低噪声传感放大器,SD卡接口、以太网接口、高速SDIO/SPI、UART、I2S 和I2C等。

3.2.2 温湿度模块

本系统采集环境的温湿度选择 DHT11 温湿度传感器。DHT11 数字温湿度传感器采 用的是已校准数字信号输出,它能够同时检测温度和湿度,它使用专用的数字模块采集 技术和温湿度传感技术,能够确保产品的高可靠性与稳定性。 该传感器包括一个电阻式感湿元件和一个 NTC 测温元件,利用元件的电气特性随 温湿度的变化测量出环境的温湿度,元件与一个高性能 8 位单片机相连接。该产品具有 高品质、响应快、抗干扰强、性价比高等优点。低功耗与非常小的体积使得它能够被应 用于各种复杂的场景。DHT11 为 4 针单排引脚封装,连接方便。DHT11 温湿度模块实物图如下图所示。

4.直接上代码

4.1.1、设备怎么连上网

#include <WiFi.h>const char* ssid     = "baby"; //wifi名称
const char* password = "13456789";//wifi密码void setupWifi(){delay(10);Serial.println("连接WIFI");WiFi.begin(ssid, password);while (!WiFi.isConnected()){Serial.print(".");delay(500);}Serial.println("OK");Serial.println("Wifi连接成功");
}

4.1.2、MQTT接入地址

1、mqtt协议的接口端号是6002,而mqtts协议的接口端号是1883

const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int port = 6002;                     //端口号

2、数据如何发送给onenet

这里我们需要查阅onenet的相关文档

OneNET - 中国移动物联网开放平台

#define mqtt_devid "945965335" //设备ID
#define mqtt_pubid "577632"        //产品ID
//鉴权信息
#define mqtt_password "123456" //鉴权信息
char msg_buf[200];               //发送信息缓冲区
char msgJson[75]; //要发送的json格式的数据
unsigned short json_len = 0;                      //json长度
//信息模板
char dataTemplate[] = "{\"temp\":%.2f,\"humi\":%.2f,\"led\":%d}";  //  temp humi led要与onenet相对应
void sendTempAndHumi()
{if (client.connected()){//dht.readHumidity()snprintf(msgJson,75,dataTemplate,dht.readTemperature(),dht.readHumidity(),god); json_len = strlen(msgJson);                   //msgJson的长度msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJsonmsg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了Serial.print("public the data:");Serial.print(msgJson);client.publish("$dp", (uint8_t *)msg_buf, 3+strlen(msgJson));//发送数据到主题delay(500);}
}

在setup()函数中定义了每5秒发一次信息到OneNET平台

 tim1.attach(5, sendTempAndHumi);                            //定时每5秒调用一次发送数据函数sendTempAndHumi

3、在 setup()函数订阅命令下发主题

  client.setCallback(callback); //订阅命令下发主题
//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
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] == '0') {digitalWrite(led, LOW);   // god=0;} if ((char)payload[0] == '1') {digitalWrite(led, HIGH);  // god=1;}else{}}

4.1.3、测温湿度

使用DHT11模块,调用库

#include "DHT.h"

定义DHT11,数据引脚我接在IO13口

#define DHTPIN 13     // io13
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

5、总代码(当然了这个是新手必备,只需要一个DHT11和一个LED灯就可以实现的)

#include <WiFi.h>
#include "DHT.h"
#include "PubSubClient.h"
#include "Ticker.h"
#define DHTPIN 13
#define DHTTYPE DHT11   // DHT 11
#define led 18 //灯的接口
DHT dht(DHTPIN, DHTTYPE);
int god=0;const char *ssid     = "baby"; //wifi名称
const char *password = "12345671";//wifi密码
const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int port = 6002;                     //端口号
#define mqtt_devid "999999735" //设备ID
#define mqtt_pubid "599995"        //产品ID
//鉴权信息
#define mqtt_password "123456" //鉴权信息
WiFiClient espClient;           //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
char msg_buf[200];               //发送信息缓冲区
char msgJson[75]; //要发送的json格式的数据
unsigned short json_len = 0;                      //json长度
//信息模板
char dataTemplate[] = "{\"temp\":%.2f,\"humi\":%.2f,\"led\":%d}";  //  temp humi要与onenet相对应
Ticker tim1; //定时器,用来循环上传数据//连接WIFI
void setupWifi(){delay(10);Serial.println("连接WIFI");WiFi.begin(ssid, password);while (!WiFi.isConnected()){Serial.print(".");delay(500);}Serial.println("OK");Serial.println("Wifi连接成功");
}void setup() {Serial.begin(115200);pinMode(led,OUTPUT);//输出setupWifi();   //调用函数连接WIFISerial.print(F("DHT11 test!"));dht.begin();                                            client.setServer(mqtt_server, port);                   //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息if (client.connected()){Serial.print("OneNet is connected!");//判断以下是不是连好了.}//client.setCallback(callback);                                //设置好客户端收到信息是的回调client.setCallback(callback); //订阅命令下发主题tim1.attach(5, sendTempAndHumi);                            //定时每5秒调用一次发送数据函数sendTempAndHumi}void loop() {
delay(5000);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);if (isnan(h) || isnan(t) || isnan(f)) {Serial.println(F("Failed to read from DHT sensor!\n"));return;}//可以让我们通过串口查看数据Serial.print(F("Humidity: "));        Serial.print(h);Serial.print(F("%  Temperature: "));Serial.print(t);Serial.print(F("℃  \n "));if (!WiFi.isConnected()) //先看WIFI是否还在连接{setupWifi();}if (!client.connected()) //如果客户端没连接ONENET, 重新连接{clientReconnect();delay(100);}client.loop(); //客户端循环检测}void sendTempAndHumi()
{if (client.connected()){//dht.readHumidity()snprintf(msgJson,75,dataTemplate,dht.readTemperature(),dht.readHumidity(),god); json_len = strlen(msgJson);                   //msgJson的长度msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJsonmsg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了Serial.print("public the data:");Serial.print(msgJson);client.publish("$dp", (uint8_t *)msg_buf, 3+strlen(msgJson));//发送数据到主题delay(500);}
}//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
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] == '0') {digitalWrite(led, LOW);   // god=0;} if ((char)payload[0] == '1') {digitalWrite(led, HIGH);  // god=1;}else{}}void clientReconnect()
{while (!client.connected()) //再重连客户端{Serial.print("reconnect MQTT...");if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)){Serial.print("connected");}else{Serial.print("failed");Serial.print(client.state());Serial.print("try again in 5 sec");delay(5000);}}
}

6、微信开发者工具

自己创建一个项目,直接替换index.js,index.wxml,index.wxss

index.js

// index.js
// 获取应用实例
const app = getApp()
const mqtt=require('../../utils/mqtt')
Page({data: {motto: 'Hello World',userInfo: {},hasUserInfo: false,canIUse: wx.canIUse('button.open-type.getUserInfo'),canIUseGetUserProfile: false,canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false},// 事件处理函数bindViewTap() {wx.navigateTo({url: '../logs/logs'})},onLoad() {if (wx.getUserProfile) {this.setData({canIUseGetUserProfile: true})}},getUserProfile(e) {// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗wx.getUserProfile({desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写success: (res) => {console.log(res)this.setData({userInfo: res.userInfo,hasUserInfo: true})}})},getUserInfo(e) {// 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息console.log(e)this.setData({userInfo: e.detail.userInfo,hasUserInfo: true})},points:function(e) {var that = thiswx.request({//设备ID//api-keyurl: 'http://api.heclouds.com/devices/xxxxxxxxxx/datapoints?', //xxxxxxxxxx这里填写你的设备idheader:{"api-key":"5oXSCXaNrBBlsQm6YNWU3wtHu1U="  //这里写你的api-key},data:{limit:1},method :"GET",//获取成功success:function(res){that.setData({light:res.data.data.datastreams[0].datapoints[0].value,wendu:res.data.data.datastreams[1].datapoints[0].value,shidu:res.data.data.datastreams[3].datapoints[0].value, //这里的shidu要跟wxml{{shidu}} 名字相同})    }})},openled:function(e){let pafloadif(e.detail.value==true)pafload = 1elsepafload =0console.log(pafload)wx.request({url: 'http://api.heclouds.com/cmds?device_id=xxxxxxxxxx',//*号这里写你设备id//设备ID//api-keyheader:{'content-type':'application/json',"api-key":"5oXSCXaNrQm6YNWU3wtHu1U="  //这里写你的api-key},method :"POST",data:pafload,//数据1是为灯开success(res){console.log("控制成功,已开灯")console.log(res)console.log(res.data);}})},/**
* 生命周期函数--监听页面加载 */onLoad: function (options) {this.points()  //这个是我获取onenet数据的函数var that=thissetInterval(function(){that.points();},3000   //这里我设置3秒刷新一次)},
})

index.wxml

<!--pages/index/index.wxml-->
<view  class= "content"><view  class= "zm"><text class="zm1">照明开关</text><switch class="kai" id='1' bindchange="openled"/></view><view style="flex:1;width:100%"><label class="xia"><text class="zm1">当前温度:{{wendu}}°C</text></label></view><view style="flex:1;width:100%"><label class="xia"><text class="zm1">当前湿度:{{shidu}} %</text></label></view></view>

index.wxss

/* pages/index/index.wxss */
page {background: #f6f6f6;display: flex;flex-direction: column;justify-content: flex-start;
}
.headTitle{width: 100%;height: 80rpx;background-color: #ffffff;overflow:hidden  ;/** 设置超出内容隐藏 */white-space:nowrap;   /*设置超出不换行 */border-bottom :1px solid #F3F3F3;
}
.headTitle .titleItem{display: inline-block;line-height:80rpx;color: #889999;font-size:34rpx;margin: 0 20rpx;
}
.headTitle .selctItem{color: #000000;font-weight: bold;
}
.itemView{width: 100%;height:180rpx;position: relative;border-bottom: 1px solid #F3F3F3;
}
.zm{margin-top: 20rpx;border:1px solid#ebe4e286;width:750rpx;height: 100rpx;border-radius: 5px;font-size: 36;font-weight: bold;line-height: 80rpx;color: #32d5e0;text-align: center;display: flex;position: relative;/*父元素位置要设置为相对*/}
.login-btn{width: 40%!important;background-color: #33ff33;color: white;font-weight: normal;
}
.content{margin-top: 20rpx;border:1px solid#ebe4e286;width:750rpx;height: 600rpx;border-radius: 5px;font-size: 36;font-weight: bold;line-height: 80rpx;color: #32d5e0;text-align: center;flex-direction: column;display: flex;}
.xia{justify-content: space-between;
}
.zm1{position: absolute; /* 要约束所在位置的子元素的位置要设置成绝对 */left: 30rpx; /* 靠右调节 */
}
.radio{display:inline-block; /*  横向布局*/}
.kai{position: absolute; /* 要约束所在位置的子元素的位置要设置成绝对 */right: 100rpx; /* 靠右调节 */}
.mos{left: 120rpx; /* 靠右调节 */height: 200rpx;
}

微信小程序链接

百度网盘

基于ESP32测温湿度上传到OneNET并通过微信小程序控制,查看,下发指令相关推荐

  1. 52单片机连接ESP8266烧入固件使用MQTT协议将温湿度上传至OneNET云平台

    52单片机连接ESP8266烧入固件使用MQTT协议连接OneNET云平台 参考: ---------------------------------------------------------- ...

  2. 微信小程录制视频上传服务器,微信小程序-从相册获取图片,视频使用相机拍照,录像上传+服务器nodejs版接收-微信小程序视频上传功能-微信小程序视频上传...

    在本文微信小程序-从相册获取图片使用相机拍照本地图片上传之前需要看看微信小程序-获取用户session_key,openid,unionid-后端为nodejs代码封装是在上文添加的.本文知识点:1. ...

  3. php微信上传视频文件在哪里,微信小程序中实现上传视频的开发代码

    本篇文章给大家带来的内容是关于微信小程序中实现上传视频的开发代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 其实这个比较简单,官方提供了API接口,基本上直接调用就可以了,话不多 ...

  4. 【arduino】arudino开发ESP32 SPIFFS文件上传方法

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 之前发过ESP8266的SPIFFS文件及上传方法: [arduino]arudino ...

  5. html标签手册 360doc,基于AJAX的文件上传控件NetAdvantage for jQuery

    NetAdvantage for jQuery 是一款全新的轻量级.高性能的jQuery控件,包含了在线的Video播放控件,基于AJAX的文件上传控件,快速且强大的表格控件,以及创建和编辑Word. ...

  6. Arduino-ESP8266检测温湿度上传阿里云

    Arduino-ESP8266检测温湿度上传阿里云 硬件准备 Arduino IDE环境 阿里云端 实物接线 IDE库文件配置 ArduinoJson AliyunIoTSDK PubSubClien ...

  7. 基于ZYNQ的网页上传BMP图片至HDMI端口输出实例

    目录 Change Log 0 前言 0.1 系统实现 0.2 源码下载 0.3 项目信息 1 ZYNQ开发板HDMI输出BMP图片功能:FPGA相关 1.1 系统框图 1.2 RTL图 1.3 Bl ...

  8. 上传txt生成字典 java_文件上传漏洞fuzz字典生成脚本小工具分享

    前言 学习xss的时候翻阅资料发现了一个文件上传漏洞fuzz字典生成脚本小工具,试了试还不错,分享一下 配置 需要python2环境 使用方法 $ python upload-fuzz-dic-bui ...

  9. 小程序miniprogram自动化上传,不需要依赖微信开发者工具

    小程序miniprogram自动化上传,不需要依赖微信开发者工具 1.创建目录结构 chatTest => 你的小程序文件 uploadfq => 文件目录,随便起名 node_modul ...

  10. 微信小程序控制onenet智能灯

    文章目录 前言 1.理论基础 2.远程控制led 2.1 实验材料 2.2 实验步骤 3.配置微信小程序 3.1理论基础 3.2 实验步骤 3.2.1 找到对应的api文档 3.2.2 撸微信小程序代 ...

最新文章

  1. hadoop2.2.0 集群安装配置
  2. 基于SSM实现旅游酒店预定管理系统平台
  3. html页脚行距,html Word行距怎么设置
  4. boost::math::quadrature::trapezoidal用法的测试程序
  5. shell脚本中28个特殊字符的作用简明总结
  6. JSON在JS和JAVA的处理
  7. Multi-Range Read (MRR)原理
  8. 华为ar2200路由器 策略路由_路由交换篇 06 华为路由器RIP协议的配置
  9. 判断frame是否已创建_类的创建
  10. 基于lfslivecd-x86-6.3-r2145安装vnc和qemu
  11. 定制Bootstrap
  12. java万年历表怎么输出6_用Java编程输出万年历的功能实现
  13. python3函数重载_9.20 利用函数注解实现方法重载
  14. CSDN 博客 美化 个性化
  15. 交互式电子杂志_电子杂志形式与交互问题分析
  16. Android R系统Fingerprint指纹流程归纳
  17. 核磁共振设备工作过程人体温度监控中应用的光纤温度传感器
  18. MPC-HC视频播放器
  19. linux pvdisplay PE,linux中的pvmove,pvremove,pvs,pvscan
  20. 赋能 打造应对不确定性的敏捷团队 pdf_赋能,打造应对不确定性的敏捷团队读后感(一)...

热门文章

  1. 每个人都是雕刻自己的艺术家,生活是你的背景
  2. 华大HC32L13x 串口波特率设置为115200打印乱码问题
  3. 邮箱客户端 gmail支持_如何联系Gmail支持
  4. 泱泱大中华,美丽我的家 - 俗晒网速,感受幸福
  5. Google IO 2018开发者大会:Android P
  6. fastboot 命令
  7. 树莓派的img文件怎样在vmware虚拟机里面打开
  8. 2015-2016 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest(Gym 100962)
  9. X书app数美-sid分析
  10. java poi excel 图表_【JAVA】POI生成EXCEL图表(柱状图、折线等)