Follow me 第二季第2期+ 扩展任务一利用LTR-329 环境光传感器,上传光照度到HA并显示
[复制链接]
下面展示了如何通过Arduino UNO R4 WiFi和LTR-329环境光传感器读取光照数据,并通过MQTT协议将数据发送到MQTT代理。
接下来,需要将这些数据集成到Home Assistant(HA)中,以便在HA面板上显示。
以下是如何完成这一过程的步骤:
通过外部LTR-329环境光传感器,将光照度数据上传到HA并在HA面板上显示,所需搭配器件Arduino UNO R4 WiFi、5591(LTR-329光传感器扩展板)、PRT-14426(Qwiic缆线-50mm)。
一、硬件连接
连接LTR-329光传感器:
使用5591(LTR-329光传感器扩展板)将LTR-329光传感器与Arduino UNO R4 WiFi连接起来,连接的是J2接口。
连接Qwiic缆线:
使用PRT-14426(Qwiic缆线-50mm)将扩展板与Arduino UNO R4 WiFi的Qwiic连接器连接起来。
Qwiic连接器的设计使得连接更加简便和可靠,即插即用。
二、代码:
// 引入必要的库
#include "Adafruit_LTR329_LTR303.h"
#include <ArduinoMqttClient.h>
#include <WiFiS3.h>
#include <WiFiClient.h>
#include <Arduino_JSON.h>
// 创建LTR-329传感器的实例
Adafruit_LTR329 ltr = Adafruit_LTR329();
// WiFi网络的SSID和密码
char ssid[] = "CMCC-c6tG";
char pass[] = "mei13728232960";
int status = WL_IDLE_STATUS; // WiFi连接状态
// MQTT代理的地址和端口
const char broker[] = "192.168.1.113";
int port = 1883;
const char command_topic[] = "lux"; // MQTT主题
// 创建WiFi和MQTT客户端实例
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
// 用于存储JSON数据的变量
JSONVar dataObj;
void setup() {
// 初始化串口通信
Serial.begin(115200);
Serial.println("Adafruit LTR-329 advanced test");
// 检查WiFi固件版本
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
// 尝试连接到WiFi网络
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000); // 等待10秒
}
// 打印连接到的网络信息
Serial.print("You're connected to the network");
printCurrentNet();
printWifiData();
// 尝试连接到MQTT代理
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1); // 连接失败则停止执行
}
Serial.println("You are connected to MQTT");
// 检查WiFi模块通信
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
while (true); // 停止执行
}
// 初始化LTR-329传感器
if ( ! ltr.begin(&Wire1) ) {
Serial.println("Couldn't find LTR sensor!");
while (1) delay(10); // 未找到传感器则停止执行
}
Serial.println("Found LTR sensor!");
// 设置传感器的增益、积分时间和测量速率
ltr.setGain(LTR3XX_GAIN_2);
Serial.print("Gain : ");
switch (ltr.getGain()) {
case LTR3XX_GAIN_1: Serial.println(1); break;
case LTR3XX_GAIN_2: Serial.println(2); break;
case LTR3XX_GAIN_4: Serial.println(4); break;
case LTR3XX_GAIN_8: Serial.println(8); break;
case LTR3XX_GAIN_48: Serial.println(48); break;
case LTR3XX_GAIN_96: Serial.println(96); break;
}
ltr.setIntegrationTime(LTR3XX_INTEGTIME_100);
Serial.print("Integration Time (ms): ");
switch (ltr.getIntegrationTime()) {
case LTR3XX_INTEGTIME_50: Serial.println(50); break;
case LTR3XX_INTEGTIME_100: Serial.println(100); break;
case LTR3XX_INTEGTIME_150: Serial.println(150); break;
case LTR3XX_INTEGTIME_200: Serial.println(200); break;
case LTR3XX_INTEGTIME_250: Serial.println(250); break;
case LTR3XX_INTEGTIME_300: Serial.println(300); break;
case LTR3XX_INTEGTIME_350: Serial.println(350); break;
case LTR3XX_INTEGTIME_400: Serial.println(400); break;
}
ltr.setMeasurementRate(LTR3XX_MEASRATE_200);
Serial.print("Measurement Rate (ms): ");
switch (ltr.getMeasurementRate()) {
case LTR3XX_MEASRATE_50: Serial.println(50); break;
case LTR3XX_MEASRATE_100: Serial.println(100); break;
case LTR3XX_MEASRATE_200: Serial.println(200); break;
case LTR3XX_MEASRATE_500: Serial.println(500); break;
case LTR3XX_MEASRATE_1000: Serial.println(1000); break;
case LTR3XX_MEASRATE_2000: Serial.println(2000); break;
}
}
// 打印当前连接的网络信息
void printCurrentNet() {
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
byte bssid[6];
WiFi.BSSID(bssid);
Serial.print("BSSID: ");
printMacAddress(bssid);
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.println(rssi);
byte encryption = WiFi.encryptionType();
Serial.print("Encryption Type:");
Serial.println(encryption, HEX);
Serial.println();
}
// 打印MAC地址
void printMacAddress(byte mac[]) {
for (int i = 0; i < 6; i++) {
if (i > 0) {
Serial.print(":");
}
if (mac[i] < 16) {
Serial.print("0");
}
Serial.print(mac[i], HEX);
}
Serial.println();
}
// 打印WiFi数据
void printWifiData() {
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
byte mac[6];
WiFi.macAddress(mac);
Serial.print("MAC address: ");
printMacAddress(mac);
}
// 主循环
void loop() {
bool valid;
uint16_t visible_plus_ir, infrared;
if (ltr.newDataAvailable()) { // 检查是否有新数据
valid = ltr.readBothChannels(visible_plus_ir, infrared); // 读取可见光和红外数据
if (valid) { // 如果数据有效
dataObj["brightness"] = visible_plus_ir; // 设置JSON对象中的亮度值
dataObj["psData"] = infrared; // 设置JSON对象中的红外数据
String jsonString = JSON.stringify(dataObj); // 将JSON对象转换为字符串
mqttClient.beginMessage(command_topic); // 开始发送MQTT消息
mqttClient.print(jsonString); // 发送JSON字符串
mqttClient.endMessage(); // 结束消息发送
}
}
delay(500); // 等待500毫秒
}
代码解释:
引入库文件
Adafruit_LTR329_LTR303.h:用于与 LTR329 光传感器进行交互。
ArduinoMqttClient.h:用于实现 MQTT 通信。
WiFiS3.h和WiFiClient.h:用于连接 WiFi 网络。
Arduino_JSON.h:用于处理 JSON 数据。
定义变量和对象
char ssid[]和char pass[]:存储 WiFi 网络的名称和密码。
int status:用于存储 WiFi 连接状态。
const char broker[]和int port:MQTT 服务器的地址和端口。
const char command_topic[]:MQTT 的主题。
WiFiClient wifiClient和MqttClient mqttClient(wifiClient):创建 WiFi 客户端和 MQTT 客户端对象。
Adafruit_LTR329 ltr = Adafruit_LTR329():创建 LTR329 光传感器对象。
JSONVar dataObj:用于存储要发送的 JSON 数据。
setup 函数
初始化串口通信并打印提示信息。
检查 WiFi 固件版本,如果不是最新版本则提示升级。
尝试连接到指定的 WiFi 网络,直到连接成功。
连接 MQTT 服务器,如果连接失败则打印错误信息并进入死循环。
检查 WiFi 模块状态,如果通信失败则进入死循环。
初始化 LTR329 光传感器,如果找不到传感器则进入死循环。
设置光传感器的增益、积分时间和测量速率,并打印设置后的参数值。
printCurrentNet 函数
打印当前连接的 WiFi 网络的 SSID。
打印当前连接的路由器的 MAC 地址。
打印接收到的信号强度(RSSI)。
打印加密类型。
printMacAddress 函数
遍历传入的 MAC 地址数组,将每个字节转换为十六进制格式并打印,中间用冒号分隔。
printWifiData 函数
打印开发板的 IP 地址。
打印开发板的 MAC 地址,调用printMacAddress函数实现。
loop 函数
定义变量valid、visible_plus_ir和infrared。
如果光传感器有新数据可用,则读取两个通道的数据,并检查数据的有效性。
如果数据有效,将可见光加红外光强度和红外光数据存储到dataObj中,将其转换为 JSON 字符串,并通过 MQTT 客户端发送到指定主题。
延迟 500 毫秒。
三、实现效果:
|