一、任务目标
驱动Arduino uno r4 wifi的I2C接口,按照AHT30传感器的流程获取温度后,将温度数据通过MQTT协议,发送到Home Assistant上,并且在Home Assistant显示出来温度。
要实现以上的目标,可以分解为以下步骤
1、成功安装Arduino开发环境、Home Assistant、EMQX的运行环境(Doker安装)
2、成功初始化I2C接口可以发送数据
3、安装AHT30流程,初始化 与 驱动传感器,获取温度值
4、将温度值通过MQTT协议发送出去
二、平台简介
1、MQTT协议
MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,它被设计用于低带宽、高延迟或不可靠的网络环境。MQTT协议的主要特点包括:
1.轻量级:MQTT协议头部非常小,最小只有2字节,这使得它非常适合带宽受限的环境。
2.低功耗:由于其轻量级的特性,可以快速交互数据后让设备再次进入待机模式,降低了设备的耗电量,所以MQTT在功耗方面表现良好,适合电池供电的设备。
3.高可靠性:MQTT提供了三种消息服务质量(QoS)等级,允许开发者根据应用需求选择合适的消息传递保证:
- QoS 0:最多一次,消息可能丢失,但不重复。
- QoS 1:至少一次,消息可能重复,但不丢失。
- QoS 2:只有一次,确保消息只到达一次。
4.易于实现:MQTT协议简单,易于在各种设备上实现,包括嵌入式系统。
5.支持多种网络:MQTT可以运行在TCP/IP网络之上,也可以通过其他协议进行隧道传输。
6.保持连接:MQTT客户端和服务器之间保持长连接,减少了频繁建立和断开连接的开销。
7.安全性:MQTT支持多种安全机制,包括TLS/SSL加密传输和客户端认证。
8.可扩展性:MQTT支持大量客户端连接,适合大规模分布式系统的实时消息传输。
9.异步通信:MQTT允许消息发布者和订阅者之间进行异步通信,提高了系统的响应性和可伸缩性。
10.跨平台:MQTT不依赖于特定的平台或语言,有多种编程语言的客户端库可供选择,只要设备支持MQTT协议,就可以实现消息的发布和订阅。
2、Home Assistant
Home Assistant是一个开源的智能家居平台,旨在通过集成各种智能设备和服务,提供一个统一的、可自定义的家庭自动化解决方案。以下是Home Assistant的一些核心特点和功能:
1.开源与社区支持:Home Assistant是一个基于Python的开源项目,拥有一个活跃的全球社区,用户可以无偿使用并参与开发。比如:最近小米就开源了相关代码。
2.设备集成:Home Assistant支持多种品牌和类型的智能设备,如灯光、开关、传感器、安全系统等,允许用户通过一个中心化的系统来控制和管理家中的各种智能设备。
3.自动化与场景设置:用户可以根据设备的状态、时间、位置等多种条件,设置自动化的执行逻辑,以及创建多个自动化的集合,一键触发多个设备的联动。
4.跨平台支持:Home Assistant支持多种操作系统和设备,用户可以在手机、电脑、平板等多种设备上使用。
5.集中化管理:所有智能家居设备集中在一个平台上进行管理,降低了用户的使用门槛和维护成本。
6.隐私保护:Home Assistant强调本地控制和隐私,适合在本地服务器如Raspberry Pi上运行,避免了数据上传到云端的隐私风险。
7.自定义与扩展:Home Assistant提供了丰富的插件和自定义功能,方便用户根据需求进行扩展,包括Python脚本编写自定义组件和自动化逻辑。
8.用户界面:支持UI客制化,用户可以通过安装主题、更换背景图片等方式,打造个性化的管理界面。
9.应用场景广泛:Home Assistant在家庭生活、办公场所以及物联网项目开发与测试中都有广泛的应用。
Home Assistant的灵活性和开放性使其成为智能家居领域中一个受欢迎的平台,允许用户自由组合不同品牌的设备,只要协议合适就可以接入Home Assistant的平台,实现个性化的自动化智能家居解决方案,例如A品牌的亮度传感器,B品牌的电动窗帘,这两个品牌没有合作,所以数据不能互通,但是如果A、B品牌都接入了Home Assistant后就可按照自己的想法实现自动化控制。
3、EMQX
EMQX是一款开源、高性能的分布式MQTT消息中间件,专为物联网(IoT)、实时数据传输和消息分发场景设计。以下是EMQX的一些核心特性和优势:
1.多协议支持:以MQTT协议为核心,同时支持MQTT-SN、CoAP、HTTP、WebSocket等多种通信协议,满足不同设备与系统的通信需求。
2.支持完整的MQTT V3.1/V3.1.1及V5.0协议规范,QoS0, QoS1, QoS2消息支持,持久会话与离线消息支持,Retained消息支持,Last Will消息支持,TCP/SSL连接支持,MQTT/WebSocket/SSL支持,HTTP消息发布接口支持等。
3.完全开源:基于Apache 2.0协议许可,完全开源,适用于产品原型设计、物联网创业公司以及大规模的商业部署。
4.支持海量设备连接:EMQX利用Erlang/OTP的高并发特性,支持单机百万级设备连接,是物联网场景的理想选择。
三、硬件平台简介
1、开发板Arduino Uno R4 Wifi简介
Arduino Uno R4 WiFi 是Arduino 官方出品的最新UNO开发板。
主控:
Renesas RA4M1,32位Arm® Cortex®-M4架构,时钟频率为48 MHz,集成USB 2.0 全速模块。
无线模块:
乐鑫出品的ESP32-S3 Mini模组,支持Wi-Fi 和BLE 5.0,搭载Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz。(比主控强,嘿嘿)
板载资源:
LED矩阵:板载一个12×8的红色LED矩阵。
Qwiic连接器:提供了一个Qwiic I2C连接器,方便连接到Qwiic生态系统中的各种模块。
其他:包括ADC、 12位DAC、CAN总线和运算放大器等。
USB Type-c:支持USB HID
2、传感器简介
AHT30是一款高性能的温湿度传感器,具有以下特点和应用范围:
1.功耗低、精度高:AHT30以其低功耗和高测量精度而受到青睐。
2.数字输出,I2C接口:AHT30提供数字输出,并通过I2C接口与系统进行通信,方便集成。
3.优异的长期稳定性:即使在恶劣环境下,AHT30也能保持稳定性能。
4.响应迅速、抗干扰能力强:AHT30能够快速响应环境变化,并且具有较强的抗干扰能力。
5.完全标定:AHT30传感器在出厂前已经过完全标定,确保了测量的准确性。
6.技术规格:
-供电电压:DC 2.2-5.5V
-测量范围:温度-40至120℃、湿度0至100%RH
-典型精度:温度±0.5℃、湿度±3%RH(@25℃)
-分辨率:温度0.01℃、湿度0.024%RH
规格书上介绍的I2C速率 与 采样间隔建议。
经过简单测试,Arduino默认的I2C的速率为100Khz,所以在规格书的范围内,并且从机也有ACK,所以可以使用。
这个传感器的驱动流程比较简单,但是流程图画的特别坑,容易让人误解。0x70 0x71实际上是设备读写地址,不是实际需要发送的数据。
上图的0X70与0X71是传感器的写、读地址,而0xAC是写的目标寄存器,0x33,0x00则是要写入的数据。
读取到值后要转化为实际的温度又有坑,按照规格书给的公式,代码运行后都是0,所以要该乘除的顺序。
综上驱动传感器的流程是:
①地址0X70寄存器0xAC写0x33,0x00
②等待80ms
③地址0X71读7字节
④取处温度值,温度值是由第5字节、4字节、3的低四位字节,组成
⑤按照公式换算出实际温度
看到上文,肯定有人问为什么需要去详细理解驱动的流程,实际Arduino开发中都是直接调用相关的库就可以快速、方便的驱动传感器了,这里有两点:
①我最初初始化I2C时,跳进去坑了(下面会提到),所以怀疑传感器本身有问题,即使传感器有ack。
②想实际的驱动一下传感器给自己增加一点经验,因为不是每一个传感器都有库的。
四、实际开发
1、驱动温度传感器
目的:
驱动AHT30传感器,获取实际的温度,并且使用串口打印出来。
AHT30模块:
AHT30模块使用I2C接口,2套排针用于调试时接逻辑分析仪确认I2C数据。
接线:
下图可以看到开发板总共有3个I2C,有两个I2C附近有电源、地,如下图的1,2,但是1,2是不同I2C,需要不同的配置。大量例程的I2C都是使用第二组的,尝试了很久也没能打开,可能是用的人比较少。(会用的人请教一下),所以最终选择了QWIIC处接线。
驱动库:
在Arduino驱动库中,根本找不到AHT30的驱动库
只能找到AHT10、20的库
仔细阅读AHT20 与 对比 AHT30的规格书后,对比驱动发现AHT20的测量、数据转化的命令与AHT30一致,所以驱动库极大概率是通用的。
驱动的逻辑与流程、发送的数据、回读数据的所有流程都是一样的。
要点:
从上文可知有I2C的引脚需要确认,经过确认后Wire库可以切换不同的I2C,使用QWIIC接口处的I2C引脚,必须,必须使用Wire1才可以初始化正确的引脚,不然必定通讯失败!!!!
运行结果:
图片:
GIF:
2、MQTT上报数据
目的:
测试Arduino Uno r4 Wifi可以通过板载的WIFI模块正确的使用MQTT协议上报温度数据,并且显示在HA终端上。测试使用数据为16.8℃,每秒加0.1℃。
运行结果:
图片:
五、最终效果
实时采集温度上报HA
目的:
间隔1秒将实际的温度数据上报到HA平台,并且显示出来。
流程图:
运行结果:
图片:
小计:
在我的电脑上每次打开Doker都会提示Docker Engine stopped,需要启动 并设置下图的服务。之后再次打开即可
Home Assistant 中个人认为比较重要的就是configuration.yaml的配置,我的配置如下
# Loads default set of integrations. Do not remove.
default_config:
# Load frontend themes from the themes folder
frontend:
themes: !include_dir_merge_named themes
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
mqtt:
- sensor0:
- unique_id: arduino uno Temp
name: "arduino Temp"
state_topic: "homeassistant/sensor/temp"
# suggested_display_precision: 1
unit_of_measurement: "°C"
value_template: "{{ value_json.Temp }}"