- 2024-12-09
-
加入了学习《直播回放: DigiKey FollowMe 第二季 第4期 Arduino Nano RP2040 Connect 任务讲解》,观看 Arduino Nano RP2040 Connect 任务讲解
- 2024-10-09
-
加入了学习《【Follow me第二季第2期】任务完成视频》,观看 【Follow me第二季第2期】汇总提交帖:全部任务
- 2024-10-06
-
加入了学习《Follow Me 第二季第二期总结视频》,观看 follow me 集合
-
上传了资料:
【Follow me第二季第2期】汇总代码
-
加入了学习《【Follow me第二季第1期】全部任务演示》,观看 全部任务演示2.0
- 2024-10-05
-
发表了主题帖:
【Follow me第二季第2期】汇总提交帖:全部任务
本帖最后由 MatrixPulse 于 2024-10-6 14:46 编辑
# 【Follow me第二季第2期】汇总提交帖:全部任务
[TOC]
## 前言
Follow me 活动是 DigiKey 联合 EEWorld 发起的大型开发板体验活动,每期技术大咖推荐可玩性与可学性较强的开发板/仪器套件,参与者完成任务即返京东卡,出色完成者,还将获得额外200元京东卡奖励。
我参加的是 Follow me 第二季第 2 期任务,本次任务核心板为 Arduino UNO R4 WiFi,我选择的搭配器件为 LTR-329 环境光传感器和 Qwiic 线缆。
### 活动物料购买链接如下:
- 主板:[Arduino UNO R4 Wi-Fi](https://www.digikey.cn/zh/products/detail/arduino/ABX00087/20371539)(核心板)
- 扩展板:[5591](https://www.digikey.cn/zh/products/detail/adafruit-industries-llc/5591/16733167)( LTR-329 光传感器扩展板)
- 缆线:[PRT-14426](https://www.digikey.cn/zh/products/detail/sparkfun-electronics/PRT-14426/7652739)( Qwiic 缆线 - 50 mm)
### **物料实物展示:**
![](https://s2.loli.net/2024/10/01/pI6QAYdjitL5Buv.jpg)
![IMG_6399](https://s2.loli.net/2024/10/01/pUc1rH6i57JoOvy.jpg)
## 任务展示
[localvideo]19da8eef42b272e178fe4ee27f880835[/localvideo]
## 任务简介
- **入门任务(必做):**搭建环境并开启第一步 Blink / 串口打印 Hello EEWorld!
- **基础任务(必做):**驱动 12x8 点阵 LED;用 DAC 生成正弦波;用 OPAMP 放大 DAC 信号;用 ADC 采集并且打印数据到串口等其他接口可上传到上位机显示曲线
- **进阶任务(必做):**通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台 HA(HomeAssistant)
- **扩展任务:**通过外部 LTR-329 环境光传感器,上传光照度到 HA,通过 HA 面板显示数据
## 引脚功能图
要对 Arduino UNO R4 WiFi 进行编程,我们需要参考其引脚功能图,如下所示:(PS:Arduino 引脚功能图真是直观又漂亮!):
![image-20241001224137576](https://s2.loli.net/2024/10/01/DTcJmQhCg1pz7F6.png)
## 设计思路及实现效果
### 1. 入门任务
首先是 Blink 任务,我们将编写代码点亮 Arduino 内置 LED (LED_BUILTIN),使其实现间隔时间 1s 的闪烁
#### Blink 流程图 :
#### Blink 代码:
```c++
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
```
#### Blink 效果:
[localvideo]0a0ae887d9fde1550b4566438c2f9b1c[/localvideo]
串口打印任务,我们将编写代码使 Arduino 通过串口每隔 1s 输出“Hello EEWorld!”
#### 串口打印流程图:
#### 串口打印代码:
```c++
void setup() { //初始化函数,这个函数内的代码只在启动时运行一次
Serial.begin(9600); //设置串口波特率
}
void loop() { //循环函数,这个函数内的代码会一直循环运行
Serial.println("Hello EEWorld!"); //向串口打印"Hello EEWorld!"
delay(1000);
}
```
#### 串口打印效果:
![](https://s2.loli.net/2024/10/02/tUbagrP4HTRisBj.jpg)
### 2. 基础任务
Arduino UNO R4 WiFi 自带了一个 12x8 LED 矩阵,通过 Arduino 库管理器安装 ArduinoGraphics,我们可以方便地生成想要的 LED 矩阵图形。
![LED矩阵](https://s2.loli.net/2024/10/02/Bphj1xzVfXs5ZMG.png)
#### LED 矩阵流程图:
#### LED 矩阵代码:
```c++
// To use ArduinoGraphics APIs, please include BEFORE Arduino_LED_Matrix
#include
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
void setup() {
Serial.begin(115200);
matrix.begin();
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
// add some static text
// will only show "UNO" (not enough space on the display)
const char text[] = "^_^";
matrix.textFont(Font_4x6);
matrix.beginText(0, 1, 0xFFFFFF);
matrix.println(text);
matrix.endText();
matrix.endDraw();
delay(2000);
}
void loop() {
// Make it scroll!
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(50);
// add the text
const char text[] = " Hello EEWorld and DigiKey! ";
matrix.textFont(Font_5x7);
matrix.beginText(0, 1, 0xFFFFFF);
matrix.println(text);
matrix.endText(SCROLL_LEFT);
matrix.endDraw();
}
```
#### LED 矩阵效果:
[localvideo]dc9bd59e9f1966b1679f7b8e89fbe905[/localvideo]
接下来我们通过 DAC 生成正弦波信号,用 OPAMP 将 DAC 信号放大两倍,并输出至 ADC,通过两个模拟引脚采集信号并打印至串口。
要实现两倍的放大效果,我们需要添加两个10 kΩ 的电阻,仿真电路如下:可以看到正弦波被放大至原来两倍
硬件实物连接图:
#### 放大信号程序流程图:
#### 放大信号代码:
```c++
#include "analogWave.h" // Include the library for analog waveform generation
#include
analogWave wave(DAC); // Create an instance of the analogWave class, using the DAC pin
int freq = 200; // in hertz, change accordingly
void setup() {
Serial.begin(2000000); // Initialize serial communication at a baud rate of 115200
/* By default, the resolution is set to 10-bit, which can be updated to both 12-bit (0-4096)
and 14-bit (0-16383) resolutions for improved accuracy on analog readings.*/
analogReadResolution(14);//Change to 14-bit resolution 分辨率
wave.sine(freq); // Generate a sine wave with the initial frequency
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
}
```
#### 放大信号效果:
打开串口监视器,可以观测到经 ADC 转换后的数值:
![SineSerialMonitor](https://s2.loli.net/2024/10/02/UoX497AtrEBzcn1.png)
串口绘图器显示效果:
示波器显示效果:
### 3. 进阶任务
进阶任务为利用 Wi-Fi,通过 MQTT 协议接入到开源智能家居平台 HomeAssistant
HomeAssistant 的安装方式有四种,区别如下:
![HomeAssistant_version](https://s2.loli.net/2024/10/02/wbW3AlpMkv5iCGT.jpg)
这里我们采用在 BeagleBone Black(简称:BBB) 上安装 HomeAssistant Core 的方式运行,用到的硬件如下:
![BeagleBoneBlack](https://s2.loli.net/2024/10/02/P35vIditG8XEV1R.jpg)
MQTT Broker 我们选用 Mosquitto,其特点是轻量、开源。
![](https://s2.loli.net/2024/10/03/caoRmeTu2PKj6Mp.png)
#### 操作流程:
*安装过程可参考:如何在BBB上安装 Home Assistant?*(待完成)
#### 关键代码:
```c++
//arduino.secrets.h
#define MQTT_SERVER "192.168.1.10" //BeagleBone Black IP地址
#define MQTT_PORT 1884 //定义MQTT服务器的端口
#define MQTT_CLIENT_ID "arduino"
#define HA_CONNECTION "UNO/arduino/status/cmd_t"
#define TOPIC_SUBSCRIBE1 "UNO/arduino/myButtonA/cmd_t" //定义订阅的主题
#define TOPIC_SUBSCRIBE2 "UNO/arduino/myButtonB/cmd_t"
#define SECRET_PASS "3fzts5qh" //路由器Wi-Fi密码
```
```c++
//MQTT_HA_Connection.ino
#include
#include
#include
#include "WiFiS3.h"
#include "arduino_secrets.h"
#include "analogWave.h" // Include the library for analog waveform generation
/*
......
*/
WiFiClient client;
HADevice device (MQTT_CLIENT_ID); // HADevice device (mac, sizeof(mac));
HAMqtt mqtt(client, device);
HASensorNumber analogSensor ("myAnalogInput", HASensorNumber::PrecisionP1);
HASensorNumber uptimeSensor("myUptime");
HAButton buttonA("myButtonA");
HAButton buttonB("myButtonB");
/*
......
*/
void onMqttConnected(){
Serial.println("Connected to the broker!");
// 订阅两个按键的 MQTT 主题
mqtt.subscribe(TOPIC_SUBSCRIBE1); // myButtonA
mqtt.subscribe(TOPIC_SUBSCRIBE2); // myButtonB
Serial.println("subscribed to topic:" HA_CONNECTION);
mqtt.publish(HA_CONNECTION, "Hi HomeAssistant, I'm Arduino UNO R4 WIFI ^^");
}
```
***完整代码见附件...***
#### 实现效果:
![Snipaste_2024-10-03_18-48-15](https://s2.loli.net/2024/10/03/dIGOepLgBm2v7hu.jpg)
[localvideo]bbfcd74780a9ce1127594956e04b4fc6[/localvideo]
### 4. 扩展任务:
本次扩展任务我选择的是任务一,使用 LTR-329 环境光传感器(见下方视频)收集光照数据上传到 HA,并通过 HA 卡片显示。
环境光传感器是一种感应周围环境光线强度的器件,它通常用来调节设备的显示亮度,以提供更好的使用体验,常见的应用包括用于智能手机、平板和笔记本电脑等显示屏上的亮度调节。在电子阅读装置和电视上,环境光传感器可用于调整屏幕色温,以获得更舒适的阅读或观看体验。
[localvideo]18411d8bbd59d158f11307765d3aa4ab[/localvideo]
LTR-329 扩展板基于集成型环境光传感器,其具有以下特点:
- I2 C 接口,最高支持快速模式 @ 400kbit/s,地址为 0x29
- 超小型 4 针 ChipLED 封装 2.0mm x 2.0mm x 0.7mm
- 内置温度补偿电路
- 待机模式下低功耗
- 电源电压范围为 2.4V 至 3.6V,能够提供 1.7V 逻辑电压
- 工作温度范围为 -30C 至 +70C
- 符合 RoHS 标准
- 接近人眼光谱响应
- 不受红外/紫外光源影响
- 自动抑制 50/60 Hz 照明闪烁
- 全动态范围从 0.01 勒克斯到 64k 勒克斯
- 16 位有效分辨率
前面我们已经完成了 Arduino 通过 MQTT 协议与 HA 通信,下面我们将在代码中集成环境光传感器:
#### 流程图
#### 关键代码:
```C++
// MQTT_HA_Connection.ino
#include "Adafruit_LTR329_LTR303.h"
HASensorNumber lightSensor0("lightCH0"); // LTR-329_CH0
HASensorNumber lightSensor1("lightCH1"); // LTR-329_CH1
```
```c++
void setup() {
// ...... //
if (!ltr.begin(&Wire1)) {
Serial.println("Couldn't find LTR sensor!");
while (1) delay(10);
}
Serial.println("Found LTR sensor!");
ltr.setGain(LTR3XX_GAIN_2);
Serial.print("Gain : ");
switch (ltr.getGain()) {
case LTR3XX_GAIN_1: Serial.println(1); break;
case LTR3XX_GAIN_2: Serial.println(2); break;
case LTR3XX_GAIN_4: Serial.println(4); break;
case LTR3XX_GAIN_8: Serial.println(8); break;
case LTR3XX_GAIN_48: Serial.println(48); break;
case LTR3XX_GAIN_96: Serial.println(96); break;
}
ltr.setIntegrationTime(LTR3XX_INTEGTIME_100);
Serial.print("Integration Time (ms): ");
switch (ltr.getIntegrationTime()) {
case LTR3XX_INTEGTIME_50: Serial.println(50); break;
case LTR3XX_INTEGTIME_100: Serial.println(100); break;
case LTR3XX_INTEGTIME_150: Serial.println(150); break;
case LTR3XX_INTEGTIME_200: Serial.println(200); break;
case LTR3XX_INTEGTIME_250: Serial.println(250); break;
case LTR3XX_INTEGTIME_300: Serial.println(300); break;
case LTR3XX_INTEGTIME_350: Serial.println(350); break;
case LTR3XX_INTEGTIME_400: Serial.println(400); break;
}
ltr.setMeasurementRate(LTR3XX_MEASRATE_200);
Serial.print("Measurement Rate (ms): ");
switch (ltr.getMeasurementRate()) {
case LTR3XX_MEASRATE_50: Serial.println(50); break;
case LTR3XX_MEASRATE_100: Serial.println(100); break;
case LTR3XX_MEASRATE_200: Serial.println(200); break;
case LTR3XX_MEASRATE_500: Serial.println(500); break;
case LTR3XX_MEASRATE_1000: Serial.println(1000); break;
case LTR3XX_MEASRATE_2000: Serial.println(2000); break;
}
// ...... //
}
```
```c++
void loop() {
// ...... //
bool valid;
uint16_t visible_plus_ir, infrared;
// ...... //
if (ltr.newDataAvailable()) {
valid = ltr.readBothChannels(visible_plus_ir, infrared);
if (valid) {
// 上传传感器数值
lightSensor0.setValue(visible_plus_ir);
lightSensor1.setValue(infrared);
delay(500);
}
}
}
```
***完整代码见附件...***
#### 实现效果
[localvideo]b450018fc43de7ebba785df49bfbf79c[/localvideo]
以上就是本次活动全部任务的完成与展示,通过本次活动我学习到了:
- Arduino 开发环境的部署
- Home Assistant 的安装与部署
- Mosquitto Broker 的安装
- 还有一些常用的 Linux 命令
再次感谢 DigiKey 和 EEWorld 举办本次活动,为我们工程师提供了一个很好的学习机会!期待 Fllow Me 活动推出更多好玩的板卡!Respect!如果您觉得我的文章对您有所帮助,欢迎点赞支持哦!
#### 下载源码:
https://download.eeworld.com.cn/detail/eew_M98Yam/634538
- 2024-09-30
-
加入了学习《FollowMe 第二季:2 - Arduino UNO R4 Wi-Fi 及任务讲解》,观看 Arduino UNO R4 Wi-Fi 及任务讲解