[Funpack3-5] UNO R4 WiFi矩阵灯接入智能平台
该项目使用了Arduino UNO R4 Wi-Fi,实现了物联网智能灯的设计,它的主要功能为:在智能平台上控制灯光亮度, 以操作Arduino UNO R4 Wi-Fi自带的LED矩阵点亮范围。
标签
Funpack活动
Arduino UNO R4
智能点灯
星露谷老农民
更新2025-01-13
271

项目介绍

本项目是Funpack第五期板卡三的任务1实现.

任务目标是让UNO R4 Wi-Fi通过网络连接到智能云端, 并模拟成一个可以控制的灯, 通过远程控制调整自带的LED矩阵点亮范围.

实现思路

将UNO R4作为灯装置接入IOT平台, 随后在IOT平台上下发命令来操作UNO R4, 调整这个"灯"的亮度.

这里我选择的是可以部署在内网环境下的Home Assistant.

UNO R4通过MQTT服务器与Home Assistant进行通信. MQTT服务器选择EMQX开源版.



服务器部署


本项目需要有一台服务器,并且在服务器上部署Home Assistant和EMQX两个服务.
本节简单介绍下两个服务的部署方式.

Home Assistant


Home Assistant官网上有较为详细的多种安装方式介绍.这里我选择的是使用Docker进行安装,可以忽略很多具体环境差异,只需要输入命令便可将Home Assistant跑起来.
具体介绍位于Install Home Assistant Container


docker run -d \
  --name homeassistant \
  --privileged \
  --restart=unless-stopped \
  -e TZ=MY_TIME_ZONE \
  -v /PATH_TO_YOUR_CONFIG:/config \
  -v /run/dbus:/run/dbus:ro \
  --network=host \
  ghcr.io/home-assistant/home-assistant:stable


命令执行完毕,打开使用服务器IP配合默认端口号8123->[http://<host>:8123](http://0.0.0.0:8123)即可进入主面板.

EMQX

EMQX同样可以使用Docker进行安装部署, 页面通过 Docker 运行 EMQX详细介绍了所需的命令.

运行以下命令获取 Docker 镜像:


docker pull emqx/emqx:5.8.1

运行以下命令启动 Docker 容器。


docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.8.1

HomeAssistant对接到EMQX

进入HomeAssistant主页后点击右下角设置,选择设备与服务, 搜索MQTT



安装好MQTT插件后,进入插件面板点击添加条目填写上一步配置的EMQX信息即可.

代码编写

注册到Home Assistant

publish 指定格式的payload到topic

其中topic格式为homeassistant/设备类型/自定义名称/config,根据格式要求.

得到主题应当为homeassistant/light/fun_matrix/config.

payload内容是一个描述设备的json字符串, 如下代码所示.

其中name是设备名称;

  • device_class要和注册topic中设备类型对应;
  • command_topic代表设备的开关状态;
  • brightness_command_topic灯的亮度控制
  • unique_id装置唯一ID
  • device设备描述
  • schema代表当前为json格式
  • brightness代表本装置支持亮度控制
void registerToHomeAssistantServer() {
  const char* topic = "homeassistant/light/fun_matrix/config";
  std::string message = R"({
    "name": "led",
    "device_class": "light",
    "command_topic": "fun_matrix/light/state",
    "brightness_command_topic": "fun_matrix/light/brightness/set",
    "unique_id": "fun_matrix",
    "device": {
        "identifiers": "fun_matrix",
        "name": "UnoR4WiFi"
    },
    "schema": "json",
    "brightness": true
}
)";
  bool retained = false;
  int qos = 1;
  bool dup = false;
  mqttClient.beginMessage(topic, message.length(), retained, qos, dup);
  mqttClient.print(message.c_str());
  mqttClient.endMessage();
}


响应HomeAssistant命令

根据注册时候payload中brightness_command_topic和command_topic, 来响应具体的动作即可.



void onMqttMessage(int messageSize) {
  // we received a message, print out the topic and contents
  //   Serial.println(mqttClient.messageTopic());
  // use the Stream interface to print the contents
  String topic = mqttClient.messageTopic();
  Serial.println(topic);
  String payload;
  while (mqttClient.available()) {
    // Serial.print((char)mqttClient.read());
    payload = mqttClient.readString();
    Serial.println(payload);
  }


  if (topic.endsWith("state")) {
    Serial.print("brightness_state_topic:");
    JsonDocument doc;
    DeserializationError error = deserializeJson(doc, payload);
    if (error) {
      Serial.print(F("deserializeJson() failed: "));
      Serial.println(error.f_str());
      return;
    }
    String state = doc["state"];
    if (state == "ON") {
      int brightness = doc["brightness"];
      Serial.print("brightness:");
      Serial.println(brightness);
      if (brightness == 0) {
        showFrame(level);
        return;
      }
      level = brightness / 25;
      showFrame(level);
    } else {
      showFrame(0);
    }
    return;
  }
}

功能展示

在网页上设置亮度, 均能够在设备上得到实时的响应.

不同的亮度,亮起的区域.(曝光时间问题,可能拍摄时候显示区域不全,实际显示是正常的)

心得体会

得益于Arduino开发的便利, 在活跃的社区帮助, 我们可以不用重复编写代码, 因此在很短的时间内编写出原型阶段代码. 迅速的验证各种想法.

而在部署各种服务时候, 使用Docker也可以大大简化部署难度, 实现开箱即用.

验证完毕后,就可以开始精简元件,专注于具体功能的实现和设计.



附件下载
funpack.zip
项目代码
团队介绍
路过的老农民,没有团队,只有沃兹基.
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号