【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 <p>虽然是迟交了,最好做的这篇测试也非常的棒</p>
页:
[1]