智慧家居·万物互联:我的智能花盆DIY之旅(ESP32)

简介: 智慧家居·万物互联:我的智能花盆DIY之旅(ESP32)

智慧家居·万物互联:我的智能花盆DIY之旅

0 写在前面

1 架构怎么搭?

1.1 系统层次

1.2 MQTT是什么?

1.3 项目流程

2 云平台怎么用?

2.1 创建设备

2.2 设备开发

2.3 设备管理

3 软件怎么设计?

3.1 依赖库配置

3.2 引脚定义与连接

3.3 WIFI配置

3.4 MQTT配置

3.5 连接云平台

3.6 执行设备

4 更进一步

0 写在前面

🔥物联网(Internet of things, IoT)就是物物相连的互联网,在智能家居、智慧城市等方面有广泛应用。这次,我从零开始搭建一个基于ESP32的智能花盆,相信读完本文,你也可以亲自实现一个物联网应用,无论是参加创客大赛还是物联网比赛,都先人一步!


首先,先看看最后的实物图


image.png

image.png

1 架构怎么搭?


image.png

1.1 系统层次

整个系统分为3部分:


云端服务部分 使用任何云服务器即可,本项目使用涂鸦云平台,官网放在这涂鸦云平台

控制器部分 本项目使用ESP32控制器,也可以使用STM32、树莓派等

外围设备部分 即传感器、执行器等,本项目主要采用光敏电阻、DHT11温湿度传感器、灯管、风扇。也可使用舵机(做水阀)以及各种感应设备。

1.2 MQTT是什么?

MQTT(Message Queuing Telemetry Transport),消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。


image.png

1.3 项目流程

MQTT的订阅方和发布方遵守同一种开发API格式,我们根据所选云平台设计好的API进行功能设计。在项目运转时,ESP32(或其他任何控制器)通过WIFI连接到互联网,使得其能够与云平台通信,去订阅云平台发布的话题(即API),这样就能把底层传感器的数据收集并传输给平台,也能获得平台的反馈。


更进一步,可将物联网应用部署到移动端、Web等。

接下来就按系统层次一步步完成DIY。

2 云平台怎么用?

2.1 创建设备

进入涂鸦云平台选择产品开发,开始创建设备。


image.png

按如下图文步骤完成产品创建。

  • 产品开发创建产品
  • 选择产品:温湿度传感器
  • 选择智能化方式:设备接入
  • 完善产品信息:

image.png

添加自定义功能


image.png


image.png

下面是本次实验设计的所有功能。


image.png

2.2 设备开发

免费激活码并注册一个设备,得到如下设备凭证。


image.png

记住这里的设备凭证,后续配置要用!!

2.3 设备管理

完成上述步骤后可以在设备管理中看到创建的设备。


image.png

3 软件怎么设计?

3.1 依赖库配置

本项目使用的DHT11驱动需要从下面两个地址下载库文件。DHT11Adafruit_Sensor

MQTT库和JSON库则可以在Arduin仓库中自行下载。

安装MQTT库


image.png

安装Json库


image.png

3.2 引脚定义与连接

查看下面的ESP32引脚定义


image.png

我的定义如下所示,大家可以参考

#include "DHT.h"
#include "WiFi.h"
#include "PubSubClient.h"
#include "ArduinoJson.h"
GPIO///
#define DHTTYPE DHT11   // 定义温湿度传感器类型为DHT11
#define DHTPIN 15       // DHT11引脚
#define ADCPIN 32       // 光敏电阻引脚
#define LIGHTPIN 33     // 灯光控制引脚     
#define FANPIN 13       // 风扇控制引脚
GPIO///

根据定义的实际接线图如下:


image.png

3.3 WIFI配置

WIFI设置如下:

WIFI///
#define WIFI_SSID "Winter"          // wifi名
#define WIFI_PASSWD "913982779"     // wifi密码
WIFI///

3.4 MQTT配置

参考大家选用云平台的协议规范,我这里参考涂鸦云MQTT协议


image.png

要配置ClientIDUserNamePassword三个属性,都与前面设备凭证的DeviceId有关,其中Password需要根据设备密码用Hmac256算法加密。

MQTT///
#define mqttServer "m1.tuyacn.com"
#define mqttPort 1883
#define ClientId "tuyalink_6c9a1bfe77510a9904vbva"
#define User "6c9a1bfe77510a9904vbva|signMethod=hmacSha256,timestamp=1639372190,securemode=1,accessType=1"
#define Pass "e3b024852f65fffabbf17ccfe97b8a599b134a81037976736288df58ec88e188"
#define TOPIC "tylink/6c9a1bfe77510a9904vbva/thing/property/set"
MQTT///

3.5 连接云平台

连接WIFI

WiFiClient espClient;               //创建网络连接客户端
//连接WIFI相关函数
void setupWifi()
{
  delay(10);
  Serial.println("Connecting WIFI");
  WiFi.begin(WIFI_SSID, WIFI_PASSWD);
  while (!WiFi.isConnected())
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("OK");
  Serial.println("Wifi connected successfully!");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

配置并连接MQTT

//链接mqtt
void setupMQTT()
{
 client.setServer(mqttServer, mqttPort);
 client.setCallback(callback); 
 while (!client.connected())
 {
   Serial.println("Connecting MQTT");
   if(client.connect(ClientId,User,Pass))
   {
     Serial.println("MQTT connected successfully!");
     client.subscribe(TOPIC);
   }
   else
   {
     Serial.print("Failed with state ");
     Serial.println(client.state());
     delay(2000);
   }
 }
}

其中MQTT回调函数的作用:若订阅的主题有消息则触发回调获取消息

// MQTT回调函数
void callback(char * topic,byte * payload,unsigned int length){
  DynamicJsonDocument doc(512);
  char charbuffer[512];
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.println("]");
  int i = 0;
  for(;i<length;i++){
    charbuffer[i] = (char)payload[i];
  }
  charbuffer[i] = '\0';
  DeserializationError error = deserializeJson(doc,charbuffer);
  if(error){
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }
  bool lightOn = doc["data"]["light_switch"];
  bool dehumiOn = doc["data"]["fan_switch"];
  if (lightOn){
    digitalWrite(LIGHTPIN,HIGH);
  }
  else{
    digitalWrite(LIGHTPIN,LOW);
  }
  if (dehumiOn){
    digitalWrite(FANPIN,HIGH);
  }
  else{
    digitalWrite(FANPIN,LOW);
  }
}

Arduino的设置函数

void setup() {
  // put your setup code here, to run once:
  pinMode(LIGHTPIN,OUTPUT);
  Serial.begin(115200);
  setupWifi();
  setupMQTT();
  dht.begin();
}

Arduino的循环函数

void loop() {
  delay(5000);
  // Read humidity data
  int h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  int t = dht.readTemperature();
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
  // Read illumination data
  float l = analogRead(ADCPIN);
  int percent = 100 - l / 4096.0 * 100.0;
  // 串口打印
  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("C "));
  Serial.print(F("illumination: "));
  Serial.print(percent);
  Serial.println(F("% "));
  // 封装json
  DynamicJsonDocument doc(512);
  DynamicJsonDocument jsdata(256);
  DynamicJsonDocument tempdata(32);
  DynamicJsonDocument humidata(32);
  DynamicJsonDocument light(32);
  tempdata["value"] = t;
  tempdata["time"] = 1639454915;
  humidata["value"] = h;
  humidata["time"] = 1639454915;
  illudata["value"] = percent;
  illudata["time"] = 1639454915;
  jsdata["temp_current"] = tempdata;
  jsdata["humidity_current"] = humidata;
  jsdata["light_current"] = light;
  doc["msgId"] = "45lkj3551234001";
  doc["time"] = 1639454915;
  doc["data"] = jsdata;
  String str;
  serializeJson(doc, str);
//  Serial.println(str);
  // Sending to MQTT
  char *p = (char *)str.c_str();
  if(client.publish("tylink/6c9a1bfe77510a9904vbva/thing/property/report",p) == true)
    Serial.println("Success sending message.");
  else Serial.println("Failed sending message.");
  client.loop();
}

打开串口,成功收到连接消息。


image.png

打开云平台,成功看到设备在线。同时也能获得设置的各个属性信息。


image.png

3.6 执行设备

由于我选择了USB灯管,但ESP32无法驱动USB(除非转接),不得不以一种不甚优雅的方式通过树莓派间接驱动这些执行设备。大家只要选型选好就不存在这种两个控制器的问题,这里把树莓派理解成一种驱动器即可,它通过读ESP32的信号来点灯和驱动风扇。下面代码仅供参考

import RPi.GPIO as GPIO
#------------------------------------------------------#
# @breif: 执行设备
#-------------------------------------------------------#
class Exe:
    def __init__(self):     
        self.light = 11              # 引脚11接灯
        self.fan = 13               # 引脚13接风扇
      self.esp = 15       # 引脚15接ESP32
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(self.light,GPIO.OUT)
        GPIO.output(self.light,GPIO.LOW)
        GPIO.setup(self.fan ,GPIO.OUT)
      GPIO.output(self.fan ,GPIO.LOW)
    # @breif:驱动
    def run(self):
      if GPIO.input(self.esp):
          GPIO.output(self.light, GPIO.HIGH)
          GPIO.output(self.fan , GPIO.HIGH)
    else:
      GPIO.output(self.light, GPIO.LOW)
          GPIO.output(self.fan , GPIO.LOW)

4 更进一步

写了个简单的网页来实时监测、可视化。


image.png

🔥更多精彩专栏

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
人工智能 监控 数据可视化
真·手把手教学!早稻田大学利用VR设备,让机械臂教你正确的乒乓球挥拍姿势
真·手把手教学!早稻田大学利用VR设备,让机械臂教你正确的乒乓球挥拍姿势
280 0
真·手把手教学!早稻田大学利用VR设备,让机械臂教你正确的乒乓球挥拍姿势
|
vr&ar Android开发 iOS开发
安卓之父重返手机硬件市场,亚马逊抛弃头盔眼镜推出AR新技术 | 快报
而且,现在Android市场已经是一片红海了,尤其是在中低端机领域更是如此,此次Andy回到硬件界或许就是为了生产一款Android的标杆产品,展开与iOS设备的正面竞争。
159 0
安卓之父重返手机硬件市场,亚马逊抛弃头盔眼镜推出AR新技术 | 快报
|
存储 供应链 监控
智能硬件+影音内容绑定,能否为智能家居破局?
近年来,智能家居无疑是最热门的行业之一,随着“互联网+”的广泛应用,我国智能家居产品与技术呈现百花齐放的态势,市场也涌现出横跨低、中、高不同档次的产品。但目前真正落地用户埋单的还真不多,智能家居更多表现出来的是“虚火”,可谓雷声大雨点小,行业问题也开始被暴露出来,比如投资过热与消费遇冷,供求严重失衡;服务滞后,多数产品体验欠佳;滥用概念,功能堆砌等。甚至已有声音直接否定它,认为智能家居只是个“伪智能”“伪概念”。行业进入瓶颈期,围绕家居场景的智能硬件该何去何从,又该如何破局,开始成为了新的课题。
193 0
智能硬件+影音内容绑定,能否为智能家居破局?
|
传感器 城市大脑 物联网
物联网入门训练营“W800开发板的奇思妙想”:智能导航轮椅
如果你有好的创意或者对文中的创意有更多延展想法,也可以在本文后评论,我们还有少数试用开发板的机会,期待你的评论。
物联网入门训练营“W800开发板的奇思妙想”:智能导航轮椅
|
Web App开发 机器学习/深度学习 人工智能
「镁客·请讲」小竹物联张佳:为什么放弃IoT大赛道,选择游戏娱乐?
张佳表示,物联网创业方向很多,但只有游戏是他们最为擅长和熟悉的领域。
484 0
|
机器学习/深度学习 分布式计算 安全
8月14日云栖精选夜读:驱动行业未来20年发展 阿里巴巴AIR视频解说进入倒计时
2017年,阿里巴巴首次发布全球创新研究计划Alibaba Innovative Research,简称AIR。AIR计划旨在让全世界的科技人才在追逐世界的同时,用科技创造新的未来! 为了让更多参与者深入理解AIR(Alibaba Innovative Research)的研究课题,阿里巴巴近日宣布将在8月15日-16日围绕此前发布的课题进行AIR open day主题视频解说, 二十多位科研课题负责人将在视频中深度解析课题研究内容。
3666 0
|
传感器 自动驾驶 定位技术
|
人工智能 物联网 芯片
模组厂商对话 MTK:智能音箱市场谈红海还早,下一个爆品将诞生丨WARE 2018
在此次峰会上,安信可科技 CEO 纪亚萍与 MTK 技术总监王小兵就他们共同专注的 AI、IoT 方面的议题进行了对话。
2789 0