本帖最后由 eenas 于 2024-3-22 17:04 编辑
最近买了一块ssd1306屏幕,用于显示温湿度等信息,并且想实现有人亮屏、无人息屏。经过一番搜索,发现并没找到完整且适合小白的教程,所以就自己去搜索,将结果拼接,最终实现了这个效果,适合小白直接套用。由于自己也是小白,里边有些注释写的可能不够准确,欢迎大家指正,一起学习。
这里用的元器件有:
ESP32开发板
dht11温湿度传感器
ssd1306显示器
SR602热释电人体红外传感器
以下为面包板的接线图(接线凌乱,大家不要在意):
i2c:
- id: xsq #定义i2c_id为xsq的sda、scl针脚,供后面调用
sda: GPIO1 #使用ESP32 TX0
scl: GPIO3 #使用ESP32 RX0
font:
- file: "fonts/ht.ttf" #设置字体的路径,需要先在HA上安装“Samba share”加载项,在config/esphome目录下放字体文件,这里为了目录明了新建了个fonts文件夹,即config/esphome/fonts下放了ht.ttf这个字体文件
id: my_font #用于给display调用字体选项,方便选择显示不同的字体、字号、字符
size: 15 #设置字体的大小
glyphs: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZna .-温湿度传感器%:° #设置需要显示的字符
- file: "fonts/hyhj.ttf"
id: my_font1
size: 15
glyphs: 温湿度传感器
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
i2c_id: xsq #定义显示器的i2c_id为xsq
address: 0x3C
id: my_display #设置显示器的id,用于后面switch调用
lambda: |-
it.print(0, 0, id(my_font1), "温湿度传感器");
it.printf(0, 32, id(my_font), "温度: %.1f °C", id(dhtwd).state);
it.printf(0, 46, id(my_font), "湿度: %.1f %%", id(dhtsd).state);
#上方前1个数字是显示到显示器的x坐标,第2个是y坐标,第1个id是选择需要的字体(字体、字号、字符),第2个id是选择输出内容的传感器id(id在传感器中定义),%.1f表示输出的内容输出到小数点后1位(比如输出到20.1,同理%.0f表示只输出整数),要输出%则需要写为%%
#注意,需要屏幕内容是在""内(如"多功能传感器",则屏幕显示多功能传感器,同时确保所输出的字符在前面的字体中有定义)
sensor:
- platform: dht
pin: GPIO18 #定义dht11使用ESP32 D18针脚,根据实际情况自己的选择,后面同理
temperature:
name: "Temperature"
id: "dhtwd" #提供给lambda调用(display中的第二个id,用于输出传感器的数据)
humidity:
name: "Humidity"
id: "dhtsd" #提供给lambda调用(display中的第二个id,用于输出传感器的数据)
update_interval: 5s #定义更新时间为5秒
binary_sensor:
- platform: gpio
pin: GPIO19
name: "人体红外传感器"
id: hw #用于后面switch调用
device_class: motion
on_press:
- switch.turn_on: sw #当该GPIO为“按下”时(即有人时)执行id为sw的trun_on的操作
on_release:
- switch.turn_off: sw #当该GPIO为“释放”时(即无人时)执行id为sw的trun_off的操作
switch: #此为开关,须在前面调用
- platform: template
name: ESP Screen Switch
id: sw
lambda: |-
if (id(hw).state) {
return true;
} else {
return false;
}
#上面的id(hw)为人体红外传感器的id,用于判断有人还是无人
turn_on_action:
- lambda: id(my_display).turn_on(); #此处id为显示器id,用于执行显示器开启,即有人开启屏幕
turn_off_action:
- lambda: id(my_display).turn_off(); #此处id为显示器id,用于执行显示器关闭,即无人关闭屏幕
|