锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于ESP32的智能家居控制系统(微信小程序)

时间:2022-08-11 20:00:02 继电器能用来加热吗led灯具专用连接器电容交互一体机传感器常开接近开关e2e放大器中继型传感器no气敏传感器

  1. 项目背景

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

该系统利用物联网的便利性,实现了家电的远程操作。具体来说,空调、加湿器、灯具、家庭影院等电器都是通过各种传感器监测室内温度、湿度、光强、烟雾浓度、室内是否有人等信息自动调整的。智能电器的语音控制采用人机交互设备和语音识别设备。智能电器的远程控制是通过移动终端和计算机终端实现的。家用电器的运行、监控屏幕、智能捕捉、报警等信息将实时反馈给用户。用户可以随时随地了解家中的具体情况,让用户体验离家如在家的感觉。与传统家居相比,智能家居有利于提高家居生活的便利性、舒适性和安全性。许多新社区或多或少都配备了一些智能家居设备,但距离真正的智能家居还有很长的路要走。未来,智能家居将成为现代生活的标准。

2.设计目标

该系统主要分为传感器监控模块、自动报警模块和远程控制模块三个模块。传感器监测模块包括环境温湿度和空气质量监测,用户可以在微信小程序上查看实时传感数据;自动报警模块在传感数据超过设定阈值时报警,提醒用户注意火灾;远程控制模块可通过微信小程序远程控制LED灯、风扇和加湿器的开关可以远程控制家用电器的开关。项目的整体功能是实时收集数据,并将数据上传到云平台,通过云平台浏览历史数据。项目主要分为两部分:硬件部分ESP32开发板数据采集与通信模块;软件部分是OneNET物联网平台端和微信小程序端。具体实现如下: 根据室内监控和家电操作的需要,设计系统实现的思路:通过传感器获取数据, 再由单片机处理数据,通信模块进行数据传输,平台端数据存储与处理,小程序端查看数据。

3.设备端硬件设计

3.硬件总体设计

如下图所示。

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

3.2.1ESP32模块

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 温湿度模块湿度模块下图所示。

3.2.3MQ-135检测模块

使用系统有害气体浓度监测 MQ-135 有害气体检测模块。MQ-135 气体传感器中使用的气敏材料是二氧化锡,在低污染空气中电导率较低。当传感器的位置存在时 传感器的电导率与空气中污染气体的浓度成正比。MQ-135 气体传感器对氨 气体、硫化物、苯系蒸汽灵敏度高,对烟雾等有害气体的监测也很理想。这种传感 该装置可检测烟雾和各种有害气体,是一种适合多种应用的低成本传感器。使用前必须加热一段时间,否则其输出电阻和电压不准确。MQ-135 有害 气体检测模块实物图如下图所示。

3.2.4光敏电阻模块

光敏电阻模块对环境光最敏感,通常用于检测周围环境的光 当环境光亮度达不到设定阈值时,模块的亮度触发单片机或继电器模块;DO 端输出高电平,当外界环境光线亮度超过设定阈值时,DO 端输出低电平;DO输出端可直接与单片机连接,通过单片机检测高低电平, 检测环境光亮度的变化;小板模拟量输出 AO 可以和 AD 模块连接,通过 AD 可以获得转换 更准确的环境光强值。光敏电阻传感器如下图所示。

3.2.5有源蜂鸣器模块

有源蜂鸣器是一种集成结构的电子信息器,采用直流电压供电有源蜂鸣器内部冲击,只要通电,程序控制方便,单片机可以发出声音,但无源蜂鸣器不能。有源蜂鸣器广泛应用于计算机、打印机、复印机、报警、电子玩具、汽车电子设备、电话、定时器等电子产品。

3.2.6继电器模块(本实验用其他电源供电,然后通过继电器接收信号控制风扇的打开)

继电器(英文名称:relay)它是一种电气控制装置,是当输入(激励)变化满足规定要求时,在电气输出电路中预定阶跃变化的电器。它有控制系统(也称为输入电路)和控制系统系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。继电器有低电平触发和高电平触发,本系统中采用高电平触发继电器。

当继电器供电时,电流开始流经控制线圈;结果,电磁体开始通电。然后衔铁被吸引到线圈上,将动触点向下拉,从而与常开触点连接。所以带负载的电路通电。然后断开电路会出现类似的情况,因为在弹簧的作用下,动触头将被拉到常闭触点。这样,继电器的接通和断开可以控制负载电路的状态

3.2.7 SSD1306模块

SSD1306是一款带控制器的用于OLED点阵图形显示系统的单片CMOS OLED/PLED驱动器。它由128个SEG(列输出)和64个COM(行输出)组成。该芯片专为共阴极OLED面板设计。

3.2.8风扇

风扇采用的是5V,0.2A的小风扇模块。此模块在此系统有两个用处,一是微信小程序控制风扇的开关,二是温度过高自动打开风扇降温

                    

4.直接上代码

  4.1.1、设备怎么连上网

#include 

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的要求发送, 根据要求,数据第一位是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

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);

  4.1.4、测空气质量

我使用的是MQ-135模块,有两种方法,我不在累述

方法1.

/*MQ135空气质量检测传感器模块(有害物体 氨气 硫化物检测)
 程序之一
 */
const int gasSensor =34;//因为连上WIFE后许多引脚读不了模拟值,但是34、35、36、39可以读取模拟值
 void setup(){
  Serial.begin(115200);    
 }
 void loop(){
  float voltage;
  voltage = getVoltage(gasSensor);
  Serial.println(voltage);
  delay(1000);
 }

 float getVoltage(int pin){
  return (analogRead(pin) * 0.004882814);
 //此公式将AnalogLead()的0值转换为1023值
 //返回0.0到5.0的值,即真正的电压
 //读取A0数值  
 }

  4.1.5、光敏电阻测光强

#define sensorPin1 35//因为连上WIFE后许多引脚读不了模拟值,但是34、35、36、39可以读取模拟值
int a=analogRead(sensorPin1 );//测出模拟值
Serial.print(F("a: ")); 
Serial.print(a);//串口打印

4.1.6、中断函数,当外界发出信号,此时主程序应该当外界信号产生就立马响应,而不是正好当外界发出信号的同时正在运行此函数。(例如,你一直按着开关持续5秒,当正好运行到这个函数发生响应。但是当有中断函数后,你轻轻一碰开关,函数就会立马响应,相当于这个函数一直在等待你发出信号。)非常重要

void setup() {
attachInterrupt(fan_in,fanInterrupt,RISING);
}

void fanInterrupt()
{
  digitalWrite(fan_out,digitalRead(fan_in));
}

 5、总代码(需要一个DHT11,空气传感器,光敏电阻,led,ssd1306)

#include 
#include 
#include 
#include 
 #include 
#define DHTPIN 13    
#define DHTTYPE DHT11   // DHT 11
#define sensorPin1 12
#define LED  4//黑暗环境亮灯
#define door_in 25
#define door_out 26
#define fan_in 17//风扇
#define fan_out 27//风扇
#define water_out 18//加湿器
#define hall_led_in 16//led
#define hall_led_out 5
#define pin 34
#define alarm 14
#define water_in 19

//显示屏SCL:22 SDA:21 
#include 
#ifdef U8X8_HAVE_HW_SPI
#include 
#endif
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE); //SCL:22 SDA:21
/*显示屏*/

DHT dht(DHTPIN, DHTTYPE);
int a=0;//光敏灯
int b=0;//门灯
int c=0;//输入是否开客厅灯
int d=0;//输入是否开风扇
int e=0;//加湿器
int f=0;
int g=0;
int d_switch=0;
int f_switch=0;
int h_switch=0;
int w_switch=0;
int l_switch=0;
int n0=0;
int n1=0;
int n2=0;
float voltage=0;
char str[8];
char str1[8];
char str2[8];
const char *ssid     = "baby"; //wifi名称
const char *password = "123456789";//wifi密码
const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int port = 6002;                     //端口号
#define mqtt_devid "9999999999" //设备ID
#define mqtt_pubid "666666"        //产品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[] = "{\"cd\":%d,\"temp\":%.2f,\"humi\":%.2f,\"air\":%.2f,\"led\":%d,\"led2\":%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 ledInterrupt()
{
  digitalWrite(hall_led_out,digitalRead(hall_led_in));
  h_switch==1;n0=0;
}
void fanInterrupt()
{
  digitalWrite(fan_out,digitalRead(fan_in));
  f_switch==1;n1=0;
}
void waterInterrupt()
{
  digitalWrite(water_out,digitalRead(water_in));
  w_switch==1;n2=0;
}
void doorInterrupt()
{
  if(a==1)
  {
   digitalWrite(door_out,HIGH);
   d_switch=1;
  }
}

//显示屏显示数据
void view()
{
    u8x8.clearDisplay();
    u8x8.setFont(u8x8_font_chroma48medium8_r);//表示字体
    dtostrf(dht.readTemperature(),3,2,str);
    u8x8.drawString(0,0,"tem:");
    u8x8.drawString(5,0,str);
    u8x8.drawString(10,0,"*c");//获取数组长度sizeof(str),获得字符串长度str.trim()或者str.length()
   
   dtostrf(dht.readHumidity(),3,2,str1); 
   u8x8.drawString(0,1,"hem:");
   u8x8.drawString(5,1,str1);
   u8x8.drawString(10,1,"%");
   
   dtostrf(voltage,3,2,str2);
   u8x8.drawString(0,2,"air:");
   u8x8.drawString(5,2,str2);
   //(5,2)代表显示坐标,英文字母可以有16*8=128个,中文有16个,左上角x=0,y=0(靠近gnd管脚)
  if(l_switch==1)
    u8x8.drawString(0,3,"lled : on");
  else
    u8x8.drawString(0,3,"lled : off");
  if(d_switch==1)
    u8x8.drawString(0,4,"dled : on");
  else
    u8x8.drawString(0,4,"dled : off"); 
  if(h_switch==1)
    u8x8.drawString(0,5,"hled : on");
  else
    u8x8.drawString(0,5,"hled : off"); 
  if(f_switch==1)
    u8x8.drawString(0,6,"fan  : on");
  else
    u8x8.drawString(0,6,"fan  : off");
  if(w_switch==1)
    u8x8.drawString(0,7,"water: on");
  else
    u8x8.drawString(0,7,"water: off");
  delay(3000);     
         
}

//上传数据温度和湿度
void sendTempAndHumi()
{
  if (client.connected())
  {
    //show();
    Serial.println();
    snprintf(msgJson,75,dataTemplate,a,dht.readTemperature(),dht.readHumidity(),voltage,f,g); 
    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);
  }
}

//串口监视器显示内容
/*void show()
{
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.println();
  Serial.print(F("a: ")); 
  Serial.print(a);
  Serial.print(F("b: ")); 
  Serial.print(b);
  Serial.print(F("c: ")); 
  Serial.print(c);
  Serial.print(F("d: ")); 
  Serial.print(d);
}*/

void setup() {
  u8x8.begin();
  u8x8.setPowerSave(0);
  Serial.begin(115200);
  pinMode(alarm,OUTPUT);
  pinMode(water_out,OUTPUT);
  pinMode(fan_out,OUTPUT);
  pinMode(hall_led_out,OUTPUT);
  pinMode(LED,OUTPUT);
  pinMode(door_out,OUTPUT);
  pinMode(hall_led_out,OUTPUT);
  pinMode(door_in,INPUT);
  pinMode(hall_led_in,INPUT);
  pinMode(fan_in,INPUT);
  pinMode(water_in,INPUT);
  pinMode(sensorPin1,INPUT);
  attachInterrupt(hall_led_in,ledInterrupt,RISING);
  attachInterrupt(fan_in,fanInterrupt,RISING);
  attachInterrupt(water_in,waterInterrupt,RISING);
  attachInterrupt(door_in,doorInterrupt,RISING);
  delay(500);
  setupWifi();   //调用函数连接WIFI
  Serial.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() {
   a=digitalRead(sensorPin1);
   b=digitalRead(door_in);
   c=digitalRead(hall_led_in);
   d=digitalRead(fan_in);
   e=digitalRead(water_in);
   f=digitalRead(hall_led_out);
   g=digitalRead(door_out);
   view();
   door();
   fan();
   led(a);
   hall_led();
   mq135();
   alarm_on();
   w();
  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
  if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  {
    clientReconnect();
    delay(100);
  }
  client.loop(); //客户端循环检测
}
//空气质量检测
 void mq135()
{
  int mq=analogRead(pin);
  voltage=mq * 0.004882814;
}
//点灯,光敏电阻控制
void led(int a)
{
   if(a==1)
  {digitalWrite(LED,HIGH);
  l_switch=1;
  }
  else
  {digitalWrite(LED,LOW);
  l_switch=0;
  }
}

//警报器
void alarm_on()
{
   if(voltage>10)
  digitalWrite(alarm,HIGH);
  else
  digitalWrite(alarm,LOW);
 } 

//点门灯,当门打开,和天暗时自己打开
void door()
{

   if((b==0&&a==1))
  {digitalWrite(door_out,HIGH);
   d_switch=1;
  }
  else
  {digitalWrite(door_out,LOW);
   d_switch=0;
  }
 }
 
 //点客厅灯,开关打开或者手机打开
void hall_led()
{
   if((c==1||n0==1))
  {digitalWrite(hall_led_out,HIGH);
   h_switch=1;
  }
  else
  {digitalWrite(hall_led_out,LOW);
   h_switch=0;
  }
 }

 //开风扇
void fan()
{
   if(dht.readTemperature()>=30||d==1||n1==1)
  {digitalWrite(fan_out,HIGH);
   f_switch=1;
  }
  else
  {digitalWrite(fan_out,LOW);
   f_switch=0;
  }
 }
void w()//加湿器
 {
  if(dht.readHumidity()<55||e==1||n2==1)
  {digitalWrite(water_out,HIGH);
   w_switch=1;
  }
  else
  {digitalWrite(water_out,LOW);
   w_switch=0;
  }
 }
//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.print(F("\n "));
  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')
  {
  if ((char)payload[1] == '0') {
    digitalWrite(hall_led_out, LOW);  
    h_switch=0;n0=0;
  } 
  if ((char)payload[1] == '1') {
    digitalWrite(hall_led_out, HIGH); 
    h_switch=1;n0=1;
  }
  else{}
  }
  if ((char)payload[0] == '2')
  {
  if ((char)payload[1] == '0') {
    digitalWrite(fan_out, LOW);  
    f_switch=0;n1=0;
  } 
  if ((char)payload[1] == '1') {
    digitalWrite(fan_out, HIGH); 
    f_switch=1;n1=1;
  }
  else{}
  }
  if ((char)payload[0] == '3')
  {
  if ((char)payload[1] == '0') {
    digitalWrite(water_out, LOW);  
    w_switch=0;n2=0;
  } 
  if ((char)payload[1] == '1') {
    digitalWrite(water_out, HIGH); 
    w_switch=1;n2=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 = this
    wx.request({
       //设备ID
      //api-key
      url: 'http://api.heclouds.com/devices/xxxxxxxxxx/datapoints?', //xxxxxxxxxx这里填写你的设备id
      header:{
        "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}} 名字相同
         hall:res.data.data.datastreams[4].datapoints[0].value,
         air:res.data.data.datastreams[5].datapoints[0].value,
         light2:res.data.data.datastreams[2].datapoints[0].value,
       })    
      }
    })
  },
  
  openled:function(e){
    let pafload
    if(e.detail.value==true)
    pafload = e.target.id + 1
    else
    pafload = e.target.id + 0
    console.log(pafload)
    wx.request({
      url: 'http://api.heclouds.com/cmds?device_id=xxxxxxxxxx',
      //*号这里写你设备id//设备ID//api-key
      header:{
        'content-type':'application/json',
        "api-key":"5oXSCXaNrBBlsQm6YNWU3wtHu1U="  //这里写你的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=this
    setInterval(function(){
      that.points();
    },3000   //这里我设置3秒刷新一次
    )
  },
})

index.wxml



    
    照明开关
    
    
    
    风扇开关
    
    
    
    加湿器开关
    
    
   

     
       
     

     
     
     

     
       
     
     
       
     
     
       
     
     
       
     
  

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;
}

小程序代码

链接:https://pan.baidu.com/s/1WICYIrtWHR9UBkXOsnpqVw?pwd=nmym 
提取码:nmym

总结:

随着社会的各方面的发展,智能家居逐渐走进了人们的家庭中,为人们带来更加舒适的生活,提高生活质量。在本次课程设计中,我通过ESP32为主控板,连接DHT11、MQ135传感器、光敏电阻、LED灯、继电器和、风扇、加湿器和有源蜂鸣器,结合OneNET物联网平台搭建了一个简单的智能家居控制系统。

本系统实现的功能如下:

(1) 通过微信小程序实现了对环境数据实时监测功能;

(2) 实现了远程控制LED灯、风扇的开关和加湿器;

(3) 实现了空气质量不好自动报警功能。

  1. 实现了天黑自动打开灯光和天黑回家自动打开灯光。
  2. 实现了显示屏实时显示室内温湿度和空气质量。
  3. 温度过高自动打开风扇,湿度过低自动打开加湿器。
  4.     在此次课程设计中,我采用了ESP32开发板作为主控板,OneNET物联网平台作为数据中继,微信小程序作为数据展示端,完成了一个简单的智能家居控制系统。传感器数据采集部分不难,难的部分是ESP32如何连接上OneNET物联网平台,通过在CSDN上找到的教程,按照教程一步一步的操作,首先需要开发板需要连接上WIFI,然后还需要连接上MQTT,当我连接WIFI后发现有些引脚不能读出模拟值,通过上网查找发现是,ESP32芯片中有ADC1和ADC2两个A/D转换器。使用Wi-Fi或蓝牙时,无法使用ADC2引脚。连接到ADC1的针脚正常工作,它们是GPIO32-36和GPIO39,此时才可以读出正确的模拟值。

开发板、OneNET物联网平台和微信小程序端三者之间都是通过MQTT通信的,MQTT协议是此次设计最重要的一部分。ESP32连接OneNET物联网平台:①可以通过MQTT直接连②可以通过MQTTS连接,但需要用到mqqtfx。中断函数非常有用

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章