根据论坛里大佬们的讨论,成功制作了基于ESP32的蓝牙网关(网线款)、基于ESP32C3的蓝牙网关(无线款)、基于CH592F的BTHOME蓝牙温湿度计、基于ESP8266的涂鸦开关,特此发帖分享!点击标题可以跳转到项目位置,可以打板或下载配置文件(蓝牙网关有线版可能还在审核),预计还会制作基于CH592F的ibeacon定位模块!
一、基于ESP32C3的蓝牙网关(无线款)
1、这个项目是什么?目前,市面上的很多设备都采用低功耗的蓝牙,这些设备往往都不支持wifi连接,一方面也许是因为功耗的问题,另一方面,万恶(不是)的商家可以尽情售卖自己的蓝牙网关产品,就几大厂家来看,蓝牙网关的价格往往在150-200元的价位,这对于我——电子垃圾佬来说无异于巨大的负担(虽然我的元器件价格也超过这个价格了emmm),那么,有没有一种方法,既可以获得廉价的设备,又可以少敲代码——鱼与熊掌真的不可以兼得吗?
2、什么是ESPhome?ESPHome 是一个开源的物联网(IoT)框架,专为简单易用地配置和控制 ESP8266 和 ESP32 芯片开发的。它允许用户使用 YAML 配置文件轻松创建固件,以运行在支持的 ESP 芯片上,从而实现设备的自动化控制与集成,尤其是在智能家居领域。ESPHome 常被用作 Home Assistant 的伴侣工具,也可以独立运行。用户不再受限于传统的代码编程,只需要轻松的配置脚本就可以构建文件。
3、如何安装环境并烧录程序?我建议使用虚拟环境miniconda
(1)安装python环境
创建一个新的 Python 虚拟环境:
conda create -n esphome_env python=3.10 -y
激活虚拟环境:
conda activate esphome_env
(2)安装ESPhome
使用 pip 安装 ESPHome:
pip install esphome
验证安装是否成功:
esphome version
在你的工程文件下新建一个文件夹用于存储工程,在这个文件夹的上级目录执行
esphome dashboard demoe/
demo是按照你创建的文件夹名字来
(3)使用esphome新建并编译下载工程
打开esphome,在浏览器中输入:localhost:6052
点击"NEW DEVICE",选择ESP32C3设备,新建工程
选择EDIT,把附件中的yaml配置文件中的文本粘贴进来(注意,请更改自己家里的WiFi和密码)
在这里:
更改完毕后,回到主界面, 点击“Validate”
验证无误后,点击右下角的INSTALL
选择“Plug into....”那一项,使用usb数据线连接设备和电脑
此时你应该可以听到设备管理器不停的弹出和断开设备....
选择好设备,进行烧录,初次烧录时间较长,请耐心等待
4、我怎么使用这个设备?(1)烧录成功后,设备初始化时,右侧灯闪烁,左侧绿灯呼吸灯闪烁,蜂鸣器播放“一闪一闪亮晶晶....”
(2)打开log对话窗可以观察连接日志
(3)连接成功wifi后,右侧灯蓝灯常亮,如果连接失败,左侧灯会有黄色闪烁
(连接wifi、断开wifi均有提示音,可以在ymal文件中自行修改)
5、在HomeAssistant中添加esphome
端口号不用变,填入ip即可(我建议路由器端绑定mac地址)
什么?你没有HomeAssistant?快去买个渣机玩客云或者电视盒子,刷入Armbian系统,在docker或者原机下安装HA.....(按照评论区需求以及元子决定是否出视频教程)
6、添加BLE设备以小米为例,HA在设备端会显示小米的设备(或者其他设备)
添加小米设备(这里是温度计)
***注意,米家设备需要解密密钥,密钥获取请参考:https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor
其中,小米ID可以从id.mi.com中获得***
7、元器件采购(1)基本元器件——优信买全套就ok
(2)外壳(不太想打广告的,可是就他一家包邮我能有什么办法QvQ)
PS:主板厚度1.6mm,面板厚度1.0mm
二、基于ESP32的蓝牙网关(网线款)
1、这个项目是什么?目前,市面上的很多设备都采用低功耗的蓝牙,这些设备往往都不支持wifi连接,一方面也许是因为功耗的问题,另一方面,万恶(不是)的商家可以尽情售卖自己的蓝牙网关产品,就几大厂家来看,蓝牙网关的价格往往在150-200元的价位,这对于我——电子垃圾佬来说无异于巨大的负担(虽然我的元器件价格也超过这个价格了emmm),那么,有没有一种方法,既可以获得廉价的设备,又可以少敲代码——鱼与熊掌真的不可以兼得吗?
2、什么是ESPhome?ESPHome 是一个开源的物联网(IoT)框架,专为简单易用地配置和控制 ESP8266 和 ESP32 芯片开发的。它允许用户使用 YAML 配置文件轻松创建固件,以运行在支持的 ESP 芯片上,从而实现设备的自动化控制与集成,尤其是在智能家居领域。ESPHome 常被用作 Home Assistant 的伴侣工具,也可以独立运行。用户不再受限于传统的代码编程,只需要轻松的配置脚本就可以构建文件。
3、如何安装环境并烧录程序?我建议使用虚拟环境miniconda
(1)安装python环境
创建一个新的 Python 虚拟环境:
conda create -n esphome_env python=3.10 -y
激活虚拟环境:
conda activate esphome_env
(2)安装ESPhome
使用 pip 安装 ESPHome:
pip install esphome
验证安装是否成功:
esphome version
在你的工程文件下新建一个文件夹用于存储工程,在这个文件夹的上级目录执行
esphome dashboard demoe/
demo是按照你创建的文件夹名字来
(3)使用esphome新建并编译下载工程
打开esphome,在浏览器中输入:localhost:6052
点击"NEW DEVICE",选择ESP32设备,新建工程
选择EDIT,把附件中的yaml配置文件中的文本粘贴进来
更改完毕后,回到主界面, 点击“Validate”
验证无误后,点击右下角的INSTALL
选择“Plug into....”那一项,使用usb数据线连接设备和电脑
应该可以看到一个CH340K的设备,可以直接烧录,硬件部分增加了自动下载电路.
选择好设备,进行烧录,初次烧录时间较长,请耐心等待
4、我怎么使用这个设备?(1)烧录成功后,设备初始化时,左侧红灯闪烁,右侧绿灯呼吸灯闪烁,蜂鸣器播放“一闪一闪亮晶晶....”
(2)打开log对话窗可以观察连接日志
(3)连接HA后,左侧灯红灯熄灭,如果连接失败,左侧红灯会有闪烁
5、在HomeAssistant中添加esphome
端口号不用变,填入ip即可(我建议路由器端绑定mac地址)
什么?你没有HomeAssistant?快去买个渣机玩客云或者电视盒子,刷入Armbian系统,在docker或者原机下安装HA.....(按照评论区需求以及元子决定是否出视频教程)
6、添加BLE设备以小米为例,HA在设备端会显示小米的设备(或者其他设备)
添加小米设备(这里是温度计)
***注意,米家设备需要解密密钥,密钥获取请参考:https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor
其中,小米ID可以从id.mi.com中获得***
7、元器件采购(1)基本元器件——优信买全套就ok
(2)外壳(不太想打广告的,可是就他一家包邮我能有什么办法QvQ)
PS:主板厚度1.6mm,面板厚度1.2mm
8、相较于VerA版本的更新1、采用网口连接HA主机,使得蓝牙的扫描效率更高
2、增加了一颗RGB灯,可以手动修改颜色和亮度
9、复刻注意1、这里的外壳装配需要注意,C口的高度略高,需要打磨0.2mm左右的铝壳,在焊接过程中,可以采用铁板烧正面、部分铁板烧C口(背面),手动焊接背面的方式
2、网口可以买那种1元包邮的,和4元正版的那种是一样的
三、基于CH592F的BTHOME蓝牙温湿度计
1、项目来源项目的灵感来自@Azunya 的蓝牙温湿度计 工程,源工程使用的是AD广播的name属性播放温湿度计的信息,思路很好,但是这样的广播不能够接入任何智能设备,那么有没有一种方法能把DIY的温湿度计接入HA设备呢?
2、BThome协议BTHome协议是一种轻量级的蓝牙通信协议,设计用于智能家居传感器设备与接收端(如网关或主控设备)之间的数据传输。它由 ESPHome 项目团队开发,专注于实现低功耗、高效率的数据传输,特别适用于蓝牙低功耗(Bluetooth Low Energy, BLE)设备。
https://bthome.io/协议官网
3、实现原理实现原理很简单,官网上也给出了温湿度计的案例,我们将采集到的温湿度计填入具有uuid属性的BThome数据缓冲区中,即可向蓝牙网关进行广播。
(这里的蓝牙网关可以参考我的上个项目:https://oshwhub.com/bitshen/esp32-c3-mi-ni-lan-ya-wang-guan_copy)
4、操作过程(1)烧录代码,使用WCHIPS烧录代码
(2)在HA中搜索设备,添加即可
(3)最终效果
(4)电量显示不太准,但是不想改了
四、基于涂鸦插座的智能插座ESPHOME版本
插座基于涂鸦mc010(esp8266),注意010w系列是博通系列不可以使用(焊接很繁琐)
烧录点可以参考网络上其他大佬的视频,我这里只给出ESPhome的配置文件。https://post.smzdm.com/p/a6pgp2ko/
tuya.ymal
substitutions:
button_pin: GPIO13
relay_pin: GPIO12
led_state_pin: GPIO5
led_relay_pin: GPIO4
node_name: plug-tuya
node_id: plug_tuya
node_name_friendly: ${node_name}
packages:
common: !include common/common.yaml
esphome:
name_add_mac_suffix: true
binary_sensor:
- platform: gpio
name: "${node_name}-button"
id: "${node_id}_button"
pin:
number: $button_pin
inverted: true
mode:
input: true
pullup: true
on_press:
then:
- logger.log: "TOGGLE switch..."
- switch.toggle: ${node_id}_switch
light:
- platform: monochromatic
name: ${node_name}-relay-led
id: ${node_id}_relay_led
output: ${node_id}_relay_led_pinout
default_transition_length: 200ms
- platform: status_led
name: ${node_name}-LinkLed
id: ${node_id}_link_led
pin:
number: $led_state_pin
inverted: true
output:
- platform: esp8266_pwm
pin:
number: $led_relay_pin
inverted: true
id: ${node_id}_relay_led_pinout
switch:
- platform: safe_mode
name: ${node_name}-safemode
id: "${node_id}_safemode"
- platform: gpio
pin: $relay_pin
name: "${node_name}-switch"
id: "${node_id}_switch"
on_turn_on:
then:
- light.turn_on: ${node_id}_relay_led
- light.turn_off: ${node_id}_link_led
on_turn_off:
then:
- light.turn_off: ${node_id}_relay_led
- light.turn_on: ${node_id}_link_led
common.ymal
esphome:
name: ${node_name}
esp8266:
board: esp01_1m
restore_from_flash: false
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: true
reboot_timeout: 30min
ap:
ssid: "${node_id} hotspot"
password: !secret ap_password
logger:
level: INFO
api:
password: !secret api_password
reboot_timeout: 1h
ota:
- platform: esphome
password: !secret esphome_ota_password
web_server:
port: 80
include_internal: true
version: 1
text_sensor:
- platform: version
name: '${node_name_friendly}-Version'
id: ${node_id}_platform_version
- platform: wifi_info
ip_address:
name: "${node_name_friendly}-IP"
id: ${node_id}_ip
bssid:
name: "${node_name_friendly}-BSSID"
id: ${node_id}_bssid
mac_address:
name: "${node_name_friendly}-MAC"
id: ${node_id}_mac
- platform: template
name: '${node_name_friendly}-Uptime'
id: ${node_id}_uptime_human
sensor:
- platform: uptime
id: ${node_id}_raw_up_time
update_interval: 15min
internal: true
on_raw_value:
then:
- text_sensor.template.publish:
id: ${node_id}_uptime_human
state: !lambda |-
int seconds = round(id(${node_id}_raw_up_time).raw_state);
int days = seconds / (24 * 3600);
seconds = seconds % (24 * 3600);
int hours = seconds / 3600;
seconds = seconds % 3600;
int minutes = seconds / 60;
seconds = seconds % 60;
return (
(days ? String(days) + "d " : "") +
(hours ? String(hours) + "h " : "") +
(minutes ? String(minutes) + "m " : "") +
(String(seconds) + "s")
).c_str();
- platform: wifi_signal
name: "${node_name_friendly}-WifiSignal"
id: ${node_id}_wifi_signal
update_interval: 15min
binary_sensor:
- platform: status
name: "${node_name_friendly}-LinkStatus"
id: ${node_id}_link_status
switch:
- platform: restart
name: "${node_name_friendly}-Restart"
id: ${node_id}_restart
|