【Follow me第二季第2期】5.进阶任务之 树莓派 HA+Windows+UR4 控制 RGB
[复制链接]
本帖最后由 我的学号 于 2024-10-14 01:32 编辑
本次活动的进阶必做任务为 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
限于实验条件任务进行并不顺畅,坛友们分享的经验帖无法直接复用;经过这几天的尝试和折腾,总算有了眉目
先介绍实验设备:
树莓派 3B
windows 10 系统
Arduino UR4 板卡+自己画的拓展板
折腾过程记录如下:
一.树莓派安装 HAOS
官网有教程:树莓派安装 HAOS
这里的限制条件是,缺少科学上网工具容易导致镜像下载失败,且镜像烧录后的工具下载安装也不一定成功
一番搜索,找到大佬分享的适用国人的 HAOS 镜像:冬瓜 Hasso, 前人栽树后人乘凉,在此表示感谢
下载好镜像文件,使用树莓派的官方工具 Raspberry Pi Imager 进行烧写,但插入树莓派3B 开机失败
后改用 ethcher 才成功,具体原因未知
树莓派提前接上网线和屏幕,开机信息闪过后,最终出现两个端口信息
以我的树莓派为例,198.162.1.104:8123 可用于连接操作,198.162.1.104:4357 可用于查看网络状况
如果缺少屏幕,可以在主机查看网络上其他设备,或者登录路由界面查看
二. 登录 HA,开启 MOTT 组件
许多坛友提到在主机浏览器输入地址 http://localhost:8123/ 可以打开 HA 界面,试了好几次都是失败
后边才留意到,小伙伴们是用 Docker 安装的 HA 系统,localhost 自然就是 主机下的IP 地址,所以能打开
如果HA 系统在别的机子上,自然要用该机器的IP;我的树莓派分配的地址是 198.162.1.104, 浏览器需要输入的地址就是 198.162.1.104:8123
输入这串地址有时会遇到目标拒绝访问的情况,输入 198.162.1.104:4357 又提示网络是健康的
这种情况就要借助万能的重启大法;多重启几次浏览器和树莓派,总有能登录上的时候
首次进入 HA 界面需要等待20min, 初次进入后引导界面默认next 即可
下一个麻烦是 EMQX 的安装
打开HASSO 系统的商店应用可以找到 EMQX 插件,理论上点击启用即可,实际又需要科学上网,启动失败
查找 EMQX 官网,发现其已经不支持Windows 系统的安装
好在互联网有记忆,在CSDN 上找到了大佬的调试记录:Windows 安装 EMQX
下载文件解压打开,在PowerShell 命令行下进入文件 /bin 目录,输入 ./emqx start 可启动代理
(输入 ./emqx stop 可关闭代理)
浏览器输入 192.168.1.106:18083 打开 EMQX 的图形界面
输入默认账号名 admin, 密码 public, 跳过密码设置
选择客户端认证, 最右侧选择 创建
选择 内置数据库模式,账号类型,加密方式,加盐方式默认即可
创建用户名,添加密码,设置为超级用户,用于后续 Arduino 访问
设置完成后回到集成概览提示连接数 1
回到 HA 系统,打开设备与服务
点击 添加集成,输入 MQTT, 点击选项,添加 MQTT
mosquitto 插件暂不知如何使用,选择手动输入代理
输入对应地址,端口,EMQX 设置的用户名和密码
这里又有个不一样的地方,按坛友们的分享应该输入EMQX 集群界面里的数字如 127.0.0.1,我试了,没成功
就这个小小问题卡了好几天;今天终于想明白, EMQX 所在机器的IP 应该是主机地址 192.168.1.106,添加,点击提交
设置成功!
回到EMQX, 提示有两个连接;MQTT 服务器和HA 的通道打通了
查找资料的过程发现针对 ESP8266/ESP32 系列有更好用的工具 ESPHOME,刚好HA 系统能Add-on; 具体怎么使用待研究
三.Arduino 程序编写
在 IDE 库管理里边搜索 并安装,该库针对与 HA 的通信做了封装,极大方便了开发者的使用
使用方法可以参考库例程,官方也有文档介绍 arduino-home-assistant
针对本次活动我画了一块 Arduino 拓展板,上边带有一颗共阳 RGB,参考例程里的 light 编写代码如下:
#include <WiFiS3.h>
#include <ArduinoHA.h>
#include "arduino_secrets.h"
#include "analogWave.h"
//RGB PIN 定义
#define LED_RGB_G D5
#define LED_RGB_R D6
#define LED_RGB_B D9
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS; // the WiFi radio's status
WiFiClient client;
HADevice device(MQTT_CLIENT_ID);
HAMqtt mqtt(client, device);
HALight light("MyRgbLight", HALight::RGBFeature);
byte u8RgbSwitch =0;
void setup()
{
//RGB 初始化
pinMode(LED_RGB_R, OUTPUT);
pinMode(LED_RGB_G, OUTPUT);
pinMode(LED_RGB_B, OUTPUT);
analogWrite(LED_RGB_R, 260);
analogWrite(LED_RGB_G, 260);
analogWrite(LED_RGB_B, 260);
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE)
{
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the data:
Serial.print("You're connected to the network");
device.setName("Arduino Ur4");
light.setName("Bathroom");
// handle light states
light.onStateCommand(onStateCommand);
light.onRGBColorCommand(onRGBColorCommand); // optional
Serial.println("\nStart connecting to MQTT server");
if (!mqtt.begin(MQTT_SERVER, MQTT_PORT, MQTT_USERNAME, MQTT_PASSWORD))
{
Serial.print("Connection falied");
Serial.print(mqtt.getState());
Serial.println("Try again in 5 seconds");
delay(5000);
}
}
void loop() {
// check the network connection once every 10 seconds:
mqtt.loop();
}
//RGB 相关函数
void onStateCommand(bool state, HALight* sender)
{
Serial.print("State: ");
Serial.println(state);
if(1 ==state) //RGB 开启
{
u8RgbSwitch =1;
}
else //RGB 关闭
{
u8RgbSwitch =0;
}
sender->setState(state); // report state back to the Home Assistant
}
void onBrightnessCommand(uint8_t brightness, HALight* sender)
{
Serial.print("Brightness: ");
Serial.println(brightness);
sender->setBrightness(brightness); // report brightness back to the Home Assistant
}
void onRGBColorCommand(HALight::RGBColor color, HALight* sender)
{
Serial.print("Red: ");
Serial.println(color.red);
Serial.print("Green: ");
Serial.println(color.green);
Serial.print("Blue: ");
Serial.println(color.blue);
if(1 ==u8RgbSwitch)
{
analogWrite(LED_RGB_R, (color.red*2));
analogWrite(LED_RGB_G, (color.green*2));
analogWrite(LED_RGB_B, (color.blue*2));
}
else
{
analogWrite(LED_RGB_R, 260);
analogWrite(LED_RGB_G, 260);
analogWrite(LED_RGB_B, 260);
}
sender->setRGBColor(color); // report color back to the Home Assistant
}
arduino_secrets.h 里记录了 wifi 密码/MQTT 设置:
编译无误后烧写到 UR4 中,如无意外,EMQX 可以看到新节点接入
回到HA 的概览,在概览 F5 刷新后出现控制目标
这里将RGB 命名为 bathroom, 点击其名可得展开
Arduino 程序里我定义了开关和色彩,不知为何还有亮度的设置
点击色彩可以对下发数据的 R G B 数据进行编辑,但有三个地方有疑问:
1.Arduino 收到的数据基本只有HA 下发数据的一半,如下发 0 255 255, Arduino 收到的数据是 0 130 130,因此送入 PWM 的数据都乘以2
2.显示色彩位置和下发数据并不一致,如 0 255 255, 应该为红色,显示却是青色
3.色温, 亮度如何和 PWM 数据联系起来?
最终表现结果如下所示:
RGB 演示
|