- 2024-11-12
-
回复了主题帖:
嵌入式工程师AI挑战营(进阶):在RV1106部署InsightFace算法的多人实时人脸识别实战
【申请理由】本人专业为光学,主要从事光学器件和设备的开发和维护,熟练掌握和使用各种软硬件开发环境和嵌入式开发,具有丰富的实验仪器操控和数据采集经验。因此想要参与该挑战营活动,结合RV1106和InsightFace数据库,实现实验室多人实时人脸识别和人员流动监测,并通过MQTT协议将数据上传至EMQX平台,实现Home Assistant远程数据监测,为实验安全与人员流通状态的获取提供有力的支持。
【部署方案】InsightFace 是先进的深度人脸分析数据库,包括用于高质量人脸识别的解决方案和自定义程序 SDK 开发,并提供先进工具推动各个行业的创造力和创新发展。
硬件:使用NVIDIA系列GPU,因为InsightFace在GPU上的训练效率远高于CPU;
软件:Linux 操作系统,Python,数据库包括MXNet (InsightFace的原生框架) 、NumPy、OpenCV 等
数据:数据库收集:收集包含多个人脸图像的数据集。数据集应包含不同人的多张照片,以便进行训练和验证
数据处理:人脸对齐,使用 MTCNN 等工具对人脸进行对齐,确保每张人脸都处于相似的位置和大小。InsightFace 源码中包含 MTCNN 的实现,可以直接使用
数据转换:将处理后的数据转换为 InsightFace 所需的格式,包括 lst文件和 rec 文件。
模型训练:修改配置文件,训练命令执行
模型验证与测试:1.建立需要验证的目标集合;2.使用InsightFace 脚本对目标集进行验证;3.分析验证结果,对模型进行优化
应用:门禁系统、监控识别等,摄像头实时捕捉人脸信息,通过模型进行识别和身份验证。
【挑战计划】高性能 RV1106 Linux 开发板配合操作系统及数据库部署,结合外设摄像头实时采集人脸数据流,与目标人脸模型实时匹配,进行人脸识别和检测,配合门禁系统,实现人员流动控制;结合监控和报警系统,无人机等,对目标人物进行实时流动追踪。
- 2024-11-04
-
回复了主题帖:
【NUCLEO-WB09KE】开箱及开发环境测试
bigbat 发表于 2024-11-4 09:02
板子上有个跳线,设置到boot loader状态,我上面有图
我的跳线连着 USER FLASH ,后来更换了一根数据线,手机原装那种,端口就能识别了,Keil也能正常烧录程序,详见 【STM32WB09KE测评】简介、工程测试
- 2024-11-03
-
回复了主题帖:
【NUCLEO-WB09KE】开箱及开发环境测试
bigbat 发表于 2024-9-16 09:09
不知道为什么链接配对成功,但是windows中没有出现串口设备。我的windows是win10,蓝牙是4.0模块。是不是需 ...
我的怎么都识别不到设备,连接开发板之后端口根本没变化
- 2024-10-08
-
上传了资料:
Arduino Nano 通过 LabVIEW 和 DHT11 采集温湿度数据
- 2024-10-07
-
回复了主题帖:
Arduino Nano 和 DHT11 实现 LabVIEW 温湿度采集
Gen_X 发表于 2024-10-6 16:54
不错!
为什么不用WIFI直接传给LABVIEW ? 不是更能彰显ESP32的潜在功能。
好想法,我用 Arduino UNO R4 和 ESP32 试试 LabVIEW 远程调试
- 2024-10-05
-
发表了主题帖:
Arduino Nano 和 DHT11 实现 LabVIEW 温湿度采集
# Arduino Nano 和 DHT11 实现 LabVIEW 温湿度采集
Arduino IDE 安装如下库文件
**DHT sensor library** by Adafruit
DHT11 温湿度传感器 Data 引脚与 Arduino Nano 开发板的 D2 引脚连接
## 代码
```c++
#include
#define Temperature_COMMAND 0x10 //采集命令字
#define Humidity_COMMAND 0x11 //采集命令字
#define DHTPIN 2 // DHT sensor data GPIO
#define DHTTYPE DHT11 // select one kind of sensors from DHT11, DHT22 and DHT21
DHT dht(DHTPIN, DHTTYPE);
byte comdata[3]={0}; //定义数组数据,存放串口接收数据
void receive_data(void); //接受串口数据
void test_do_data(void); //测试串口数据是否正确,并更新数据
void setup()
{
Serial.begin(115200);
dht.begin();
}
void loop()
{
while (Serial.available() > 0) //不断检测串口是否有数据
{
receive_data(); //接受串口数据
test_do_data(); //测试数据是否正确并更新标志位
}
}
void receive_data(void)
{
int i ;
for(i=0;i
- 2024-10-04
-
回复了主题帖:
【Follow me第二季第2期】Arduino UNO R4 WiFi全部任务汇总学习+Labview+自己扩展项目
LabVIEW工程不错啊,要是能采集波形保存下来就好了。另外HomeAssistant镜像下载国内可以参考How to run Home Assistant Container on Windows using Docker - Kiril Peyanski's Blog
- 2024-09-29
-
加入了学习《【Follow me第二季第1期】全部任务演示》,观看 全部任务演示2.0
-
回复了主题帖:
【Follow me第二季第2期】DAC 生成正弦波
tangye 发表于 2024-9-29 10:20
这个DIY的示波器挺别致的
哈哈,当时手头没有示波器,所以做了个简易版
还是建议使用专业的示波器测试哈,这块板子的DAC输出还是很稳定的
- 2024-09-28
-
加入了学习《【Follow me第二季第2期】》,观看 【Follow me第二季第2期】
-
发表了主题帖:
【Follow me第二季第2期】任务汇总
本帖最后由 lijinlei 于 2024-9-29 14:43 编辑
# 【Follow me第二季第2期】任务汇总
非常荣幸参加 EEWorld 和 DigiKey 联合举办的[【Follow me 第二季第 2 期】](https://www.eeworld.com.cn/huodong/digikey_follow_me_2024_02/)活动,从8月26号收到物料到9月28号完成所有任务,经过一个多月的学习、思考和实践,我对这块开发板和物联网有了更深刻的理解,也在微信群里结交了很多志同道合的朋友,感谢大家的支持和帮助,感谢工作人员对参与者的大力支持。
下面我将此次活动的任务完成情况进行汇总和报告。
所有任务已在 `DigiKey得捷技术专区` 板块分别发表 `作品展示` 帖,链接如下
1. [【Follow me第二季第2期】入门环境搭建、闪灯和串口发送](https://bbs.eeworld.com.cn/thread-1291974-1-1.html) ;
2. [【Follow me第二季第2期】驱动 12*8 点阵 LED 实现图像和文字显示](https://bbs.eeworld.com.cn/thread-1294041-1-1.html) ;
3. [【Follow me第二季第2期】DAC 生成正弦波](https://bbs.eeworld.com.cn/thread-1294043-1-1.html) ;
4. [【Follow me第二季第2期】OPAMP 放大 DAC 信号](https://bbs.eeworld.com.cn/thread-1294045-1-1.html) ;
5. [【Follow me第二季第2期】ADC 采集 OPAMP 放大 DAC 信号并串口显示波形](https://bbs.eeworld.com.cn/thread-1294047-1-1.html) ;
6. [【Follow me第二季第2期】开发板通过 MQTT 协议接入 Home Assistant](https://bbs.eeworld.com.cn/thread-1294801-1-1.html) ;
7. [【Follow me第二季第2期】SHT40温湿度模块获取环境数据 ](https://bbs.eeworld.com.cn/thread-1293824-1-1.html) ;
8. [【Follow me第二季第2期】开发板读取 SHT40 数据并上传至 Home Assistant](https://bbs.eeworld.com.cn/thread-1294905-1-1.html) .
视频录制见:[【Follow me第二季第2期】-【Follow me第二季第2期】-EEWORLD大学堂](https://training.eeworld.com.cn/video/41097) .
代码工程见:[【Follow me第二季第2期】所有任务的工程源码](https://download.eeworld.com.cn/detail/lijinlei/634523) .
## 项目演示视频
[localvideo]a1db30d45bfe93d8652159782870acdb[/localvideo]
视频节点索引如下,
**入门任务:01:24**
**基础任务:02:12**
**进阶任务:06:32**
**扩展任务:12:39**
## 硬件物料
Arduino UNO R4 WiFi 开发板 x1
![img](https://bbs.eeworld.com.cn/data/attachment/forum/202408/29/183559u05fwvth00h4u0wn.jpg.thumb.jpg)
SHT40 温湿度传感器模块 x1
## 任务成果展示
### 入门任务:搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
对应论坛贴:[【Follow me第二季第2期】入门环境搭建、闪灯和串口发送](https://bbs.eeworld.com.cn/thread-1291974-1-1.html) https://bbs.eeworld.com.cn/thread-1291974-1-1.html
#### 环境搭建
1.官网下载并安装最新版 Arduino IDE: [Software | Arduino](https://www.arduino.cc/en/software) .
![img](https://bbs.eeworld.com.cn/data/attachment/forum/202408/29/183819hriwjvdi5d50ir05.jpg.thumb.jpg)
2.运行软件,**开发板管理** 搜索 `R4` 并安装最新版程序扩展包
#### 1. 闪灯 Blink
所需板载元件:绿色LED
打开开发板示例程序,并下载程序即可
![img](https://bbs.eeworld.com.cn/data/attachment/forum/202408/29/184048fdk7v2vgjj777pj2.jpg)
##### 代码
```c++
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(500); // wait for a second
}
```
##### 演示
[localvideo]330c7dc71bc4a9c9ae41c6666d2c6646[/localvideo]
#### 2. 串口通信
所用板载元件:串口通信接口,即Type-C接口和数据线
##### 代码
```c++
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("Hello EEWorld!");
delay(500);
}
```
##### 演示
[localvideo]b18c60da783db476e373962f1dbfecde[/localvideo]
### 基础任务一:驱动12x8点阵LED
对应论坛贴:[【Follow me第二季第2期】驱动 12*8 点阵 LED 实现图像和文字显示](https://bbs.eeworld.com.cn/thread-1294041-1-1.html) https://bbs.eeworld.com.cn/thread-1294041-1-1.html
所需板载元件:12*8点阵LED
通过 [LED 矩阵工具](https://ledmatrix-editor.arduino.cc/) 定义点阵 LED 并实现心形图案的显示,并点击按钮 `` 下载相应的 `*.h` 文件。
#### 流程图
#### 代码
```c++
#include "Arduino_LED_Matrix.h" // Include the LED_Matrix library
//#include "frames.h" // Include a header file containing some custom icons
const uint32_t heart[] = {
0x3184a444,
0x44042081,
0x100a0040
};
ArduinoLEDMatrix matrix; // Create an instance of the ArduinoLEDMatrix class
void setup() {
Serial.begin(115200); // Initialize serial communication at a baud rate of 115200
matrix.begin(); // Initialize the LED matrix
}
void loop() {
matrix.loadFrame(heart);
delay(500);
// Turn off the display
matrix.clear();
delay(1000);
// Print the current value of millis() to the serial monitor
Serial.println(millis());
}
```
#### 演示
[localvideo]f7d01c6b9782bfa5aa5bc26b10e4cce3[/localvideo]
### 基础任务二:用DAC生成正弦波
对应论坛贴:[【Follow me第二季第2期】DAC 生成正弦波](https://bbs.eeworld.com.cn/thread-1294043-1-1.html) https://bbs.eeworld.com.cn/thread-1294043-1-1.html
所需器件:板载 `A0` 接口产生 DAC 信号、示波器一台、BNC 信号测试线一条、公对公杜邦线两根
#### 流程图
#### 代码
```c++
#include "analogWave.h" // Include the library for analog waveform generation
analogWave wave(DAC); // Create an instance of the analogWave class, using the DAC pin
int freq = 3; // in hertz, change accordingly
void setup() {
wave.sine(freq); // Generate a sine wave with the initial frequency.
// Generate square and saw wave
//wave.square(freq);
//wave.saw(freq);
wave.amplitude(0.7); // set amplitude ratio [0.0,1.0]
}
void loop() {
}
```
#### 演示
[localvideo]5a0255e01353cd7051356cea4d0def9c[/localvideo]
### 基础任务三:用OPAMP放大DAC信号
对应论坛贴:[【Follow me第二季第2期】OPAMP 放大 DAC 信号](https://bbs.eeworld.com.cn/thread-1294045-1-1.html) https://bbs.eeworld.com.cn/thread-1294045-1-1.html
**所需元件**:板载 `A0` 、`A1`、`A2`、`A3` 引脚接口、杜邦线若干、面包板一块、10kΩ 色环电阻两只、示波器一台、BNC 信号测试线两根
在 `minus` 和 GND 之间连接一个电阻。然后使用第二个电阻将 output 和 `minus` 连接在一起。此时在 `plus` 处输入的任何信号都将在输出引脚处以两倍振幅显示。输入信号和 Arduino 板应该共享相同的电阻和 GND .
若要将电压信号放大 4 倍,则需考虑运算放大器的放大率,主要取决于所选的电阻值。
电路接线如下图所示
#### 流程图
#### 代码
```c++
#include
#include "analogWave.h" // Include the library for analog waveform generation
analogWave wave(DAC);
int freq = 3;
void setup () {
// activate OPAMP, default channel 0
// Plus: Analog A1
// Minus: Analog A2
// Output: Analog A3
OPAMP.begin();
wave.sine(freq);
wave.amplitude(0.3);
}
void loop() {
}
```
#### 演示
[localvideo]6e75febea400c6eaaf2ef07411d28269[/localvideo]
### 基础任务四:用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
对应论坛贴:[【Follow me第二季第2期】ADC 采集 OPAMP 放大 DAC 信号并串口显示波形](https://bbs.eeworld.com.cn/thread-1294047-1-1.html) https://bbs.eeworld.com.cn/thread-1294047-1-1.html
**所需元件**:板载 `A0` 、`A1`、`A2`、`A3` 、`A4`、`A5` 引脚接口、杜邦线若干、面包板一块、10kΩ 色环电阻两只、示波器一台、BNC 信号测试线两根
结合 DAC 输出正弦波信号、OPAMP 放大 DAC 信号的相关内容,通过开发板 ADC 读取和转换模拟量为数字参量,通过 Arduino IDE 的图形串口工具上位机同时显示 OPAMP 放大前后的 DAC 信号波形。
实物连线如下图所示
#### 流程图
#### 代码
```c++
#include
#include "analogWave.h" // Include the library for analog waveform generation
analogWave wave(DAC);
int freq = 100;
void setup () {
Serial.begin(250000);
analogReadResolution(14);
wave.sine(freq);
wave.amplitude(0.5);
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
void loop() {
Serial.print(analogRead(A4)); // DAC output
Serial.print(" ");
Serial.println(analogRead(A5)); // OPAMP output
}
```
#### 演示
[localvideo]ab6e4073caafc0617d79d3e83ea49270[/localvideo]
### 进阶任务:通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(Home Assistant)
对应论坛贴:[【Follow me第二季第2期】开发板通过 MQTT 协议接入 Home Assistant](https://bbs.eeworld.com.cn/thread-1294801-1-1.html) https://bbs.eeworld.com.cn/thread-1294801-1-1.html
所需元件:Arduino UNO R4 WiFi 开发板、type-c 数据线一根
#### 部署 HA 环境
根据任务要求,完成环境搭建和开发板接入。具体包括
1. Docker 安装(Linux系统环境)
2. HomeAssistant安装
3. EMQX服务器安装
4. MQTT协议连接
5. 开发板连接
使用 [Docker](https://www.docker.com/) 容器安装 [Home Assistant](https://www.home-assistant.io/) ,
1. 下载 [Docker](https://www.docker.com/) 软件;
2. C 盘根目录新建文件夹 `homeassistant` ;
3. 下载部署文件 [GitHub](https://gist.github.com/peyanski/4d803963e890955886d40ae00d1cfb90) 或 [github](https://github.com/h2457528767/HomeAssistant/blob/main/docker-compose.yml) 并解压得到 `docker-compose.yml` 保存至上述 `homeassistant` 文件夹;
4. Windows 打开 `命令提示符` 或 `Windows PowerShell`,输入如下代码实现自动下载镜像
```powershell
cd C:\homeassistant
docker-compose.yml
docker-compose up
```
5. 安装过程需大约 30 分钟,即可在 Docker 容器中创建 Home Assistant 镜像;
5. 自动从镜像安装 Home Assistant 到容器
该代码 `docker-compose.yml` 将映射 Home Assistant 配置文件到 `C:/homeassistant` 文件夹;
5. 浏览器输入网址 `http://localhost:8123/` 进入Home Assistant 主界面,创建智能家居账号。
8. 安装 EMQX 服务器
Windows 命令行或 PowerShell 输入并执行如下代码
```powershell
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
```
等待进度条下载和部署完成(大约5分钟),即可获得 EMQX 服务器。
9. 配置 EMQX
(1)浏览器打开网址 `http://localhost:18083/` ,初始登录账户名 `admin` 密码 `public` ;
(2)依次打开 `访问控制` - `客户端认证` - `创建` - `Password-Based` - `内置数据库` - (默认配置)- `创建` ;
(3)`用户管理` - `新建用户` - 自定义用户名和密码 .
10. 连接 EMQX 与 HA
(1)命令行或 PowerShell 输入 `ipconfig` 获取本地计算机 IPv4 地址,如 `42.34.25.153`
(2)配置 Home Assistant ,依次点击设置 - 设备与服务 - 添加集成 - 搜索 MQTT - 填写代理信息。
> 代理栏输入计算机 IP 地址,端口 1883,用户名和密码为 EMQX 中创建的用户信息。
(3)点击 `提交` 后显示 `成功创建 MQTT` ,此时 `集成` 选项下出现 `MQTT` 条目,EMQX 网页 `集群` 的 `总连接数` 和 `在线连接数` 由 `0` 变为 `1`,表明 MQTT 设备已连接。
#### 流程图
#### 代码
```c++
/*
https://bbs.eeworld.com.cn/thread-1293010-1-1.html
*/
#include
#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
#include
#elif defined(ARDUINO_SAMD_MKR1000)
#include
#elif defined(ARDUINO_ARCH_ESP8266)
#include
#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)
#include
#elif defined(ARDUINO_PORTENTA_C33)
#include
#elif defined(ARDUINO_UNOR4_WIFI)
#include
#endif
#include "arduino_secrets.h"
///////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)
// To connect with SSL/TLS:
// 1) Change WiFiClient to WiFiSSLClient.
// 2) Change port value from 1883 to 8883.
// 3) Change broker value to a server with a known SSL/TLS root certificate
// flashed in the WiFi module.
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "49.52.23.140";
int port = 1883;
const char topic[] = "UNOR4/Send";
const long interval = 1000;
unsigned long previousMillis = 0;
int count = 0;
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// attempt to connect to WiFi network:
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println("You're connected to the network");
Serial.println();
Serial.println(WiFi.localIP());
// You can provide a unique client ID, if not set the library uses Arduino-millis()
// Each client must have a unique client ID
// mqttClient.setId("clientId");
// You can provide a username and password for authentication
mqttClient.setUsernamePassword("UNOR4", "123456");
Serial.print("Attempting to connect to the MQTT broker: ");
Serial.println(broker);
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1);
}
Serial.println("You're connected to the MQTT broker!");
Serial.println();
}
void loop() {
// call poll() regularly to allow the library to send MQTT keep alives which
// avoids being disconnected by the broker
mqttClient.poll();
// to avoid having delays in loop, we'll use the strategy from BlinkWithoutDelay
// see: File -> Examples -> 02.Digital -> BlinkWithoutDelay for more info
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time a message was sent
previousMillis = currentMillis;
Serial.print("Sending message to topic: ");
Serial.println(topic);
Serial.print("temperature: ");
Serial.println(count);
Serial.print("humidity: ");
Serial.println(count);
// send message, the Print interface can be used to set the message contents
mqttClient.beginMessage(topic);
mqttClient.print("Temperature: ");
mqttClient.print(count);
mqttClient.print("Humidity: ");
mqttClient.print(count);
mqttClient.endMessage();
Serial.println();
count++;
}
}
```
#### 演示
将发送的信息显示到 Home Assistant 智能家居平台,依次选择
`设置` - `设备与服务` - `MQTT` - `配置` - `监听主题` - 输入`主题` 名称 - 点击 `开始监听`,
便可接收信息,如下图所示
### 扩展任务:通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据
对应论坛贴:[【Follow me第二季第2期】开发板读取 SHT40 数据并上传至 Home Assistant](https://bbs.eeworld.com.cn/thread-1294905-1-1.html) https://bbs.eeworld.com.cn/thread-1294905-1-1.html
**所需元件**:Arduino UNO R4 WiFi 开发板、SHT40 温湿度传感器模块一个、Type-C 数据线一根
SHT40 温湿度传感器模块测试详见论坛帖:[【Follow me第二季第2期】SHT40温湿度模块获取环境数据 ](https://bbs.eeworld.com.cn/thread-1293824-1-1.html) .
#### 流程图
#### 代码
```c++
#include
#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
#include
#elif defined(ARDUINO_SAMD_MKR1000)
#include
#elif defined(ARDUINO_ARCH_ESP8266)
#include
#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)
#include
#elif defined(ARDUINO_PORTENTA_C33)
#include
#elif defined(ARDUINO_UNOR4_WIFI)
#include
#endif
#include "Adafruit_SHT4x.h"
#include "arduino_secrets.h"
//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)
// To connect with SSL/TLS:
// 1) Change WiFiClient to WiFiSSLClient.
// 2) Change port value from 1883 to 8883.
// 3) Change broker value to a server with a known SSL/TLS root certificate
// flashed in the WiFi module.
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "49.52.23.140"; // IP address
int port = 1883; // port
const char topic[] = "UNOR4/Send"; // MQTT topic
const long interval = 1000;
unsigned long previousMillis = 0;
int count = 0;
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
float temperature_date,humidity_date;
sensors_event_t humidity, temp;
static TwoWire& SHT_I2C_INTERFACE = Wire1; // Wire1 is the QWIIC port of Uno R4 board
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("SHT40 test");
if (! sht4.begin(&SHT_I2C_INTERFACE)) {
Serial.println("Couldn't find SHT40");
while (1) delay(1);
}
Serial.println("Found SHT40 sensor");
Serial.print("Serial number 0x");
Serial.println(sht4.readSerial(), HEX);
// You can have 3 different precisions, higher precision takes longer
sht4.setPrecision(SHT4X_HIGH_PRECISION);
switch (sht4.getPrecision()) {
case SHT4X_HIGH_PRECISION:
Serial.println("High precision");
break;
case SHT4X_MED_PRECISION:
Serial.println("Med precision");
break;
case SHT4X_LOW_PRECISION:
Serial.println("Low precision");
break;
}
// You can have 6 different heater settings
// higher heat and longer times uses more power
// and reads will take longer too!
sht4.setHeater(SHT4X_NO_HEATER);
switch (sht4.getHeater()) {
case SHT4X_NO_HEATER:
Serial.println("No heater");
break;
case SHT4X_HIGH_HEATER_1S:
Serial.println("High heat for 1 second");
break;
case SHT4X_HIGH_HEATER_100MS:
Serial.println("High heat for 0.1 second");
break;
case SHT4X_MED_HEATER_1S:
Serial.println("Medium heat for 1 second");
break;
case SHT4X_MED_HEATER_100MS:
Serial.println("Medium heat for 0.1 second");
break;
case SHT4X_LOW_HEATER_1S:
Serial.println("Low heat for 1 second");
break;
case SHT4X_LOW_HEATER_100MS:
Serial.println("Low heat for 0.1 second");
break;
}
// attempt to connect to WiFi network:
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println("You're connected to the network");
Serial.println();
Serial.println(WiFi.localIP());
// You can provide a unique client ID, if not set the library uses Arduino-millis()
// Each client must have a unique client ID
// mqttClient.setId("clientId");
// You can provide a username and password for authentication
mqttClient.setUsernamePassword("UNOR4", "123456");
Serial.print("Attempting to connect to the MQTT broker: ");
Serial.println(broker);
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1);
}
Serial.println("You're connected to the MQTT broker!");
Serial.println();
}
void loop() {
// call poll() regularly to allow the library to send MQTT keep alives which
// avoids being disconnected by the broker
mqttClient.poll();
// to avoid having delays in loop, we'll use the strategy from BlinkWithoutDelay
// see: File -> Examples -> 02.Digital -> BlinkWithoutDelay for more info
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time a message was sent
previousMillis = currentMillis;
Serial.print("Sending message to topic: ");
Serial.println(topic);
// Serial.print("temperature:");
// Serial.println(temperature_date);
// Serial.print("humidity: ");
// Serial.println(humidity_date);
uint32_t timestamp = millis();
sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
timestamp = millis() - timestamp;
Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
Serial.print("Read duration (ms): ");
Serial.println(timestamp);
temperature_date=temp.temperature;
humidity_date=humidity.relative_humidity;
// send message, the Print interface can be used to set the message contents
mqttClient.beginMessage(topic);
mqttClient.println("{");
mqttClient.print(" \"temperature\":");
mqttClient.print(temperature_date);
mqttClient.println(",");
mqttClient.print(" \"humidity\":");
mqttClient.println(humidity_date);
mqttClient.print("}");
mqttClient.endMessage();
Serial.println();
count+=0.01;
}
}
```
#### MQTT 配置信息
前面测试程序中发送的是温度和湿度数据,因此需要在 Home Assistant 中增加传感器信息。
```json
# Example configuration.yaml entry
mqtt:
sensor:
- name: "Temperature"
state_topic: "UNOR4/Send"
suggested_display_precision: 1
unit_of_measurement: "°C"
value_template: "{{ value_json.temperature }}"
- name: "Humidity"
state_topic: "UNOR4/Send"
unit_of_measurement: "%"
value_template: "{{ value_json.humidity }}"
```
#### 演示
[localvideo]59565787a81a5b1b2d307fcdd8f0b5e7[/localvideo]
## 项目源码
视频录制见:[【Follow me第二季第2期】-【Follow me第二季第2期】-EEWORLD大学堂](https://training.eeworld.com.cn/video/41097) https://training.eeworld.com.cn/video/41097
代码工程见:[【Follow me第二季第2期】所有任务的工程源码](https://download.eeworld.com.cn/detail/lijinlei/634523) https://download.eeworld.com.cn/detail/lijinlei/634523
## 项目总结
再次感谢微信群友们的无私帮助,在大佬们的聊天对话中学到很多专业知识,开拓了视野,特别是进阶任务和扩展任务的学习,不断解决问题并最终实现目标。
HomeAssistant 的镜像下载安装、开发板和 HA 的连接等经历,极大地丰富了我对物联网的认知,也感受到自己的渺小。
在阅读手册和访问官网链接等操作时明显感受到自身基础知识的匮乏,同时也激发了不断深入学习嵌入式开发的热情。
希望该活动越办越好,也希望越来越多的电子爱好者关注和参与 Follow me 活动,共同学习、分享和成长,用科技创造美好未来。
-
上传了资料:
【Follow me第二季第2期】所有任务的工程源码
- 2024-09-26
-
发表了主题帖:
【Follow me第二季第2期】开发板读取 SHT40 数据并上传至 Home Assistant
# 【Follow me第二季第2期】开发板读取 SHT40 数据并上传至 Home Assistant
本章节的任务是开发板读取SHT40传感器数据并通过MQTT协议上传至EMQX服务器并在 HA 显示数据曲线
## 一、简介
### 1. HA 配置文件
`configuration.yaml`
通过配置该文件对 HA 指定任务,HA 则根据该文件调用组件并实现目标。
该文件的设定修改步骤如下:
1. [设置文件访问权限](https://www.home-assistant.io/docs/configuration/#to-set-up-access-to-the-files-and-prepare-an-editor)
2. [找到 config 目录](https://www.home-assistant.io/docs/configuration/#to-find-the-configuration-directory)
3. 编辑 `configuration.yaml`
4. 保存更改并[重新加载配置](https://www.home-assistant.io/docs/configuration/#reloading-the-configuration-to-apply-changes)以应用更改
详见:[Configuration.yaml - Home Assistant (home-assistant.io)](https://www.home-assistant.io/docs/configuration/) .
### 2. MQTT JSON
[JSON](https://www.json.org/json-zh.html), ( JavaScript Object Notation ), 是一种轻量级数据交换格式,如下
```json
{
"some_arbitrary_key_name": "value"
}
```
详见:[MQTT JSON - Home Assistant (home-assistant.io)](https://www.home-assistant.io/integrations/mqtt_json/) .
## 二、方案
### 1. 流程
将前面介绍的 SHT40 温湿度传感器的串口输出相关代码与开发板通过 MQTT 协议连接至 Home Assistant 平台的代码相结合,具体流程如下
1. 开发板读取 SHT40 传感器采集的环境温湿度数据
2. 数据通过 MQTT 协议上传至 EMQX 服务器
3. HA 平台订阅主题、读取数据并将其转化至可视化面板显示出来,并实现历史曲线的观测和记录。
### 2. 代码
```
#include
#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
#include
#elif defined(ARDUINO_SAMD_MKR1000)
#include
#elif defined(ARDUINO_ARCH_ESP8266)
#include
#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)
#include
#elif defined(ARDUINO_PORTENTA_C33)
#include
#elif defined(ARDUINO_UNOR4_WIFI)
#include
#endif
#include "Adafruit_SHT4x.h"
#include "arduino_secrets.h"
//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)
// To connect with SSL/TLS:
// 1) Change WiFiClient to WiFiSSLClient.
// 2) Change port value from 1883 to 8883.
// 3) Change broker value to a server with a known SSL/TLS root certificate
// flashed in the WiFi module.
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "49.52.23.140"; // IP address
int port = 1883; // port
const char topic[] = "UNOR4/Send"; // MQTT topic
const long interval = 1000;
unsigned long previousMillis = 0;
int count = 0;
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
float temperature_date,humidity_date;
sensors_event_t humidity, temp;
static TwoWire& SHT_I2C_INTERFACE = Wire1; // Wire1 is the QWIIC port of Uno R4 board
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("SHT40 test");
if (! sht4.begin(&SHT_I2C_INTERFACE)) {
Serial.println("Couldn't find SHT40");
while (1) delay(1);
}
Serial.println("Found SHT40 sensor");
Serial.print("Serial number 0x");
Serial.println(sht4.readSerial(), HEX);
// You can have 3 different precisions, higher precision takes longer
sht4.setPrecision(SHT4X_HIGH_PRECISION);
switch (sht4.getPrecision()) {
case SHT4X_HIGH_PRECISION:
Serial.println("High precision");
break;
case SHT4X_MED_PRECISION:
Serial.println("Med precision");
break;
case SHT4X_LOW_PRECISION:
Serial.println("Low precision");
break;
}
// You can have 6 different heater settings
// higher heat and longer times uses more power
// and reads will take longer too!
sht4.setHeater(SHT4X_NO_HEATER);
switch (sht4.getHeater()) {
case SHT4X_NO_HEATER:
Serial.println("No heater");
break;
case SHT4X_HIGH_HEATER_1S:
Serial.println("High heat for 1 second");
break;
case SHT4X_HIGH_HEATER_100MS:
Serial.println("High heat for 0.1 second");
break;
case SHT4X_MED_HEATER_1S:
Serial.println("Medium heat for 1 second");
break;
case SHT4X_MED_HEATER_100MS:
Serial.println("Medium heat for 0.1 second");
break;
case SHT4X_LOW_HEATER_1S:
Serial.println("Low heat for 1 second");
break;
case SHT4X_LOW_HEATER_100MS:
Serial.println("Low heat for 0.1 second");
break;
}
// attempt to connect to WiFi network:
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println("You're connected to the network");
Serial.println();
Serial.println(WiFi.localIP());
// You can provide a unique client ID, if not set the library uses Arduino-millis()
// Each client must have a unique client ID
// mqttClient.setId("clientId");
// You can provide a username and password for authentication
mqttClient.setUsernamePassword("UNOR4", "123456");
Serial.print("Attempting to connect to the MQTT broker: ");
Serial.println(broker);
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1);
}
Serial.println("You're connected to the MQTT broker!");
Serial.println();
}
void loop() {
// call poll() regularly to allow the library to send MQTT keep alives which
// avoids being disconnected by the broker
mqttClient.poll();
// to avoid having delays in loop, we'll use the strategy from BlinkWithoutDelay
// see: File -> Examples -> 02.Digital -> BlinkWithoutDelay for more info
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time a message was sent
previousMillis = currentMillis;
Serial.print("Sending message to topic: ");
Serial.println(topic);
// Serial.print("temperature:");
// Serial.println(temperature_date);
// Serial.print("humidity: ");
// Serial.println(humidity_date);
uint32_t timestamp = millis();
sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
timestamp = millis() - timestamp;
Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
Serial.print("Read duration (ms): ");
Serial.println(timestamp);
temperature_date=temp.temperature;
humidity_date=humidity.relative_humidity;
// send message, the Print interface can be used to set the message contents
mqttClient.beginMessage(topic);
mqttClient.println("{");
mqttClient.print(" \"temperature\":");
mqttClient.print(temperature_date);
mqttClient.println(",");
mqttClient.print(" \"humidity\":");
mqttClient.println(humidity_date);
mqttClient.print("}");
mqttClient.endMessage();
Serial.println();
count+=0.01;
}
}
```
串口输出情况如下
MQTTX 客户端输出效果如下
下面考虑如何将该数据显示在 HA 面板。
### 3. MQTT 配置信息
前面测试程序中发送的是温度和湿度数据,因此需要在 Home Assistant 中增加传感器信息。
```json
# Example configuration.yaml entry
mqtt:
sensor:
- name: "Temperature"
state_topic: "UNOR4/Send"
suggested_display_precision: 1
unit_of_measurement: "°C"
value_template: "{{ value_json.temperature }}"
- name: "Humidity"
state_topic: "UNOR4/Send"
unit_of_measurement: "%"
value_template: "{{ value_json.humidity }}"
```
参考: [MQTT Sensor - Home Assistant (home-assistant.io)](https://www.home-assistant.io/integrations/sensor.mqtt/) .
注意这里 HA 官方说明文档中给出的例程,其中开发板上传的数据格式为 JSON 格式,我们的输出结果与例程的格式一致,因此将例程中对应的 HA 配置代码添加至 `configuration.yaml` 文件并修改订阅主题即可。
### 4. 效果
在 `设置` 中重新加载 `YAML 配置` 即可显示传感器面板及温湿度数据,如下图所示
点击 `Humidity` 和 `Temperature` 即可显示历史曲线,鼠标指针可以显示每个时刻的具体数据
此外,还可以将数据联系至仪表表盘,实现 UI 界面优化,使产品设计更加人性化。
#### 视频展示
[localvideo]535f4da16daa3c2104f6c1c5d9e4bac1[/localvideo]
-
加入了学习《【Follow me第二季第2期】+开发板硬件介绍和实现任务一 LED灯闪烁和串口打印》,观看 【Follow me第二季第2期】+通过外部SHT40温湿度传感器,上传温湿度到HA
-
发表了主题帖:
【Follow me第二季第2期】开发板通过 MQTT 协议接入 Home Assistant
# 【Follow me第二季第2期】开发板通过 MQTT 协议接入 Home Assistant
根据任务要求,完成环境搭建和开发板接入。具体包括
1. Docker 安装(Linux系统环境)
2. HomeAssistant安装
3. EMQX服务器安装
4. MQTT协议连接
5. 开发板连接
## 一、简介
介绍本任务使用的平台和协议,包括 MQTT协议、EMQX服务器、HomeAssistant.
### 1. MQTT
**[MQTT](https://www.emqx.com/zh/blog/the-easiest-guide-to-getting-started-with-mqtt)**(Message Queuing Telemetry Transport)即消息队列遥测传输协议,是一种基于 `publish/subscribe` (发布/订阅) 模式的 **轻量级** 通讯协议,适用于资源受限的设备下使用,特别是嵌入式领域。该协议构建于 **TCP/IP** 协议上,由 IBM 在1999年发布。
MQTT 最大优点在于,**用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务** 。
#### MQTT 工作流程
1. 客户端建立连接
2. 客户端发布消息,或订阅主题以接收消息
3. MQTT Broker 接收发布的信息
在本项目中,Arduino UNO R4 WiFi 开发板是发布者(Publisher),主题是温湿度传感器(Sensor),子级别是温度(Temperature)和湿度(Humidity),接收者为 HomeAssistant .
#### 其他
QoS (Quality of Service levels) 即服务质量级别,一般设置为 0 ,等级越高,传输越复杂。
##### MQTT 数据包结构
**固定头 Eixed header** 包含消息类型 message type,标识位 DUP,QoS Level,RET,剩余长度 remain length .
**可变头 Variable header**
**消息体 Payload**
包括 CONNECT, SUBSCRIBE, SUBACK, UNSUBSCRIBE 四种类型
- `CONNECT`,消息体内容主要包括:客户端 ClientID、订阅 Topic、Message、用户名和密码
- `SUBSCRIBE`,消息体内容是一系列订阅主题以及 `QoS` ;
- `SUBACK`,消息体内容是服务器对于`SUBSCRIBE` 所申请的主题及 `QoS` 进行确认和回复。
- `UNSUBSCRIBE`,消息体内容是要订阅的主题。
#### MQTT 服务器搭建
目前MQTT代理的主流平台有下面几个:
- [Mosquitto](https://mosquitto.org/)
- [VerneMQ](https://vernemq.com/)
- [EMQX](https://www.emqx.com/zh)
[免费的公共 MQTT 服务器](https://www.emqx.com/zh/mqtt/public-mqtt5-broker) (仅用于测试,请勿在生产环境中使用)该服务器信息
- **Broker 地址:**broker.emqx.io
- **TCP 端口:**1883
- **WebSocket端口:**8083
- **SSL/TLS 端口:**8883
- **WebSocket Secure 端口:**8084
- **QUIC 端口:**14567
- **CA 证书文件:**[broker.emqx.io-ca.crt](https://assets.emqx.com/data/broker.emqx.io-ca.crt)
这里我们使用本地计算机 Docker 容器安装的 **EMQX** 服务器作为 MQTT 的代理平台,安装步骤将在下一章节进行介绍。
### 2. EMQX
[EMQX](https://www.emqx.com/zh) 是一款全球下载量超千万的大规模分布式物联网 MQTT 服务器,单集群支持 1 亿物联网设备连接,消息分发时延低于 1 毫秒。为高可靠、高性能的物联网实时数据移动、处理和集成提供动力,助力企业构建关键业务的 IoT 平台与应用。
### 3. Home Assistant
[Home Assistant](https://www.home-assistant.io/) 家庭助理,HA,是一款基于 Python 的智能家居开源系统,可以方便地连接各种外部设备,如智能设备、摄像头、邮件、短消息、云服务等,支持众多品牌的智能家居设备,按照自己的需求手动或自动化地联动这些外部设备,构建随心所欲的智慧空间。
## 二、方案
### 1. Home Assistant
#### 安装
使用 [Docker](https://www.docker.com/) 容器安装 [Home Assistant](https://www.home-assistant.io/) ,
1. 下载 [Docker](https://www.docker.com/) 软件;
2. C 盘根目录新建文件夹 `homeassistant` ;
3. 下载部署文件 [GitHub](https://gist.github.com/peyanski/4d803963e890955886d40ae00d1cfb90) 并解压得到 `docker-compose.yml` 保存至上述 `homeassistant` 文件夹;
4. Windows 打开 `命令提示符` 或 `Windows PowerShell`,输入如下代码实现自动下载镜像
```powershell
cd C:\homeassistant
docker-compose.yml
docker-compose up
```
5. 安装过程需大约 30 分钟,即可在 Docker 容器中创建 Home Assistant 镜像;
5. 自动从镜像安装 Home Assistant 到容器
该代码 `docker-compose.yml` 将映射 Home Assistant 配置文件到 `C:/homeassistant` 文件夹;
5. 浏览器输入网址 `http://localhost:8123/` 进入Home Assistant 主界面,创建智能家居账号。
详见:[Docker run Home Assistant in Windows](https://peyanski.com/home-assistant-container-on-windows-using-docker/) .
### 2. EMQX
[EMQX](https://www.emqx.com/zh) 是一款全球下载量超千万的大规模分布式物联网 MQTT 服务器,单集群支持 1 亿物联网设备连接,消息分发时延低于 1 毫秒。为高可靠、高性能的物联网实时数据移动、处理和集成提供动力,助力企业构建关键业务的 IoT 平台与应用。
#### (1) 安装 EMQX
使用 EMQX 最简单的方式是在 [EMQX Cloud](https://www.emqx.com/zh/cloud) 上创建完全托管的 MQTT 服务。
这里我们使用 Docker 运行 EMQX
Windows 命令行或 PowerShell 输入并执行如下代码
```powershell
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
```
等待进度条下载和部署完成(大约5分钟),即可获得 EMQX 服务器。
> Docker 内的 `localhost` 或 `127.0.0.1` 指向的是容器内部地址,如需访问宿主机地址请使用宿主机的真实 IP .
详见:[Gitee](https://gitee.com/emqx/emqx) .
#### (2) 配置 EMQX
(1)浏览器打开网址 `http://localhost:18083/` ,初始登录账户名 `admin` 密码 `public` ;
(2)依次打开 `访问控制` - `客户端认证` - `创建` - `Password-Based` - `内置数据库` - (默认配置)- `创建` ;
(3)`用户管理` - `新建用户` - 自定义用户名和密码(建议 admin).
#### (3) 连接 EMQX 与 HA
(1)命令行或 PowerShell 输入 `ipconfig` 获取本地计算机 IPv4 地址,如 `42.34.25.153`
(2)配置 Home Assistant ,依次点击设置 - 设备与服务 - 添加集成 - 搜索 MQTT - 填写代理信息。
> 代理栏输入计算机 IP 地址,端口 1883,用户名和密码为 EMQX 中创建的用户信息。
(3)点击 `提交` 后显示 `成功创建 MQTT` ,此时 `集成` 选项下出现 `MQTT` 条目,EMQX 网页 `集群` 的 `总连接数` 和 `在线连接数` 由 `0` 变为 `1`,表明 MQTT 设备已连接。
参考:[MQTT 连入 Home Assistant](https://bbs.eeworld.com.cn/thread-1294158-1-1.html) .
#### (4) 测试 EMQX
新建连接分别作为发送端和接收端,参数设置如下
用户可以是同一个,也可以是不同的用户,需要在 EMQX 网页界面 `客户端认证` - `用户管理` - `新建用户`
接收端点击 `添加订阅` 自定义 Topic,如 `test` ,其他选项默认即可
点击右上角分别 `连接` 发送端和接收端,在发送端对话窗口 Topic 栏输入接收端订阅名称 `test` ,在对话框中输入代码并点击发送,
接收端将收到相同的信息
至此测试表明我们搭建的 EMQX 客户端可以实现正常的信息发送与接收功能,为后面连接 Arduino UNO R4 WiFi 开发板并上传传感器数据奠定基础。
MQTT 协议根据 `主题` 来转发消息,主题通过 `/` 来区分层级,如 `chat/room/first` , `sensor/+/temperature` .
详见:[MQTT 客户端工具演示](https://docs.emqx.com/zh/emqx/latest/messaging/publish-and-subscribe.html) 和 [MQTT 协议入门:基础知识和快速教程](https://www.emqx.com/zh/blog/the-easiest-guide-to-getting-started-with-mqtt) .
#### (5) 测试 EMQX 与 HA
进入 Home Assistant `设置` - `设备与服务` - `MQTT` - `配置` 界面
依次设置 `发送端主题`、`监听端主题`、点击 `开始监听`、输入传输信息、点击 `发送`,若监听对话框弹出发送端发送的信息,则表明发送端与接收端连接成功。
详见:[MQTT协议](https://zhuanlan.zhihu.com/p/421109780) .
#### (6) 连接开发板
测试远程服务器的连通效果后,下一步便是将开发板与 EMQX 服务器连接,并上传数据至客户端和 Home Assistant 平台。
**具体操作**
打开 Arduino IDE ,安装 `ArduinoMqttClient.h` 库文件
打开该库文件的例程 `WiFiSimpleSender.ino` ,并对其进行修改,用于上传数据
**代码**
```c++
#include
#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
#include
#elif defined(ARDUINO_SAMD_MKR1000)
#include
#elif defined(ARDUINO_ARCH_ESP8266)
#include
#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)
#include
#elif defined(ARDUINO_PORTENTA_C33)
#include
#elif defined(ARDUINO_UNOR4_WIFI)
#include
#endif
#include "arduino_secrets.h"
///////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)
// To connect with SSL/TLS:
// 1) Change WiFiClient to WiFiSSLClient.
// 2) Change port value from 1883 to 8883.
// 3) Change broker value to a server with a known SSL/TLS root certificate
// flashed in the WiFi module.
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "49.52.23.140";
int port = 1883;
const char topic[] = "UNOR4/Send";
const long interval = 1000;
unsigned long previousMillis = 0;
int count = 0;
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// attempt to connect to WiFi network:
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println("You're connected to the network");
Serial.println();
Serial.println(WiFi.localIP());
// You can provide a unique client ID, if not set the library uses Arduino-millis()
// Each client must have a unique client ID
// mqttClient.setId("clientId");
// You can provide a username and password for authentication
mqttClient.setUsernamePassword("UNOR4", "123456");
Serial.print("Attempting to connect to the MQTT broker: ");
Serial.println(broker);
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1);
}
Serial.println("You're connected to the MQTT broker!");
Serial.println();
}
void loop() {
// call poll() regularly to allow the library to send MQTT keep alives which
// avoids being disconnected by the broker
mqttClient.poll();
// to avoid having delays in loop, we'll use the strategy from BlinkWithoutDelay
// see: File -> Examples -> 02.Digital -> BlinkWithoutDelay for more info
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time a message was sent
previousMillis = currentMillis;
Serial.print("Sending message to topic: ");
Serial.println(topic);
Serial.print("temperature: ");
Serial.println(count);
Serial.print("humidity: ");
Serial.println(count);
// send message, the Print interface can be used to set the message contents
mqttClient.beginMessage(topic);
mqttClient.print("Temperature: ");
mqttClient.print(count);
mqttClient.print("Humidity: ");
mqttClient.print(count);
mqttClient.endMessage();
Serial.println();
count++;
}
}
```
> 注意修改 `arduino_secrets.h` 中的 WiFi 账号和密码,IP 地址、端口号、发送端主题、MQTT用户名和密码。
程序下载至 Arduino UNO R4 WiFi 开发板,通过串口监视器查看发送的信息,效果如下
**MQTTX 客户端测试**
新建连接,填写IP地址、EMQX服务器客户端用户名和密码,添加订阅,主题与代码中设置的一致。
参考:[EMQX Platform 文档](https://docs.emqx.com/zh/cloud/latest/connect_to_deployments/esp32.html) . [ESP8266 + MQTT : LED 灯的远程控制](https://www.emqx.com/zh/blog/esp8266_mqtt_led)
### 3. 连接HA
将发送的信息显示到 Home Assistant 智能家居平台,依次选择
`设置` - `设备与服务` - `MQTT` - `配置` - `监听主题` - 输入`主题` 名称 - 点击 `开始监听`,
便可接收信息,如下图所示
- 2024-09-24
-
加入了学习《【Follow me第二季第2期】+开发板硬件介绍和实现任务一 LED灯闪烁和串口打印》,观看 【Follow me第二季第2期】Arduino Uno R4 WiFi 通过MQTT连入Home Assistant
- 2024-09-22
-
回复了主题帖:
【Follow me第二季第2期】Arduino Uno R4 WiFi 通过MQTT连入Home Assistant(容器版)
Maker_kun 发表于 2024-9-18 18:52
搜索镜像需要科学上网吗?
home assistant 镜像需要翻墙,EMQX镜像不需要,可以参考这个方法安装 如何使用 Docker 在 Windows 上运行 Home Assistant 容器 - Kiril Peyanski 的博客
- 2024-09-17
-
加入了学习《FollowMe 第二季:2 - Arduino UNO R4 Wi-Fi 及任务讲解》,观看 Arduino UNO R4 Wi-Fi 及任务讲解
-
加入了学习《直播回放: FollowMe 3 与得捷一起解锁开发板的超能力》,观看 FollowMe 3 与得捷一起解锁开发板的超能力
- 2024-09-16
-
发表了主题帖:
【Follow me第二季第2期】ADC 采集 OPAMP 放大 DAC 信号并串口显示波形
# 【Follow me第二季第2期】ADC 采集 OPAMP 放大 DAC 信号并串口显示波形
## ADC
开发板的模数转换器 (**Analog-to-Digital Converter**, ADC),默认情况下,分辨率设置为 10 位,可以更新为 12 位 (0-4096) 和 **14** 位 (0-16383) 分辨率,以提高模拟读数的准确性。
ADC 将模拟信号转换为数字信号。Arduino 板的标准分辨率设置为 10 位 (0-1023);UNO R4 WiFi 支持高达 **14** 位的分辨率,可以从模拟信号中提供更精确的值。
若要更新分辨率,使用 `analogReadResolution()` 命令。
**实现思路:**
结合 DAC 输出正弦波信号、OPAMP 放大 DAC 信号的相关内容,通过开发板 ADC 读取和转换模拟量为数字参量,通过 Arduino IDE 的图形串口工具上位机同时显示 OPAMP 放大前后的 DAC 信号波形。
## 实物连线
## 代码
```c++
#include
#include "analogWave.h" // Include the library for analog waveform generation
analogWave wave(DAC);
int freq = 100;
void setup () {
Serial.begin(250000);
analogReadResolution(14);
wave.sine(freq);
wave.amplitude(0.5);
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
void loop() {
Serial.print(analogRead(A4)); // DAC output
Serial.print(" ");
Serial.println(analogRead(A5)); // OPAMP output
}
```
相关信息详见:[Arduino UNO R4 WiFi ADC Resolution | Arduino Documentation](https://docs.arduino.cc/tutorials/uno-r4-wifi/adc-resolution/) .
## 效果展示
注意到ADC读取的正弦曲线不够平滑,原因可能是开发板与电脑USB的连线过长,导致串口通信数据有丢失情况发生。
### 视频
[localvideo]07adb073d02ec888f527efe0fcb4dd56[/localvideo]