当前位置:   article > 正文

基于ESP32的智能家居控制系统(微信小程序)_esp32向手机发送数据

esp32向手机发送数据

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

3.2.3 MQ-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、设备怎么连上网

  1. #include <WiFi.h>
  2. const char* ssid = "baby"; //wifi名称
  3. const char* password = "13456789";//wifi密码
  4. void setupWifi(){
  5. delay(10);
  6. Serial.println("连接WIFI");
  7. WiFi.begin(ssid, password);
  8. while (!WiFi.isConnected())
  9. {
  10. Serial.print(".");
  11. delay(500);
  12. }
  13. Serial.println("OK");
  14. Serial.println("Wifi连接成功");
  15. }

  4.1.2、MQTT接入地址

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

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

2、数据如何发送给onenet

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

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

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

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

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

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

  client.setCallback(callback); //订阅命令下发主题
  1. //收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
  2. void callback(char *topic, byte *payload, unsigned int length)
  3. {
  4. Serial.print("Message arrived [");
  5. Serial.print(topic);
  6. Serial.print("] ");
  7. for (int i = 0; i < length; i++) {
  8. Serial.print((char)payload[i]);
  9. }
  10. Serial.println();
  11. if ((char)payload[0] == '0') {
  12. digitalWrite(led, LOW); //
  13. god=0;
  14. } if ((char)payload[0] == '1') {
  15. digitalWrite(led, HIGH); //
  16. god=1;
  17. }
  18. else{}
  19. }

  4.1.3、测温湿度

使用DHT11模块,调用库

#include "DHT.h"

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

  1. #define DHTPIN 13 // io13
  2. #define DHTTYPE DHT11 // DHT 11
  3. DHT dht(DHTPIN, DHTTYPE);

  4.1.4、测空气质量

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

方法1.

  1. /*MQ135空气质量检测传感器模块(有害物体 氨气 硫化物检测)
  2. 程序之一
  3. */
  4. const int gasSensor =34;//因为连上WIFE后许多引脚读不了模拟值,但是34、35、36、39可以读取模拟值
  5. void setup(){
  6. Serial.begin(115200);
  7. }
  8. void loop(){
  9. float voltage;
  10. voltage = getVoltage(gasSensor);
  11. Serial.println(voltage);
  12. delay(1000);
  13. }
  14. float getVoltage(int pin){
  15. return (analogRead(pin) * 0.004882814);
  16. //此公式将AnalogLead()的0值转换为1023值
  17. //返回0.0到5.0的值,即真正的电压
  18. //读取A0数值
  19. }

  4.1.5、光敏电阻测光强

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

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

  1. void setup() {
  2. attachInterrupt(fan_in,fanInterrupt,RISING);
  3. }
  4. void fanInterrupt()
  5. {
  6. digitalWrite(fan_out,digitalRead(fan_in));
  7. }

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

  1. #include <WiFi.h>
  2. #include <DHT.h>
  3. #include <PubSubClient.h>
  4. #include <Ticker.h>
  5. #include <MQ135.h>
  6. #define DHTPIN 13
  7. #define DHTTYPE DHT11 // DHT 11
  8. #define sensorPin1 12
  9. #define LED 4//黑暗环境亮灯
  10. #define door_in 25
  11. #define door_out 26
  12. #define fan_in 17//风扇
  13. #define fan_out 27//风扇
  14. #define water_out 18//加湿器
  15. #define hall_led_in 16//led
  16. #define hall_led_out 5
  17. #define pin 34
  18. #define alarm 14
  19. #define water_in 19
  20. //显示屏SCL:22 SDA:21
  21. #include <U8x8lib.h>
  22. #ifdef U8X8_HAVE_HW_SPI
  23. #include <SPI.h>
  24. #endif
  25. U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE); //SCL:22 SDA:21
  26. /*显示屏*/
  27. DHT dht(DHTPIN, DHTTYPE);
  28. int a=0;//光敏灯
  29. int b=0;//门灯
  30. int c=0;//输入是否开客厅灯
  31. int d=0;//输入是否开风扇
  32. int e=0;//加湿器
  33. int f=0;
  34. int g=0;
  35. int d_switch=0;
  36. int f_switch=0;
  37. int h_switch=0;
  38. int w_switch=0;
  39. int l_switch=0;
  40. int n0=0;
  41. int n1=0;
  42. int n2=0;
  43. float voltage=0;
  44. char str[8];
  45. char str1[8];
  46. char str2[8];
  47. const char *ssid = "baby"; //wifi名称
  48. const char *password = "123456789";//wifi密码
  49. const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
  50. const int port = 6002; //端口号
  51. #define mqtt_devid "9999999999" //设备ID
  52. #define mqtt_pubid "666666" //产品ID
  53. #define mqtt_password "123456" //鉴权信息
  54. WiFiClient espClient; //创建一个WIFI连接客户端
  55. PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
  56. char msg_buf[200]; //发送信息缓冲区
  57. char msgJson[75]; //要发送的json格式的数据
  58. unsigned short json_len = 0; //json长度
  59. //信息模板
  60. char dataTemplate[] = "{\"cd\":%d,\"temp\":%.2f,\"humi\":%.2f,\"air\":%.2f,\"led\":%d,\"led2\":%d}"; // temp humi要与onenet相对应
  61. Ticker tim1; //定时器,用来循环上传数据
  62. //连接WIFI
  63. void setupWifi(){
  64. delay(10);
  65. Serial.println("连接WIFI");
  66. WiFi.begin(ssid, password);
  67. while (!WiFi.isConnected())
  68. {
  69. Serial.print(".");
  70. delay(500);
  71. }
  72. Serial.println("OK");
  73. Serial.println("Wifi连接成功");
  74. }
  75. void ledInterrupt()
  76. {
  77. digitalWrite(hall_led_out,digitalRead(hall_led_in));
  78. h_switch==1;n0=0;
  79. }
  80. void fanInterrupt()
  81. {
  82. digitalWrite(fan_out,digitalRead(fan_in));
  83. f_switch==1;n1=0;
  84. }
  85. void waterInterrupt()
  86. {
  87. digitalWrite(water_out,digitalRead(water_in));
  88. w_switch==1;n2=0;
  89. }
  90. void doorInterrupt()
  91. {
  92. if(a==1)
  93. {
  94. digitalWrite(door_out,HIGH);
  95. d_switch=1;
  96. }
  97. }
  98. //显示屏显示数据
  99. void view()
  100. {
  101. u8x8.clearDisplay();
  102. u8x8.setFont(u8x8_font_chroma48medium8_r);//表示字体
  103. dtostrf(dht.readTemperature(),3,2,str);
  104. u8x8.drawString(0,0,"tem:");
  105. u8x8.drawString(5,0,str);
  106. u8x8.drawString(10,0,"*c");//获取数组长度sizeof(str),获得字符串长度str.trim()或者str.length()
  107. dtostrf(dht.readHumidity(),3,2,str1);
  108. u8x8.drawString(0,1,"hem:");
  109. u8x8.drawString(5,1,str1);
  110. u8x8.drawString(10,1,"%");
  111. dtostrf(voltage,3,2,str2);
  112. u8x8.drawString(0,2,"air:");
  113. u8x8.drawString(5,2,str2);
  114. //(5,2)代表显示坐标,英文字母可以有16*8=128个,中文有16个,左上角x=0,y=0(靠近gnd管脚)
  115. if(l_switch==1)
  116. u8x8.drawString(0,3,"lled : on");
  117. else
  118. u8x8.drawString(0,3,"lled : off");
  119. if(d_switch==1)
  120. u8x8.drawString(0,4,"dled : on");
  121. else
  122. u8x8.drawString(0,4,"dled : off");
  123. if(h_switch==1)
  124. u8x8.drawString(0,5,"hled : on");
  125. else
  126. u8x8.drawString(0,5,"hled : off");
  127. if(f_switch==1)
  128. u8x8.drawString(0,6,"fan : on");
  129. else
  130. u8x8.drawString(0,6,"fan : off");
  131. if(w_switch==1)
  132. u8x8.drawString(0,7,"water: on");
  133. else
  134. u8x8.drawString(0,7,"water: off");
  135. delay(3000);
  136. }
  137. //上传数据温度和湿度
  138. void sendTempAndHumi()
  139. {
  140. if (client.connected())
  141. {
  142. //show();
  143. Serial.println();
  144. snprintf(msgJson,75,dataTemplate,a,dht.readTemperature(),dht.readHumidity(),voltage,f,g);
  145. json_len = strlen(msgJson); //msgJson的长度
  146. msg_buf[0] = char(0x03); //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  147. msg_buf[1] = char(json_len >> 8); //数据第二位是要发送的数据长度的高八位
  148. msg_buf[2] = char(json_len & 0xff); //数据第三位是要发送数据的长度的低八位
  149. memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
  150. msg_buf[3 + strlen(msgJson)] = 0; //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
  151. Serial.print("public the data:");
  152. Serial.print(msgJson);
  153. client.publish("$dp", (uint8_t *)msg_buf, 3+strlen(msgJson));
  154. //发送数据到主题
  155. delay(500);
  156. }
  157. }
  158. //串口监视器显示内容
  159. /*void show()
  160. {
  161. float h = dht.readHumidity();
  162. float t = dht.readTemperature();
  163. float f = dht.readTemperature(true);
  164. if (isnan(h) || isnan(t) || isnan(f)) {
  165. Serial.println(F("Failed to read from DHT sensor!\n"));
  166. return;
  167. }
  168. //可以让我们通过串口查看数据
  169. Serial.println();
  170. Serial.print(F("a: "));
  171. Serial.print(a);
  172. Serial.print(F("b: "));
  173. Serial.print(b);
  174. Serial.print(F("c: "));
  175. Serial.print(c);
  176. Serial.print(F("d: "));
  177. Serial.print(d);
  178. }*/
  179. void setup() {
  180. u8x8.begin();
  181. u8x8.setPowerSave(0);
  182. Serial.begin(115200);
  183. pinMode(alarm,OUTPUT);
  184. pinMode(water_out,OUTPUT);
  185. pinMode(fan_out,OUTPUT);
  186. pinMode(hall_led_out,OUTPUT);
  187. pinMode(LED,OUTPUT);
  188. pinMode(door_out,OUTPUT);
  189. pinMode(hall_led_out,OUTPUT);
  190. pinMode(door_in,INPUT);
  191. pinMode(hall_led_in,INPUT);
  192. pinMode(fan_in,INPUT);
  193. pinMode(water_in,INPUT);
  194. pinMode(sensorPin1,INPUT);
  195. attachInterrupt(hall_led_in,ledInterrupt,RISING);
  196. attachInterrupt(fan_in,fanInterrupt,RISING);
  197. attachInterrupt(water_in,waterInterrupt,RISING);
  198. attachInterrupt(door_in,doorInterrupt,RISING);
  199. delay(500);
  200. setupWifi(); //调用函数连接WIFI
  201. Serial.print(F("DHT11 test!"));
  202. dht.begin();
  203. client.setServer(mqtt_server, port); //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
  204. client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
  205. if (client.connected())
  206. {
  207. Serial.print("OneNet is connected!");//判断以下是不是连好了.
  208. }
  209. //client.setCallback(callback); //设置好客户端收到信息是的回调
  210. client.setCallback(callback); //订阅命令下发主题
  211. tim1.attach(5, sendTempAndHumi); //定时每5秒调用一次发送数据函数sendTempAndHumi
  212. }
  213. void loop() {
  214. a=digitalRead(sensorPin1);
  215. b=digitalRead(door_in);
  216. c=digitalRead(hall_led_in);
  217. d=digitalRead(fan_in);
  218. e=digitalRead(water_in);
  219. f=digitalRead(hall_led_out);
  220. g=digitalRead(door_out);
  221. view();
  222. door();
  223. fan();
  224. led(a);
  225. hall_led();
  226. mq135();
  227. alarm_on();
  228. w();
  229. if (!WiFi.isConnected()) //先看WIFI是否还在连接
  230. {
  231. setupWifi();
  232. }
  233. if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  234. {
  235. clientReconnect();
  236. delay(100);
  237. }
  238. client.loop(); //客户端循环检测
  239. }
  240. //空气质量检测
  241. void mq135()
  242. {
  243. int mq=analogRead(pin);
  244. voltage=mq * 0.004882814;
  245. }
  246. //点灯,光敏电阻控制
  247. void led(int a)
  248. {
  249. if(a==1)
  250. {digitalWrite(LED,HIGH);
  251. l_switch=1;
  252. }
  253. else
  254. {digitalWrite(LED,LOW);
  255. l_switch=0;
  256. }
  257. }
  258. //警报器
  259. void alarm_on()
  260. {
  261. if(voltage>10)
  262. digitalWrite(alarm,HIGH);
  263. else
  264. digitalWrite(alarm,LOW);
  265. }
  266. //点门灯,当门打开,和天暗时自己打开
  267. void door()
  268. {
  269. if((b==0&&a==1))
  270. {digitalWrite(door_out,HIGH);
  271. d_switch=1;
  272. }
  273. else
  274. {digitalWrite(door_out,LOW);
  275. d_switch=0;
  276. }
  277. }
  278. //点客厅灯,开关打开或者手机打开
  279. void hall_led()
  280. {
  281. if((c==1||n0==1))
  282. {digitalWrite(hall_led_out,HIGH);
  283. h_switch=1;
  284. }
  285. else
  286. {digitalWrite(hall_led_out,LOW);
  287. h_switch=0;
  288. }
  289. }
  290. //开风扇
  291. void fan()
  292. {
  293. if(dht.readTemperature()>=30||d==1||n1==1)
  294. {digitalWrite(fan_out,HIGH);
  295. f_switch=1;
  296. }
  297. else
  298. {digitalWrite(fan_out,LOW);
  299. f_switch=0;
  300. }
  301. }
  302. void w()//加湿器
  303. {
  304. if(dht.readHumidity()<55||e==1||n2==1)
  305. {digitalWrite(water_out,HIGH);
  306. w_switch=1;
  307. }
  308. else
  309. {digitalWrite(water_out,LOW);
  310. w_switch=0;
  311. }
  312. }
  313. //收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
  314. void callback(char *topic, byte *payload, unsigned int length)
  315. {
  316. Serial.print(F("\n "));
  317. Serial.print("Message arrived [");
  318. Serial.print(topic);
  319. Serial.print("] ");
  320. for (int i = 0; i < length; i++) {
  321. Serial.print((char)payload[i]);
  322. }
  323. Serial.println();
  324. if ((char)payload[0] == '1')
  325. {
  326. if ((char)payload[1] == '0') {
  327. digitalWrite(hall_led_out, LOW);
  328. h_switch=0;n0=0;
  329. }
  330. if ((char)payload[1] == '1') {
  331. digitalWrite(hall_led_out, HIGH);
  332. h_switch=1;n0=1;
  333. }
  334. else{}
  335. }
  336. if ((char)payload[0] == '2')
  337. {
  338. if ((char)payload[1] == '0') {
  339. digitalWrite(fan_out, LOW);
  340. f_switch=0;n1=0;
  341. }
  342. if ((char)payload[1] == '1') {
  343. digitalWrite(fan_out, HIGH);
  344. f_switch=1;n1=1;
  345. }
  346. else{}
  347. }
  348. if ((char)payload[0] == '3')
  349. {
  350. if ((char)payload[1] == '0') {
  351. digitalWrite(water_out, LOW);
  352. w_switch=0;n2=0;
  353. }
  354. if ((char)payload[1] == '1') {
  355. digitalWrite(water_out, HIGH);
  356. w_switch=1;n2=1;
  357. }
  358. else{}
  359. }
  360. }
  361. //重连函数, 如果客户端断线,可以通过此函数重连
  362. void clientReconnect()
  363. {
  364. while (!client.connected()) //再重连客户端
  365. {
  366. Serial.print("reconnect MQTT...");
  367. if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password))
  368. {
  369. Serial.print("connected");
  370. }
  371. else
  372. {
  373. Serial.print("failed");
  374. Serial.print(client.state());
  375. Serial.print("try again in 5 sec");
  376. delay(5000);
  377. }
  378. }
  379. }

6、微信开发者工具

 

 

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

index.js

  1. // index.js
  2. // 获取应用实例
  3. const app = getApp()
  4. const mqtt=require('../../utils/mqtt')
  5. Page({
  6. data: {
  7. motto: 'Hello World',
  8. userInfo: {},
  9. hasUserInfo: false,
  10. canIUse: wx.canIUse('button.open-type.getUserInfo'),
  11. canIUseGetUserProfile: false,
  12. canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false
  13. },
  14. // 事件处理函数
  15. bindViewTap() {
  16. wx.navigateTo({
  17. url: '../logs/logs'
  18. })
  19. },
  20. onLoad() {
  21. if (wx.getUserProfile) {
  22. this.setData({
  23. canIUseGetUserProfile: true
  24. })
  25. }
  26. },
  27. getUserProfile(e) {
  28. // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
  29. wx.getUserProfile({
  30. desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
  31. success: (res) => {
  32. console.log(res)
  33. this.setData({
  34. userInfo: res.userInfo,
  35. hasUserInfo: true
  36. })
  37. }
  38. })
  39. },
  40. getUserInfo(e) {
  41. // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
  42. console.log(e)
  43. this.setData({
  44. userInfo: e.detail.userInfo,
  45. hasUserInfo: true
  46. })
  47. },
  48. points:function(e) {
  49. var that = this
  50. wx.request({
  51. //设备ID
  52. //api-key
  53. url: 'http://api.heclouds.com/devices/xxxxxxxxxx/datapoints?', //xxxxxxxxxx这里填写你的设备id
  54. header:{
  55. "api-key":"5oXSCXaNrBBlsQm6YNWU3wtHu1U=" //这里写你的api-key
  56. },
  57. data:{
  58. limit:1
  59. },
  60. method :"GET",
  61. //获取成功
  62. success:function(res){
  63. that.setData({
  64. light:res.data.data.datastreams[0].datapoints[0].value,
  65. wendu:res.data.data.datastreams[1].datapoints[0].value,
  66. shidu:res.data.data.datastreams[3].datapoints[0].value, //这里的shidu要跟wxml{{shidu}} 名字相同
  67. hall:res.data.data.datastreams[4].datapoints[0].value,
  68. air:res.data.data.datastreams[5].datapoints[0].value,
  69. light2:res.data.data.datastreams[2].datapoints[0].value,
  70. })
  71. }
  72. })
  73. },
  74. openled:function(e){
  75. let pafload
  76. if(e.detail.value==true)
  77. pafload = e.target.id + 1
  78. else
  79. pafload = e.target.id + 0
  80. console.log(pafload)
  81. wx.request({
  82. url: 'http://api.heclouds.com/cmds?device_id=xxxxxxxxxx',
  83. //*号这里写你设备id//设备ID//api-key
  84. header:{
  85. 'content-type':'application/json',
  86. "api-key":"5oXSCXaNrBBlsQm6YNWU3wtHu1U=" //这里写你的api-key
  87. },
  88. method :"POST",
  89. data:pafload,//数据1是为灯开
  90. success(res){
  91. console.log("控制成功,已开灯")
  92. console.log(res)
  93. console.log(res.data);
  94. }
  95. })
  96. },
  97. /**
  98. * 生命周期函数--监听页面加载 */
  99. onLoad: function (options) {
  100. this.points() //这个是我获取onenet数据的函数
  101. var that=this
  102. setInterval(function(){
  103. that.points();
  104. },3000 //这里我设置3秒刷新一次
  105. )
  106. },
  107. })

index.wxml

  1. <!--pages/index/index.wxml-->
  2. <view class= "content">
  3. <view class= "zm">
  4. <text class="zm1">照明开关</text>
  5. <switch class="kai" id='1' bindchange="openled"/>
  6. </view>
  7. <view class= "zm">
  8. <text class="zm1">风扇开关</text>
  9. <switch class="kai" id='2' bindchange="openled"/>
  10. </view>
  11. <view class= "zm">
  12. <text class="zm1">加湿器开关</text>
  13. <switch class="kai" id='3' bindchange="openled"/>
  14. </view>
  15. <view style="flex:1;width:100%">
  16. <label class="xia">
  17. <text class="zm1">当前温度:{{wendu}}°C</text>
  18. </label>
  19. </view>
  20. <view style="flex:1;width:100%">
  21. <label class="xia">
  22. <text class="zm1">当前湿度:{{shidu}} %</text>
  23. </label>
  24. </view>
  25. <view style="flex:1;width:100%">
  26. <label class="xia">
  27. <text class="zm1">空气质量:{{air}}</text>
  28. </label>
  29. </view>
  30. <view style="flex:1;width:100%">
  31. <label class="xia">
  32. <text class="zm1">客厅灯光:{{hall}}</text>
  33. </label>
  34. </view>
  35. <view style="flex:1;width:100%">
  36. <label class="xia">
  37. <text class="zm1">门口灯光:{{light}}</text>
  38. </label>
  39. </view>
  40. <view style="flex:1;width:100%">
  41. <label class="xia">
  42. <text class="zm1">楼梯灯光:{{light2}}</text>
  43. </label>
  44. </view>
  45. </view>

index.wxss

  1. /* pages/index/index.wxss */
  2. page {
  3. background: #f6f6f6;
  4. display: flex;
  5. flex-direction: column;
  6. justify-content: flex-start;
  7. }
  8. .headTitle{
  9. width: 100%;
  10. height: 80rpx;
  11. background-color: #ffffff;
  12. overflow:hidden ;/** 设置超出内容隐藏 */
  13. white-space:nowrap; /*设置超出不换行 */
  14. border-bottom :1px solid #F3F3F3;
  15. }
  16. .headTitle .titleItem{
  17. display: inline-block;
  18. line-height:80rpx;
  19. color: #889999;
  20. font-size:34rpx;
  21. margin: 0 20rpx;
  22. }
  23. .headTitle .selctItem{
  24. color: #000000;
  25. font-weight: bold;
  26. }
  27. .itemView{
  28. width: 100%;
  29. height:180rpx;
  30. position: relative;
  31. border-bottom: 1px solid #F3F3F3;
  32. }
  33. .zm{
  34. margin-top: 20rpx;
  35. border:1px solid#ebe4e286;
  36. width:750rpx;
  37. height: 100rpx;
  38. border-radius: 5px;
  39. font-size: 36;
  40. font-weight: bold;
  41. line-height: 80rpx;
  42. color: #32d5e0;
  43. text-align: center;
  44. display: flex;
  45. position: relative;/*父元素位置要设置为相对*/
  46. }
  47. .login-btn{
  48. width: 40%!important;
  49. background-color: #33ff33;
  50. color: white;
  51. font-weight: normal;
  52. }
  53. .content{
  54. margin-top: 20rpx;
  55. border:1px solid#ebe4e286;
  56. width:750rpx;
  57. height: 600rpx;
  58. border-radius: 5px;
  59. font-size: 36;
  60. font-weight: bold;
  61. line-height: 80rpx;
  62. color: #32d5e0;
  63. text-align: center;
  64. flex-direction: column;
  65. display: flex;
  66. }
  67. .xia{
  68. justify-content: space-between;
  69. }
  70. .zm1{
  71. position: absolute; /* 要约束所在位置的子元素的位置要设置成绝对 */
  72. left: 30rpx; /* 靠右调节 */
  73. }
  74. .radio{
  75. display:inline-block; /* 横向布局*/
  76. }
  77. .kai{
  78. position: absolute; /* 要约束所在位置的子元素的位置要设置成绝对 */
  79. right: 100rpx; /* 靠右调节 */
  80. }
  81. .mos{
  82. left: 120rpx; /* 靠右调节 */
  83. height: 200rpx;
  84. }

小程序代码

总结:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/905257
推荐阅读
相关标签
  

闽ICP备14008679号