Henry-0755 发表于 2024-10-22 21:48

【Follow me第二季第2期】任务汇总-ArduinoUnoR4尝鲜LTR329与LCD_SHIELD_V3

# 【Follow me第二季第2期】任务汇总—ArduinoUnoR4尝鲜LTR329与LCD_SHIELD_V3



## 视频展示

https://training.eeworld.com.cn/course/68723



物料:

使用包括开发板与传感器。

| **制造商产品编号** | 描述                            | 图片                                                         |
| ------------------ | ------------------------------- | ------------------------------------------------------------ |
| ABX00087         | ARDUINO UNO R4 WIFI             | <img src="https://mm.digikey.com/Volume0/opasdata/d220001/medias/images/5407/MFG_ABX00087_primary.jpg" alt="ABX00087" style="zoom:67%;" /> |
| DFR1075            | FIREBEETLE 2 ESP32 DEV BOARD    | <img src="https://mm.digikey.com/Volume0/opasdata/d220001/medias/images/6253/MFG_DFR1075.jpg" alt="DFR1075" style="zoom:50%;" /> |
| 5591               | ADAFRUIT LTR-329 LIGHT SENSOR - | <img src="https://mm.digikey.com/Volume0/opasdata/d220001/medias/images/2817/MFG_5591.jpg" alt="5591" style="zoom:50%;" /> |

实物图:




## 任务实现

### 入门任务(必做)

搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
使用的是arduino ide,串口也通过arduino ide进行查看

``` c
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
Serial.println("Hello EEWorld!");
}

void loop() {
delay(500);
digitalWrite(13, !digitalRead(13));
}
```

### 基础任务(必做)

基础任务可以分为两个
一个是LED矩阵,另一个是DAC,ADC以及OPAMP的模拟信号处理

#### LED矩阵

Arduino的LED矩阵是一个12*8的矩阵,官方有给出原理图,原理和矩阵按键很类似,且利用了发光二极管的单向导电性。



实际点亮的方式应当是时分复用,比如最左边7与剩余的io可以控制第一列,6与剩余控制第二列,类推,按照这样的方式最多应该是10+9+8+7+6+5+4+3+2 = 54,再反向*2最多应当是108个led,这里最后一列少了12个所以是96个。挺巧妙的,虽然实际上我们直接调库就好~

代码如下:心跳

```
#include "Arduino_LED_Matrix.h"/*包含官方的驱动库*/
ArduinoLEDMatrix led_matrix;//实例化一个对象

byte frame = {
{
    { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
    { 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
    { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
    { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
    { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
},
{
    { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
    { 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0 },
    { 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0 },
    { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
    { 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
},
{
    { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
    { 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0 },
    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
    { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
    { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
},
};


void setup() {
Serial.begin(115200);
led_matrix.begin();
}

void loop() {
led_matrix.renderBitmap(frame, 8, 12);
delay(300);
led_matrix.renderBitmap(frame, 8, 12);
delay(300);
led_matrix.renderBitmap(frame, 8, 12);
delay(500);
led_matrix.renderBitmap(frame, 8, 12);
delay(300);
}
```

效果图:





#### DAC + OPAMP + ADC

参考官网`https://docs.arduino.cc/tutorials/uno-r4-wifi/opamp/`

这里将A0 A1短接(DAC输出信号由AMP0+再反馈到放大电路)

按照官网

!(https://docs.arduino.cc/static/45f63f884a62fa52a30abd12bf5e9755/a6d36/circuitAmplifierWiFi.png)

接线图:



通过一个10k和20k的电阻,将信号放大3倍

代码如下:

```
#include "analogWave.h"
#include <OPAMP.h>

analogWave wave(DAC);
int freq = 600;

void setup() {
        // put your setup code here, to run once:
        Serial.begin(1000000);
        analogReadResolution(14);

        wave.sine(freq);
        wave.amplitude(0.1);

OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}

void loop() {
        int value = analogRead(A3);
        Serial.println(value);
}
```

上述代码,当代码采用14bit精度的DAC再经过dac的amplitude为0.1倍

理论adc直接采集dac的信号应当是2^14/0.1=1638

但adc采集的是经过OPAMP放大3倍的信号,因此实际的峰值为4800左右。

由此例子,便可以验证DAC的sin波形输出、ADC的采集以及OPAMP的放大功能。







### 进阶任务与扩展任务

进阶任务与扩展任务均是使用HomeAssistant结合wifi做控制,放到一起来做

拓展任务采用的是LTR329的光传感器,实物如图:



安装homeassistant不再赘述

基本的概念是有三个:HomeAssistant、MQTT、HAClient

HomeAssistant是一个web服务器,负责展示和与用户交互。

有了web服务器,后台也是需要的,后台采用的是MQTT协议的服务器,有许多实现这个协议的后台,比如本次使用的是mosquitto后台,负责建立与板子的tcp通信。

HAClient就是开发板子上与HomeAssistant交互的客户端,提供数据,提供控制接口实例。

(个人理解)

下面是板端的代码与设计思路,揉合了网上ArduinoHA示例,MQTTClient等示例。

#### 设计思路

使用ArduinoHA库声明实例,包括灯、LTR329的红外光强度、LTR329的可见光强度。

设置回调,控制板子上的灯状态。

再loop循环中,读取LTR329的值,实时更新到HA上。

```arduino
#include <Arduino.h>
#include <WiFiS3.h>
#include <ArduinoHA.h>
#include "Adafruit_LTR329_LTR303.h"

const char WIFI_SSID[] = "LH";   // CHANGE TO YOUR WIFI SSID
const char WIFI_PASSWORD[] = "qwertyuiop";// CHANGE TO YOUR WIFI PASSWORD

//const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org";// CHANGE TO MQTT BROKER'S ADDRESS
const char MQTT_BROKER_ADRRESS[] = "192.168.2.35";// CHANGE TO MQTT BROKER'S IP ADDRESS
const int MQTT_PORT = 1883;
const char MQTT_CLIENT_ID[] = "arduino-uno-r4";// CHANGE IT AS YOU DESIRE
const char MQTT_USERNAME[] = "";            // CHANGE IT IF REQUIRED, empty if not required
const char MQTT_PASSWORD[] = "";            // CHANGE IT IF REQUIRED, empty if not required

// The MQTT topics that Arduino should publish/subscribe
const char PUBLISH_TOPIC[] = "arduino-uno-r4/send";       // CHANGE IT AS YOU DESIRE
const char SUBSCRIBE_TOPIC[] = "arduino-uno-r4/receive";// CHANGE IT AS YOU DESIRE

WiFiClient client;
HADevice device(MQTT_CLIENT_ID); // 创建一个HA设备
HAMqtt mqtt(client, device);
HASwitch led_switch("ledSwitch"); // 开关实体
HASensorNumber light_sensor("lightSensor");
HASensorNumber infrared_sensor("infraredSensor");

Adafruit_LTR329 ltr = Adafruit_LTR329();

uint16_t visible_lx, infrared_lx;

void onSwitchCommand(bool state, HASwitch *sender)
{
Serial.print("state: ");
Serial.println(state);

sender->setState(state);
if (state)
    digitalWrite(LED_BUILTIN, HIGH);
else
    digitalWrite(LED_BUILTIN, LOW);
}
void wifi_up();
void printWifiStatus();

void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
wifi_up();

led_switch.setIcon("mdi:led-outline");
led_switch.setName("arduino LED");
led_switch.onCommand(onSwitchCommand);

light_sensor.setName("arduino light");
light_sensor.setIcon("mdi:alarm-light-outline");
infrared_sensor.setName("arduino infrared");
infrared_sensor.setIcon("mdi:sun-wireless-outline");

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);
ltr.setIntegrationTime(LTR3XX_INTEGTIME_100);
ltr.setMeasurementRate(LTR3XX_MEASRATE_200);
}
void loop()
{
mqtt.loop();

if (ltr.newDataAvailable()) {
    ltr.readBothChannels(visible_lx, infrared_lx);
    light_sensor.setValue(visible_lx);
    infrared_sensor.setValue(infrared_lx);
}
}

void onMqttConnected()
{
Serial.println("Connected to the broker!");
mqtt.subscribe(SUBSCRIBE_TOPIC);
Serial.println("Subscribe to topic: ");
Serial.print(SUBSCRIBE_TOPIC);
}

void onMqttDisconneted()
{
Serial.println("Disconnected from the broker!");
}

void onMqttStateChanged(HAMqtt::ConnectionState state)
{
Serial.print("MQTT state changed to: ");
Serial.println(static_cast<uint8_t>(state));
}

void wifi_up()
{
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // Connect to WPA/WPA2 network:
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(WIFI_SSID);
while (WiFi.status() != WL_CONNECTED)
{
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    delay(1000);
}

Serial.println("Starting connect to MQTT server");
mqtt.onConnected(onMqttConnected);
mqtt.onDisconnected(onMqttDisconneted);
mqtt.onStateChanged(onMqttStateChanged);
mqtt.setDataPrefix("homeassistant/sensor");

if (!mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, MQTT_USERNAME, MQTT_PASSWORD))
{
    Serial.print("Failed");
    while(1);
}
}
```

在HA面板上,便有了相应entity与device



### 点屏LCD Shield V3

手头上有个不知从何而来的UNO适配的2.8''TFT LCD Shield V3的板子,如图:



想着不用白不用,网上搜啊搜也没有找到屏幕信息,好在社区资源丰富,找到个第三方库(https://docs.arduino.cc/libraries/mcufriend_kbv/)

看到国外友人有适配这个板子,但又很可惜的是这个库的最后版本停留在2年前,自然是没有适配ArduinoR4(因为他是直接写mcu寄存器,不是调用arduino的接口,因此需要根据不同信号适配读写)

找到一个分支今年专门适配的R4,[链接](https://github.com/slviajero/MCUFRIEND_kbv/tree/master),便终于用上屏幕板子啦~



效果如图,屏幕刷新率还不错,目测30帧+





## 心得体会

首先板子选得非常好玩,很有趣功能很丰富的板子,网上也有许多教程。

也是首次接触HomeAssistant,以后可以搭建自己的智能家居了哈哈。

且活动十分人性化,由于个人原因(本来都打算放弃了)迟交了许久也允许补交,太感动了。

非常好的活动与论坛~~,希望自己之后能多总结、多动手,以后有DIY项目,首先就分享到咱们论坛。



## 代码



https://download.eeworld.com.cn/detail/Henry-0755/634602

Jacktang 发表于 2024-10-25 07:20

<p>虽然是迟交了,最好做的这篇测试也非常的棒</p>
页: [1]
查看完整版本: 【Follow me第二季第2期】任务汇总-ArduinoUnoR4尝鲜LTR329与LCD_SHIELD_V3