- 项目介绍
在卫生间布置多个由ESP32制作的功能模块,将所有功能单元整合在Home Assistant中,通过Home Assistant上的条件设置来实现场景判断,并执行相应自动化动作。当人进入卫生间并被其中一个人在传感器捕捉到后,服务器会配合其他多点分布的传感器完成场景判断(是如厕、洗手、或是洗澡),再进行对应场景的动作。比如,当有人进入卫生间时,打开主灯及镜前灯;如果检测到是在上厕所,可以播放一些舒缓的轻音乐,同时将镜前灯关闭等。
场景判断及执行这一系列动作需要多个位置的多个传感器和执行单元来协同完成,但在家中铺设大量的信号线不太现实,且这些信号线也不适合较长距离的传输,所以每个单一传感器或动作单元我们都可以用一个esp32主控来把它独立出来,全部接入wifi后再在home assistant服务器中进行整合,然后在服务器端进行条件判断与动作指令发送。
- 项目设计思路
该项目使用了三个独立模块,为了验证各系列的ESP32是否都可以丝滑的纳入系统中,我特别选用了三个不同的ESP32芯片。其中人在传感器的模块是用来感应卫生间是否有人,如果有人,就可以触发比如开灯的操作;第二个传感器是激光传感器,可以用来安装在马桶附近,负责检测马桶上是否有人,以此来判断当前的场景到底是上厕所,还是仅仅洗手,以此触发不同的动作;第三个单元作为输出,本项目中代替卫生间中需要被控的设备,例如各种灯光,换气扇,智能马桶等,作为情景切换的展示作用。
- 项目方案框图和原理图解释
在该项目中,仅ESP32-C3模块我们来自己制作,其余的单元大同小异,我计划直接购买成品开发板完成。
esp32-C3模块功能很多,在该项目中仅用作人在检测似乎有点浪费,因此本项目会按照开发板的目标来设计这个模块,争取还可以将它作为一块通用开发板使用。
首先我们看一下串口部分的设计,使用常见的CH343P和内置了限流电阻的二合一三极管,来尽可能节省开发板的面积。
接下来是MCU部分,这一部分比较简单,用一个3.3V的LDO来供电,采用的是SPX3819,和大多数LDO不同,这颗LDO多了一个bypass的引脚,可以通过外界一个小电容来达到更好的波纹抑制效果。供电完成后进行一下必要的引脚配置,添加上刷机按钮,再把所有可用的MCU引脚引出即可。
接下来是板载外设部分,由于IO2和IO8也是启动引脚,在外设使用上会有一定限制,本着不浪费的原则,我们也可以给它们设计两个外设。其中IO2需要外接上拉,因此我们给他设计一个ADC的五向开关,IO8也需要上拉,我们设计一个WS2812编程灯珠。这样板载有简单的输入输出外设,在做开发的时候就可以免接线,直接开始编写测试代码。
最后一步,我们只需要把所有esp32C3的引脚引出,就算是大功告成。这里的引脚顺序和官方开发板完全一致,以确保做到最大兼容性,当然不要忘了,C3自带一个串口USB,我们可以把串口USB也一并引出。
- 设计中用到规定厂商的元器件介绍
该方案使用了ESP家族的多款芯片。由于硬件设计是基于ESP32-C3进行,因此在这里对C3进行以下介绍。
ESP32-C3芯片是一款32-bit RISC-V MCU,并集成了 2.4 GHz Wi-Fi & Bluetooth 5 (LE)
项目中实际使用的是ESP32-C3-MINI模块,该模块集成 ESP32-C3 芯片,RISC-V 32 位单核处理器,时钟频率高达 160 MHz。具备行业领先的低功耗性能和射频性能,内置 400 KB SRAM、384 KB ROM 存储空间,并支持多个外部 SPI、Dual SPI、Quad SPI、QPI flash。
同时,模块具备完善的安全机制:基于 RSA-3072 算法的安全启动、基于 AES-128-XTS 算法的 flash 加密、创新的数字签名和 HMAC 模块、支持加密算法的硬件加速器。并且还有丰富的通信接口及 GPIO 管脚,可支持多种场景及复杂的应用。
- PCB绘制打板介绍及遇到的问题和解决方法
按照原理图绘制好的PCB如下,为了尽可能保证信号质量,避免使用过孔,避免蛇形走线,我使用了四层板。
引脚和官方开发板ESP32-C3-DevKitM-1完全兼容,相比起来,除了尺寸更加紧凑外,还多了一个板载五向开关,并增加了双USB输出,拓展性更强。
打好的五块板子是这样:
焊接过后,并且用洗板水清洗后的成品:
- 关键代码及说明
本项目我是使用HOME ASSISTANT + MQTT作为物联网中枢服务器的。为了演示方便我把服务器就架设在了自己的WINDOWS电脑上。架设过程非常简单,HOMEASSISTANT根据官网教程下载virtual box载入硬盘即可;而MQTT只需要下载安装包双击安装即可完成。需要注意的是,MQTT需要修改目录下的mosquitto.conf文件,在里面添加:
listener 1883
allow_anonymous true
随后在目录下打开cmd,运行以下命令即可开启服务:
mosquitto -v -c mosquitto.conf
ESP32上的代码我都是使用micropython编写的,micropython实现MQTT非常简单,有好几个库都可以用。我使用的是umqttsimple,只需要几行代码便可以配置好MQTT客户端,当收到订阅的消息时便转到callback函数:
def connect_and_subscribe():
global client_id, mqtt_server, topic_sub
client = MQTTClient(
client_id = client_id,
server = mqtt_server,
port = port,
user = user,
password = pwd,
keepalive = 60,
lw_topic = topic_availability,
lw_msg = "offline"
)
client.set_callback(callback)
client.connect()
client.subscribe(topic_command)
print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_server, topic_command))
return client
如果想让HOMEASSISTANT自动添加我们的设备,而不是再去服务器端配置相应的yaml,我们需要给homeassistant的特定规则topic发送配置信息,自动添加配置通过下面这个函数实现:
def discovery():
_config = {
"name": client_id,
"unique_id": client_id,
"state_topic": topic_state,
"availability_topic": topic_availability,
"command_topic": topic_command,
"qos": 0,
"options": ["Mode 0","Mode 1","Mode 2","Mode 3","Mode 4"],
}
_msg = json.dumps(_config)
client.publish(topic_config, _msg)
ESP32这边只是整个系统的边缘节点,他们只负责回报传感器信息给服务器,并执行服务器下达的指令。各个节点之间的协作方法,以及判断条件等,都在服务器上进行配置。例如如果当厕所有人时,并且马桶上也有人时,切换到如厕场景的配置如下:
alias: Mode2
description: ""
trigger:
- platform: state
entity_id:
- binary_sensor.toilet
from: "off"
to: "on"
condition:
- condition: state
entity_id: binary_sensor.human
state: "on"
action:
- service: select.select_option
data:
option: Mode 2
target:
entity_id: select.box
- delay:
hours: 0
minutes: 0
seconds: 1
milliseconds: 0
- service: select.select_option
data:
option: Mode 0
target:
entity_id: select.box
mode: single
- 功能展示及说明
一共使用了下面这些模块进行场景识别的演示:
我们制作的ESP32-C3开发板搭配的是人在传感器模块:
我用一个小玩偶搭建了一个模拟卫生间的演示场景:
具体使用场景切换的效果大家可以看视频。
- 对本活动的心得体会,及整个设计过程中遇到的难点和解决方法
借着本次大赛,可以把平时有些想法但却一直懒得动手的东西做出来,确实在过程中学到了很多东西,也体会了不少快乐。希望以后能有更多类似活动。