基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

这篇具有很好参考价值的文章主要介绍了基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个是我最近做的一个课程设计,实时监测室内的温湿度和光照强度,在微信小程序上实时显示监测数据并下发命令控制风扇开关和舵机正反转(从而实现模拟窗帘的开关)。有两种模式控制,一个是手动控制,通过微信小程序远程控制设备开关,一个是设备自动控制,设定温湿度的阈值来控制风扇的开关,通过设定光照强度的阈值来控制舵机正反转(开关)。


1、硬件系统总体框图

​ 系统以MCU为核心器件设计感知控制节点。空气温湿度传感器、光照度传感器、气体传感器将采集到的模拟数字通过AD转换成数字量信号传输直接输入MCU的I/O口;所有感知数据通过WiFi模块发送到云端。同时通过设定参数来驱动控制设备。

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

2、硬件设计流程图

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

3、下位机软件设计流程图

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

4、器件选择

1、空气温湿度传感器

选用DHT11复合型数字化空气温湿度传感器,其内部集成有温湿度传感模块,传感器模块工作时会调用生产过程中已校验的系数进行校准。用的是右边的DHT11

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

2、 光照传感器:

光敏二极管LM393可以将光信号(光强度)转换为电信号;然后比较电路把经过光敏电阻的电压和经过电位器的电压进行比较,并向DO口输出高电压或低电压供用户使用;而AO口是直接经过光敏电阻降压后的电路,所以输出的是在GND和VCC之间的任一电压值;当然VCC和GND是模块元件和芯片正常工作的基本条件,不可或缺! 光照传感器如图10所示。

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

3、舵机选择

选用SG90舵机通过接收PWM信号,使其进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。即给舵机一个特定的PWM信号,舵机旋转到特定角度。我买到是360可以旋转的舵机
基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

4、风扇

​ 我买的是两个线的这种
基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

5、Onenet云平台

1、创建产品

控制台 —>多接入–>添加产品

关于产品名称、行业、类别那些自行选择即可,这里选用mqtt旧版协议

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

点击我们刚刚创建的dht11,然后点击产品概况,记住我们的产品id,后面用得上

2、创建设备

点击设备列表->点击右边的添加设备,设备名称和鉴权信息需要填写,鉴权信息设备连接onenet用的上,还有设备的id号

3、创建数据流

首先点击数据流,然后点击数据流模板管理,最后添加数据流模板

这里设置的数据流名称后面要用到,这里我创建了温度、湿度、灯、光照等等的数据流。

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

6、下位机代码编写

1、设备怎么连上网

这里可以调用wifi库

#include <WiFi.h>
const char* ssid     = "3671"; //wifi名称
const char* password = "05210835";//wifi密码
2、温湿度

我传感器用的是DHT11,这里也可以调用库(可以去管理库下载DHT sersor library这个库)

#include "DHT.h"

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

#define DHTPIN 7     // io7
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
3、光敏

这里我选择的Io0口是带有模数转换器的io口,方便数据转换

#define LDR_PIN 0    //光敏接口0
const float GAMMA = 0.7;
const float RL10 = 50;
float guang(){
  int analogValue = analogRead(LDR_PIN);
  float voltage = analogValue / 1024. * 5;
  float resistance = 2000 * voltage / (1 - voltage / 5);
  float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
   Serial.print(lux); 
  return lux;

}
4、舵机
// setting PWM properties
#define do 10      //舵机接口
const int freq = 5000;//设置频率
const int ledChannel = 0;//通道号,取值0 ~ 15
const int resolution = 8;//计数位数,取值0 ~ 20
unsigned long time1=544;
bool direction1=true;

setup函数

 //舵机模块
  pinMode(do, OUTPUT);
  digitalWrite(do,HIGH);
  delayMicroseconds(544);
  digitalWrite(do,LOW);

loop函数

driection1是用来判断舵机现在的状态的开还是关的

 //舵机
 if(direction1 && vm <400)
  {
    time1+=10;
    digitalWrite(do,HIGH);
    delayMicroseconds(time1);
    digitalWrite(do,LOW);
    delay(5);
    if (time1>=2600)
    direction1=false;
    dji=1;
  }
  if(direction1==false && vm >400)
  {
    time1-=10;
    digitalWrite(do,HIGH);
    delayMicroseconds(time1);
    digitalWrite(do,LOW);
    delay(5);
   
    if (time1<=544)
    direction1=true;
    dji=0;
  }
5、风扇

这里是通过继电器的高低电平来控制风扇开关的

const int fengshan=8; //继电器in接口

setup函数

  pinMode(fengshan,OUTPUT);

loop函数

如果温度超过30就启动风扇

if(t>30){
     digitalWrite(fengshan, HIGH);  //
     shan =1;
  }
6、OLED

​ 这个我之前的博客有详细介绍,没有环境配置或者不懂的可以点击下方链接跳转过去学习

https://blog.csdn.net/weixin_44107116/article/details/122491820

7 、接入地址

mqtt协议的接口端号是6002

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

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

8、数据如何发送给onenet

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

https://open.iot.10086.cn/doc/v5/develop/detail/463

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

#define mqtt_devid "884337606" //设备ID
#define mqtt_pubid "487632"        //产品ID
//鉴权信息
#define mqtt_password "20222222" //鉴权信息
char msg_buf[200];               //发送信息缓冲区
char msgJson[80]; //要发送的json格式的数据
unsigned short json_len = 0;                      //json长度
//信息模板
char dataTemplate[] = "{\"temp\":%.2f,\"humi\":%.2f,\"led\":%d,\"feng\":%d,\"guang\":%.2f,\"doji\":%d,\"Air\":%d}";  //  temp humi等等要与onenet相对应
void sendTempAndHumi()
{
  if (client.connected())
  {
    //dht.readHumidity()
       snprintf(msgJson,80,dataTemplate,dht.readTemperature(),dht.readHumidity(),god,shan,guang(),dji,Air()); 
    json_len = strlen(msgJson);                   //msgJson的长度
    msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
    msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
    msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
    memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
    msg_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

9、下发命令

在 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;
  }
  else if ((char)payload[0] == '1') {
    digitalWrite(led, HIGH);  // 
    god=1;
  }
  else if ((char)payload[0] == '2') {
    digitalWrite(fengshan, HIGH);  // 
    shan=1;
  }
  else if ((char)payload[0] == '3') {
    digitalWrite(fengshan, LOW);  // 
    shan=0;
  }
  //关
   else if ((char)payload[0] == '5') {
    for(time1;time1>=544;time1-=10){
       digitalWrite(do,HIGH);
      delayMicroseconds(time1);
      digitalWrite(do,LOW);
      delay(5);
     if(time1<=544){
       direction1=true;
       dji=0;
       delay(5000);
      }
    }
     
    
  }
  //开
   else if ((char)payload[0] == '4') {
    for(time1;time1<=2600;time1+=10){
    digitalWrite(do,HIGH);
    delayMicroseconds(time1);
    digitalWrite(do,LOW);
    delay(5);
    if (time1>=2600){
      direction1=false;
      dji=1;
      delay(5000);
    }
    }
  }
  else{
    
  }

}
10、led灯

关于灯,本来想外接的,但是我在查看原理图后就想偷懒了,毕竟开发板有自带了两个灯和RGB灯。这里我选择的是18接口的灯,因为19的灯是常亮的,所以不选它。

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

const int led =18; //灯的接口

在setup()定义灯是输出的

pinMode(led,OUTPUT);//输出

我这里设置一个god变量,初始化是0,即灯没有开,等接收到指令再进行变化,1为灯开。

11、PCB板

因为器件太多,用杜邦线接不过来,用面包板也不美观,后面花了一点时间学了EDA,用嘉立创的立创EDA画了一个板出来用,这里安利一下嘉立创,真的好用,而且打板不超过十厘米完全免费,这个国产超nice!!!(右边的type-A接口用不了,仅供参考)

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

7、微信开发者工具

​ 这个是微信提供的一个开发工具,有框架,也方便我们把项目部署到线上。这里我着重讲述怎么获取onene数据和发送指令

1、微信界面

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

2、获取Onenet的API接口

回到onenet的设备列表,然后在点击右边的详情就可以看到设备的详细信息,复制API地址和API-key,一个设备可以多个apikey,自行添加。

3、查询OneNet平台多协议接入文档,这里直接查看MQTT的API使用

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

4、我用ApiPost来进行测试是否能获取数据

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

5、微信小程序获取OneNet数据

1、在wxml里面我给按钮添加了点击事件,命名为points,相对应的在index.js里面也需要添加相对应函数

 points:function(e) {
 
 
 }

​ 2、参考小程序文档,我这里采用wx.request 获取数据

points:function(e) {
    var that = this
    wx.request({
      url: 'http://api.heclouds.com/devices/xxxxxxxxxx/datapoints?', //xxz这里填写你的设备id
      //设备ID
      //api-key
      header:{
        "api-key":"xxxxxxx"  //这里写你的api-key
      },
      data:{
        limit:1
      },
      method :"GET",
       //获取成功
      success:function(res){
       that.setData({
          wendu:res.data.data.datastreams[0].datapoints[0].value,
         time:res.data.data.datastreams[0].datapoints[0].at,
         shidu:res.data.data.datastreams[1].datapoints[0].value,
         led:res.data.data.datastreams[2].datapoints[0].value, //这里的shidu要跟wxml{{shidu}} 名字相同
        
       })    
      }
    })
  },

​ 3、关于如何显示到具体数字,因人而异,下面我这两行代码是根据json数据来定位的

shidu:res.data.data.datastreams[0].datapoints[0].value, 
wendu:res.data.data.datastreams[1].datapoints[0].value,

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

6、微信小程序下发命令

这里我也封装了两个函数,一个是发1值,一个发0值,因为我们的嵌入代码写是1代表打开灯,0代表关灯。这里以打开灯函数介绍

 openled:function(e){
    wx.request({
      url: 'http://api.heclouds.com/cmds?device_id=*****',//*号这里写你设备id
      //设备ID
      //api-key
      header:{
        'content-type':'application/json',
        "api-key":"xxxxxxx"  //这里写你的api-key
      },

      method :"POST",
      data:1,//数据1是为灯开
      success(res){
        console.log("控制成功,已开灯")
        console.log(res)
        console.log(res.data);

      }

    })
  },
7、数据刷新

其实这些网上都有的函数例子,我试过页面刷新、定时刷新,如果页面没有点击事件的话都可以用我下面这两个方法。但是有点击事件的话还是用定时刷新

定时刷新

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.points()  //这个是我获取onenet数据的函数
    var that=this
    setInterval(function(){
      that.points();
    },3000   //这里我设置3秒刷新一次
    )

  },
8、选择下拉列表相应指令发送数据

这里我单独写了一篇博客可点下方链接详细学习

https://blog.csdn.net/weixin_44107116/article/details/125520404

9、数据可视化

这里我是参考了另一个博主的博客做的,简单易懂,我这里稍微改进了一下,只显示日期,没有显示年份。点击图片就可以切换到可视化界面,我写了温度】我、湿度、光照这三个而已。

https://blog.csdn.net/qq_52827563/article/details/121726546?

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

10、检测设备是否在线

然后我在下拉列表的基础上设置了一个前提条件,只有设备在线才能发送指令,不然只会弹出信息提示框提示。
基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

 postdata:function(shuj){
    wx.request({
      url: 'https://api.heclouds.com/cmds?device_id=设备id',
      //设备ID
      //api-key
      header:{
        'content-type':'application/json',
        "api-key":"你的api-key"
      },

      method :"POST",
      data:shuj, //数据指令
      success(res){
        wx.showToast({
          title: '已发送控制指令',
          image:"/images/gong.png",
          duration:2000,
          mask:true
        })
        console.log("控制成功,已完成控制指令")
        console.log(res)
        console.log(res.data);
      },
      fail(res){
        wx.showToast({
          title: '请求失败',
          image:"/images/errer.png",
          duration:2000,
          mask:true
        })
        console.log("请求失败")
        console.log(res)
        console.log(res.data);
      }
    })
  },
  devicedata:function(){
     var that =this;
    wx.request({
      url: 'https://api.heclouds.com/devices/884337606',
      //设备ID
      //api-key
      header:{
        'content-type':'application/json',
        "api-key":"9zHJfKbQN=dyGflCM0yaICWHmi8="
      },

      method :"GET",
      success(res){
        if (res.data.data.online){
          console.log("设备已连接");
          that.setData({deviceSwitch:1})
        }
        else{
         console.log("设备未连接");
         that.setData({deviceSwitch:0})
        }   
       },
       fail(res){
         console.log("请求失败");
       } 
    })
  },
11、效果展示

基于物联网的环境调节系统

结语

大概一整个物联网流程都搞定了,顺便把硬件无线集成化了,微信小程序的界面和功能都比以往升级和添加了新的东西,要是想要源码或者相关资料的可以私信我,但不是免费的,这是我个人努力摸索出来的,还请谅解。文章来源地址https://www.toymoban.com/news/detail-431291.html

到了这里,关于基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32——esp8266物联网开发,连接onenet云平台(http)做智能家居(1)

    此处感谢b站up主——彼岸有光我们有船(我认为讲的和江科大老师一样好,如果习惯江科大老师的讲法的朋友们都可以看看捏) 提供的教程和最初的正点原子的源码,因为我学习的是江科大的stm32,所以进行了部分改编和部分注释,在此把视频内容简化,进行简单的复习。

    2023年04月08日
    浏览(55)
  • ESP32C3学习&开发之路——VScode开发环境搭建

    上次搭建好了ESP IDF离线版的开发环境,但是我不想每次开发的时候都要打开“PowerShell”终端,也不想要输入指令进行编译和下载的操作,所以再搭建在VScode的软件上开发ESP32系列WiFi模组的开发环境。 VScode全称Visual Studio Code,免费而强大,可在Windows、Linux和Mac OS上运行。所以

    2024年02月10日
    浏览(58)
  • 基于ESP32+微信小程序的物联网应用(小程序部分)

    本项目是 基于 ESP32 实现的全栈物联网应用 ,将会 手把手教用户实现 MQTT 环境的搭建 、 硬件传感器的驱动 以及 小程序的编写 。 手把手教学配套视频地址 您将会学习到 HTML、CSS、JS、微信小程序官方开发语言、Echarts、NodeJs、Express、MySQL、ARDUINO 等技能,此文章篇幅较长,建

    2024年04月17日
    浏览(43)
  • ESP32-C3入门教程 IoT篇⑧——微软云 Microsoft Azure 物联网 IoT 中心 EspAzureIoT 实战

    本文基于VS Code IDE进行编程、编译、下载、运行等操作 基础入门章节请查阅:ESP32-C3入门教程 基础篇①——基于VS Code构建Hello World 教程目录大纲请查阅:ESP32-C3入门教程——导读 ESP32固件端源码已经全部开源:小康师兄 / EspAzureIoT (gitee地址) ESP32-C3入门教程

    2024年02月06日
    浏览(79)
  • ESP32-C3入门教程 IoT篇⑦——微软云 Microsoft Azure 物联网 IoT Central EspAzureIoT 实战

    本文基于VS Code IDE进行编程、编译、下载、运行等操作 基础入门章节请查阅:ESP32-C3入门教程 基础篇①——基于VS Code构建Hello World 教程目录大纲请查阅:ESP32-C3入门教程——导读 ESP32固件端源码已经全部开源:

    2024年02月06日
    浏览(58)
  • 【Arduino环境下驱动合宙esp32c3单片机基本外设】

    本教程是参加FastBond2活动主题4 - 测量仪器中的【Arduino环境下驱动合宙esp32c3单片机基本外设】。 围绕FastBond2阶段1——基于ESP32C3开发的简易IO调试设备项目需求开发。 设计目标: 多种数字和模拟信号的输入输出:用户可以选择不同的输入输出模式,并通过设备的操作界面进行

    2024年02月04日
    浏览(59)
  • 物联网开发笔记(89)- 使用Micropython开发ESP32开发板之合宙ESP32 C3开发板通过串口SPI控制st7789 TFT液晶屏1.3寸

    一、目的         这一节我们学习如何使用合宙的ESP32 C3开发板控制1.3寸彩色TFT显示屏模块,分辨率240*240,SPI接口,ST7789驱动芯片。 二、环境         ESP32  C3 + Thonny + 1.3寸 st7789液晶屏模块 + 几根杜邦线 + Win10 接线方法:   三、st7789 TFT显示屏驱动 st7789py.py   四、点亮

    2024年02月11日
    浏览(52)
  • ESP32连接到oneNET云平台,传数据到微信小程序

    学习物联网的同学们在进行毕业设计时都需要面对一个共同的问题:如何使用传感器获取数据并将其上传至云平台,然后通过微信小程序访问云平台数据。在这个过程中,恰巧在课程设计中接触到了ESP32,发现它内置蓝牙和WiFi模块, 这不是天生的上传云平台圣体吗? 因此,

    2024年04月15日
    浏览(48)
  • STM32系列(HAL库)——使用ESP8266-01S物联网模块连接Onenet云平台上报DHT11温湿度

    本篇主要讲解如何使用ESP8266-01S物联网模块连接Onenet云平台,并上报DHT11模块的温湿度数据。本文单片机主控采用STM32F405RGT6,使用其他主控的话基本要求有2个串口,一个串口用于调试使用,另一个用于ESP模块通讯。 1.软件 CubeMX Keil5 串口调试助手 Onenet云平台账户 2.硬件 STM32开

    2024年02月02日
    浏览(79)
  • 基于STM32+OneNet设计的物联网智慧路灯

    近年来,构筑智慧城市、推动城镇发展被国家列入重要工作范畴。发布的《超级智慧城市报告》显示,全球已启动或在建的智慧城市有1000多个,中国在建500个,远超排名第二的欧洲(90个)。从在建智慧城市的分布来看,我国已初步形成环渤海、长三角、珠三角、中西部四大

    2024年02月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包