【Follow me第二季第2期】5.进阶任务之 树莓派 HA+Windows+UR4 控制 RGB
本帖最后由 我的学号 于 2024-10-14 01:32 编辑<p>本次活动的进阶必做任务为 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)</p>
<p>限于实验条件任务进行并不顺畅,坛友们分享的经验帖无法直接复用;经过这几天的尝试和折腾,总算有了眉目</p>
<p>先介绍实验设备:</p>
<p>树莓派 3B</p>
<p>windows 10 系统</p>
<p>Arduino UR4 板卡+自己画的拓展板</p>
<p> </p>
<p>折腾过程记录如下:</p>
<p>一.树莓派安装 HAOS</p>
<p>官网有教程:<a href="https://www.home-assistant.io/installation/raspberrypi" target="_blank">树莓派安装 HAOS</a></p>
<p>这里的限制条件是,缺少科学上网工具容易导致镜像下载失败,且镜像烧录后的工具下载安装也不一定成功</p>
<p>一番搜索,找到大佬分享的适用国人的 HAOS 镜像:<a href="https://bbs.hassbian.com/thread-24065-1-1.html" target="_blank">冬瓜 Hasso</a>, 前人栽树后人乘凉,在此表示感谢</p>
<p>下载好镜像文件,使用树莓派的官方工具 Raspberry Pi Imager 进行烧写,但插入树莓派3B 开机失败</p>
<p>后改用 ethcher 才成功,具体原因未知</p>
<p>树莓派提前接上网线和屏幕,开机信息闪过后,最终出现两个端口信息</p>
<p>以我的树莓派为例,198.162.1.104:8123 可用于连接操作,198.162.1.104:4357 可用于查看网络状况</p>
<p>如果缺少屏幕,可以在主机查看网络上其他设备,或者登录路由界面查看</p>
<p> </p>
<p>二. 登录 HA,开启 MOTT 组件</p>
<p>许多坛友提到在主机浏览器输入地址 http://localhost:8123/ 可以打开 HA 界面,试了好几次都是失败</p>
<p>后边才留意到,小伙伴们是用 Docker 安装的 HA 系统,localhost 自然就是 主机下的IP 地址,所以能打开</p>
<p>如果HA 系统在别的机子上,自然要用该机器的IP;我的树莓派分配的地址是 198.162.1.104, 浏览器需要输入的地址就是 198.162.1.104:8123</p>
<p>输入这串地址有时会遇到目标拒绝访问的情况,输入 198.162.1.104:4357 又提示网络是健康的</p>
<p> </p>
<p>这种情况就要借助万能的重启大法;多重启几次浏览器和树莓派,总有能登录上的时候</p>
<p> </p>
<p>首次进入 HA 界面需要等待20min, 初次进入后引导界面默认next 即可</p>
<p> </p>
<p>下一个麻烦是 EMQX 的安装</p>
<p>打开HASSO 系统的商店应用可以找到 EMQX 插件,理论上点击启用即可,实际又需要科学上网,启动失败</p>
<p> </p>
<p>查找 EMQX 官网,发现其已经不支持Windows 系统的安装</p>
<p>好在互联网有记忆,在CSDN 上找到了大佬的调试记录:<a href="https://blog.csdn.net/qq_44290960/article/details/118150465" target="_blank">Windows 安装 EMQX</a></p>
<p>下载文件解压打开,在PowerShell 命令行下进入文件 /bin 目录,输入 ./emqx start 可启动代理</p>
<p>(输入 ./emqx stop 可关闭代理)</p>
<p> </p>
<p>浏览器输入 192.168.1.106:18083 打开 EMQX 的图形界面</p>
<p>输入默认账号名 admin, 密码 public, 跳过密码设置</p>
<p>选择客户端认证, 最右侧选择 创建</p>
<p> </p>
<p>选择 内置数据库模式,账号类型,加密方式,加盐方式默认即可</p>
<p>创建用户名,添加密码,设置为超级用户,用于后续 Arduino 访问</p>
<p> </p>
<p>设置完成后回到集成概览提示连接数 1</p>
<p>回到 HA 系统,打开设备与服务</p>
<p> </p>
<p>点击 添加集成,输入 MQTT, 点击选项,添加 MQTT</p>
<p> </p>
<p>mosquitto 插件暂不知如何使用,选择手动输入代理</p>
<p> </p>
<p>输入对应地址,端口,EMQX 设置的用户名和密码</p>
<p> </p>
<p>这里又有个不一样的地方,按坛友们的分享应该输入EMQX 集群界面里的数字如 127.0.0.1,我试了,没成功</p>
<p> </p>
<p>就这个小小问题卡了好几天;今天终于想明白, EMQX 所在机器的IP 应该是主机地址 192.168.1.106,添加,点击提交</p>
<p>设置成功!</p>
<p> </p>
<p>回到EMQX, 提示有两个连接;MQTT 服务器和HA 的通道打通了</p>
<p> </p>
<p>查找资料的过程发现针对 ESP8266/ESP32 系列有更好用的工具 ESPHOME,刚好HA 系统能Add-on; 具体怎么使用待研究</p>
<p> </p>
<p>三.Arduino 程序编写</p>
<p>在 IDE 库管理里边搜索 <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="https://github.com/dawidchyrzynski/arduino-home-assistant">arduino-home-assistant</a> 并安装,该库针对与 HA 的通信做了封装,极大方便了开发者的使用</p>
<p>使用方法可以参考库例程,官方也有文档介绍 <a href="https://dawidchyrzynski.github.io/arduino-home-assistant/documents/getting-started/examples.html" target="_blank">arduino-home-assistant</a></p>
<p>针对本次活动我画了一块 Arduino 拓展板,上边带有一颗共阳 RGB,参考例程里的 light 编写代码如下:</p>
<pre>
<code class="language-cpp">#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
}
</code></pre>
<p> </p>
<p>arduino_secrets.h 里记录了 wifi 密码/MQTT 设置:</p>
<p> </p>
<p>编译无误后烧写到 UR4 中,如无意外,EMQX 可以看到新节点接入</p>
<p> </p>
<p>回到HA 的概览,在概览 F5 刷新后出现控制目标</p>
<p> </p>
<p>这里将RGB 命名为 bathroom, 点击其名可得展开</p>
<p> </p>
<p>Arduino 程序里我定义了开关和色彩,不知为何还有亮度的设置</p>
<p>点击色彩可以对下发数据的 R G B 数据进行编辑,但有三个地方有疑问:</p>
<p>1.Arduino 收到的数据基本只有HA 下发数据的一半,如下发 0 255 255, Arduino 收到的数据是 0 130 130,因此送入 PWM 的数据都乘以2</p>
<p>2.显示色彩位置和下发数据并不一致,如 0 255 255, 应该为红色,显示却是青色</p>
<p>3.色温, 亮度如何和 PWM 数据联系起来?</p>
<p> </p>
<p> </p>
<p>最终表现结果如下所示:</p>
<p>3682e16a198306897f09b5d1acf96b25</p>
<p>多重启几次浏览器和树莓派,总有能登录上的时候,感觉这样启动有点麻烦</p>
Jacktang 发表于 2024-10-15 07:27
多重启几次浏览器和树莓派,总有能登录上的时候,感觉这样启动有点麻烦
<p>可以用脚本实现自动重启,具体怎么实现需要找资料研究下</p>
页:
[1]