项目和创意方向介绍
在智能家居布置中,智能化的程度取决于传感器的种类及数量。因此我设计了一个房屋专用的智能模块,用它可以获取到房屋中的各种数据,以及完成一些智能家居必备的基本功能。集成的功能都是基本上每一个房屋空间都需要的,这样可以把它作为一个基本单元布置在每一个房间中。
方案框图和介绍
思考了一番,房屋中通常需要使用的功能模块有以上这些。有了这些功能布置在每一个房间中,就应该可以实现大部分的自动化控制任务。出于成本考虑,主控我使用的是ESP32C3。
项目原理图介绍
为了方便未来的功能拓展,我把板子上的SPI和I2C接口都引了出来。
元件上由于SGP-30需要1.8V供电,而BME280是可以支持1.8V和3.3V宽电压供电的。既然无可避免的需要使用1.8V电源和电平转换器,因此我SGP30和BME280都是使用的1.8V进行供电。
指定厂商元器件介绍
ESP32-C3-MINI-1U是通用型Wi-Fi模组,体积小,具有丰富的外设接口,配置 4 MB 嵌入式 flash,搭载 RISC-V 32位单核处理器。可用于智能家居、工业自动化、医疗保健、消费电子产品等领域。
BH1750FVI-TR是一款用于I²C总线接口的16位串行输出型数字环境光传感器IC。该芯片最适合用于获取环境光数据,以调整移动电话的LCD和键盘背光功率。它可以在高分辨率下进行大范围的检测。
PCB设计介绍及遇到的问题和解决方法
考虑到这块板子是要布置在每个房间中的,而且需要面对着房间的开放区域。因为无论是人在传感器,还是红外发射和接收,都是有指向性的。因此为了不影响房屋装修美观,这块传感器板子应该要设计的越小越好,越没存在感越好。
极致紧凑设计后,可以看到元件之间几乎没有空隙。我把额外的拓展引脚全部放在了板子下方,当使用AC-DC电源供电时,5V电源输入也是从这里进行输入。
关键代码及说明
代码我使用的是esphome进行编写,这样可以更好更便捷的把产品融入到物联网系统中。除了默认模板中的必须配置外,只需要以下几项,就可以配置完成所有硬件。
remote_receiver:
pin:
number: GPIO5
inverted: true
mode: INPUT_PULLUP
rmt_channel: 2
dump: all
remote_transmitter:
pin:
number: GPIO4
inverted: false
mode: OUTPUT
rmt_channel: 0
carrier_duty_percent: 50%
i2c:
sda: 8
scl: 9
uart:
tx_pin: 21
rx_pin: 20
baud_rate: 115200
binary_sensor:
- platform: gpio
name: "Human Presence"
pin:
number: GPIO3
inverted: false
mode: INPUT
device_class: motion
sensor:
- platform: sgp30
eco2:
name: "Workshop eCO2"
accuracy_decimals: 1
tvoc:
name: "Workshop TVOC"
accuracy_decimals: 1
store_baseline: yes
address: 0x58
update_interval: 1s
- platform: bme280_i2c
temperature:
name: "BME280 Temperature"
oversampling: 16x
pressure:
name: "BME280 Pressure"
humidity:
name: "BME280 Humidity"
address: 0x77
update_interval: 1s
- platform: bh1750
name: "BH1750 Illuminance"
address: 0x23
update_interval: 1s
- platform: adc
pin: 1
name: "Sound Level"
update_interval: 1s
light:
- platform: neopixelbus
type: GRB
name: NeoPixel
pin: GPIO0
variant: WS2812
num_leds: 1
restore_mode: RESTORE_DEFAULT_OFF
但除此之外,如果我们希望使用红外发射器来控制家里的各种电器,还需要使用service API来完成。通过使用这个功能,我们几乎可以在esphome中添加任何我们想要的API接口。举个例子,如果我想使用aeha协议发送数据,那么需要添加下面这些配置
api:
services:
- service: transmit_aeha
variables:
address: int
data: int[]
repeat_times: int
repeat_wait_time: int
then:
- logger.log:
format: "address: %d, data length: %d"
args:
- address
- data.size()
- remote_transmitter.transmit_aeha:
repeat:
times: !lambda 'return repeat_times;'
wait_time: !lambda 'return repeat_wait_time;'
address: !lambda 'return address;'
data: !lambda |-
std::vector<uint8_t> unsignedCharVector;
for (const auto& num : data) {
uint8_t unsignedCharNum = static_cast<uint8_t>(num);
unsignedCharVector.push_back(unsignedCharNum);
}
return unsignedCharVector;
项目附件中会有完整的配置文件,我将所有的协议都添加了进去。这样未来在实际使用场景,我们就可以很方便的通过nodered来设置发送的红外指令内容,而无需再去调整和重新烧录源代码。
功能展示图及说明
电路板我设计的是单面焊接,背面在安装时应该是紧贴墙壁或外壳的:
正面的人在传感器模块通过排针焊接在主板上,传感器下面就是ESP32-C3模块。其余的传感器都在模块下方区域:
插上电后,烧录好程序,就可以直接登录开发板自身的http服务器来进行交互控制:
如果需要解析红外遥控器的数据,拿着遥控器对着电路板按动按钮,在这个页面中也可以直接看到数据
有了这些数据,我们就可以直接通过NodeRed或HomeAssistant来配置物联网遥控器了。比如像这样,就可以在HomeAssistant中创建一个开关,用来发送开关红外指令:
由于我们使用的是esphome API,因此设备也可以很容易的被HomeAssistant自动发现和添加:
心得体会
这个项目使用esp32c3这么小一个主控实现了众多的功能,在设计上还是颇具挑战。即使到现在这样,我发些电路板的设计还有提升的空间,例如对BME280进行隔离处理,避免其中的温度传感器受到SGP-30中加热器的干扰;或是直接使用BME680,用里面的TVOC传感器数据计算eCO2。优化方案有很多,这次活动让我通过亲自动手开拓了思路,获益良多。