368|2

439

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【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 演示

最新回复

多重启几次浏览器和树莓派,总有能登录上的时候,感觉这样启动有点麻烦   详情 回复 发表于 2024-10-15 07:27
点赞 关注
个人签名君应有语,渺万里层云,千山暮雪,知向谁边?
 
 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

多重启几次浏览器和树莓派,总有能登录上的时候,感觉这样启动有点麻烦

点评

可以用脚本实现自动重启,具体怎么实现需要找资料研究下  详情 回复 发表于 2024-10-15 10:47
 
 
 

回复

439

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
Jacktang 发表于 2024-10-15 07:27 多重启几次浏览器和树莓派,总有能登录上的时候,感觉这样启动有点麻烦

可以用脚本实现自动重启,具体怎么实现需要找资料研究下

个人签名君应有语,渺万里层云,千山暮雪,知向谁边?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表