【Follow me第二季第2期】 汇总提交帖:全部任务
[复制链接]
本帖最后由 一只小跳帽 于 2024-10-18 22:11 编辑
大家好!很高兴能与大家分享关于我们申请到的Arduino UNO R4 WiFi开发板的硬件资源。这款开发板在保留了Arduino UNO R3大部分接口的基础上,进行了一些升级并增加了新的功能。
-
与R3的兼容性:它保留了与R3相同的大部分接口,这意味着我们可以很方便地在R3和R4之间进行切换,同时兼容大部分为R3设计的扩展板和项目。
-
新增CAN通信接口:最显著的是增加了CAN(Controller Area Network)通信接口。CAN是一种常用的工业通信协议,广泛应用于汽车、工业控制等领域。通过增加CAN接口,我们可以模拟更多的功能,实现与各种CAN设备的通信和控制。
-
实现模拟输出:这款开发板还增加了DAC(Digital-to-Analog Converter,数字到模拟转换器)接口,实现了模拟输出功能。这使得Arduino UNO R4 WiFi不仅能够处理数字信号,还能处理模拟信号,进一步扩展了其应用范围。
总的来说,Arduino UNO R4 WiFi开发板在保留了原有功能的基础上,通过增加CAN通信接口和DAC接口,提供了更丰富的硬件资源和更广泛的应用场景。无论是对于初学者还是对于需要进行复杂项目开发的用户来说,都是一个非常不错的选择。
任务一开发板硬件介绍和实现任务一 LED灯闪烁和串口打印
对应论坛帖:【Follow me第二季第2期】+开发板硬件介绍和实现任务一 LED灯闪烁和串口打印 https://bbs.eeworld.com.cn/thread-1292136-1-1.html
所需硬件
本个任务之需要我们一块arduinoR4Wifi 开发板
整体的思路就是初始化外设并且在循环中对灯或者外设进行取反
首先打印字符串
流程图:
代码
void setup() {
// 初始化串口通信,设置波特率为9600
Serial.begin(9600);
}
void loop() {
// 每隔一秒打印一次“Hello EEWorld!”
Serial.println("Hello EEWorld!");
delay(1000);
}
演示:
第二个是LED灯闪烁
流程图:
代码:
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
}
演示:
下面的视频为这个项目的整个过程
任务二驱动12x8点阵LED;用DAC生成正弦波并放大采集
对应论坛帖:【Follow me第二季第2期】实现任务二 驱动12x8点阵LED;用DAC生成正弦波并放大采集 https://bbs.eeworld.com.cn/thread-1293083-1-1.html
今天我们将着手完成任务二的第一个关键任务——驱动一个由12x8 LED灯组成的点阵屏。
所需硬件
也是只需要一个ARDUINOR4WIFI 开发板和一些导线
Arduino官方特别为点阵屏开发了一套高效的API,通过引入
库,开发者可以便捷地控制点阵屏。首先,你需要创建一个点阵屏对象,例如命名为
,以
整体思路就是使用这个对象进行画图
流程图:
代码:
#include "Arduino_LED_Matrix.h"
#include <stdint.h>
#include "animation.h"
ArduinoLEDMatrix matrix;
void setup() {
// put your setup code here, to run once:
matrix.loadSequence(animation);
matrix.begin();
// turn on autoscroll to avoid calling next() to show the next frame; the parameter is in milliseconds
// matrix.autoscroll(300);
matrix.play(true);
}
void loop() {
// put your main code here, to run repeatedly:
}
const uint32_t animation[][4] = {
{
0xfff00000,
0x0,
0x0,
66
},
{
0xfff00,
0x0,
0x0,
66
},
{
0xff,
0xf0000000,
0x0,
66
},
{
0x0,
0xfff0000,
0x0,
66
},
{
0x0,
0xfff0,
0x0,
66
},
{
0x0,
0xf,
0xff000000,
66
},
{
0x0,
0x0,
0xfff000,
66
},
{
0x0,
0x0,
0xfff,
66
}
};
效果:
下面一个是用DAC生成正弦波并放大采集
这个的整体思路为先把DAC配置好再配置外设的放大器最后再使用ADC不断采集放大出来的信号并且进行打印最后使用电脑串口工具查看
本个项目使用的软件为
实物链截图
流程图
代码:
#include <OPAMP.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
analogReadResolution(14);
analogWriteResolution(12);
}
double a=0;
String receivedString = "";
int K=1;
int B=0;
void loop() {
// put your main code here, to run repeatedly:
a+=0.01;
if(a>2*PI)
{
a=0;
}
float out=map_float(sin(K*a+B),-1,1,0,4096);
analogWrite(DAC, out);
// Serial.println(out);
int reading = analogRead(A5);
//a=map(reading,0,4096,0,2*3.1415926);
Serial.println(reading);
//Serial.print(",");
//Serial.println(out);
String str="";
if (Serial.available() > 0) {
// 读取一个字节的数据,并将其转换为字符后添加到receivedString中
// 注意:这里假设我们不知道字符串何时结束,因此持续读取直到超时或检测到特定的结束字符
char incomingByte = Serial.read();
// 检查是否是字符串的结束符(例如换行符'\n')
// 注意:根据你的发送方,结束符可能不同
if (incomingByte == '\n') {
// 如果是结束符,则不将其添加到receivedString中,而是直接处理字符串
// 在这里,我们只是简单地打印它
parseString(receivedString);
// 清空receivedString,为接收下一个字符串做准备
receivedString = "";
} else {
// 如果不是结束符,则将其添加到receivedString中
receivedString += incomingByte;
}
}
}
//AB
void parseString(String input) {
// 查找冒号在字符串中的位置
int colonIndex = input.indexOf(':');
if (colonIndex == -1) {
Serial.println("Input format is incorrect. Missing colon.");
return;
}
// 提取标识符(冒号之前的部分)
String identifier = input.substring(0, colonIndex);
// 提取数字(冒号之后的部分),注意substring的第二个参数是结束索引(不包含),所以我们需要+1
String numberStr = input.substring(colonIndex + 1);
int number = numberStr.toInt(); // 将字符串转换为整数
if(identifier=="K")
{
K=number;
}
if(identifier=="B")
{
B=number;
}
}
float map_float(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
结果演示:
中间是更改K和B值的改变下面的视频为详细教程和结果和一些其他的不太好纸面介绍的知识
任务三
通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
对应论坛帖:【Follow me第二季第2期】Arduino Uno R4 WiFi 通过MQTT连入Home Assistant https://bbs.eeworld.com.cn/thread-1294158-1-1.html
这个任务在于是否能够理解mqtt协议和部署HomeAssistant 实现思路为首先链接WiFi然后再使用MQTT协议去连接我们配置好的家具平台
物料展示
用到的硬件为一个ARDUINOR4WIFI 开发板
软件为虚拟机和MQTT客户端
流程图
代码:
//#include <WiFiS3.h>
#include <PubSubClient.h>
#include <WiFi.h>
#define ARDUINOJSON_SLOT_ID_SIZE 1
#define ARDUINOJSON_STRING_LENGTH_SIZE 1
#define ARDUINOJSON_USE_DOUBLE 0
#define ARDUINOJSON_USE_LONG_LONG 0
#include <ArduinoJson.h>
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "aaaa";
const char* password = "aaaaaaaa";
const char* mqttServer = "broker.emqx.io";
IPAddress server(192,168,31 ,200);
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
void setup() {
Serial.begin(9600);
// 连接WiFi
connectWifi();
// 设置MQTT服务器和端口号
mqttClient.setServer(server, 1883);
// 连接MQTT服务器
connectMQTTServer();
Register_temp();
Register_hum();
}
void loop() {
if (mqttClient.connected()) { // 如果开发板成功连接服务器
mqttClient.loop(); // 保持客户端心跳
} else { // 如果开发板未能成功连接服务器
connectMQTTServer(); // 则尝试连接服务器
}
}
void connectMQTTServer(){
String clientId = "UNOR4";
// 连接MQTT服务器
if (mqttClient.connect(clientId.c_str())) {
Serial.println("MQTT Server Connected.");
Serial.println("Server Address: ");
Serial.println(mqttServer);
Serial.println("ClientId:");
Serial.println(clientId);
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
void connectWifi(){
WiFi.begin(ssid, password);
//等待WiFi连接,成功连接后输出成功信息
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Connected!");
Serial.println("");
Serial.println(WiFi.localIP());
}
void Register_temp()
{
// Stream& output;
const char * topics="homeassistant/sensor/sensorBedroomT/config";
String output;
JsonDocument doc;
doc["device_class"] = "temperature";
doc["name"] = "Temperature";
doc["state_topic"] = "homeassistant/sensor/sensorroom/state";
doc["value_template"] = "{{ value_json.temperature}}";
doc["unique_id"] = "temp01ae";
JsonObject device = doc["device"].to<JsonObject>();
device["identifiers"][0] = "room01";
device["name"] = "room";
doc.shrinkToFit(); // optional
serializeJson(doc, output);
Serial.println(output.length());
if(mqttClient.publish(topics, output.c_str())){
Serial.println("Publish topic:");Serial.println(topics);
Serial.println("Publish message:");Serial.println(output);
} else {
Serial.println("Message Publish Failed.");
}
}
void Register_hum()
{
// Stream& output;
const char * topics="homeassistant/sensor/sensorBedroomH/config";
String output;
JsonDocument doc;
doc["device_class"] = "humidity";
doc["name"] = "Humidity";
doc["state_topic"] = "homeassistant/sensor/sensorroom/state";
doc["unit_of_measurement"] = "%";
doc["value_template"] = "{{ value_json.humidity}}";
doc["unique_id"] = "hum01ae";
JsonObject device = doc["device"].to<JsonObject>();
device["identifiers"][0] = "room01";
device["name"] = "room";
doc.shrinkToFit(); // optional
serializeJson(doc, output);
Serial.println(output);
Serial.println(output.length());
if(mqttClient.publish(topics, output.c_str())){
Serial.println("Publish topic:");Serial.println(topics);
Serial.println("Publish message:");Serial.println(output);
} else {
Serial.println("Message Publish Failed.");
}
}
结果:
本结果图片不好展示使用视频展示看下方视频
任务四
通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据
对应论坛帖:【Follow me第二季第2期】+通过外部SHT40温湿度传感器,上传温湿度到HA https://bbs.eeworld.com.cn/thread-1294457-1-1.html
这个任务难点是如何获取SHT40 并且理解如何上传mqtt数据 本任务使用任务三思路即可完成
物料展示:
使用的硬件有
ARDUINOR4WIFI SHT40温湿度传感器 一个 一个Qwiic 线缆
流程图如下
代码:
-
//#include <WiFiS3.h>
#include <PubSubClient.h>
#include "Adafruit_SHT4x.h"
#include <Wire.h>
#include <WiFi.h>
#include "aaa.h"
#define ARDUINOJSON_SLOT_ID_SIZE 1
#define ARDUINOJSON_STRING_LENGTH_SIZE 1
#define ARDUINOJSON_USE_DOUBLE 0
#define ARDUINOJSON_USE_LONG_LONG 0
#include <ArduinoJson.h>
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* mqttServer = "broker.emqx.io";
IPAddress server(192,168,31 ,200);
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
void setup() {
Serial.begin(9600);
// 连接WiFi
connectWifi();
if (! sht4.begin(&Wire1 )) {
Serial.println("Couldn't find SHT4x");
while (1) delay(1);
}
// 设置MQTT服务器和端口号
mqttClient.setServer(server, 1883);
// 连接MQTT服务器
connectMQTTServer();
Register_temp();
Register_hum();
}
void loop() {
sensors_event_t humidity, temp;
sht4.getEvent(&humidity, &temp);
Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
if (mqttClient.connected()) { // 如果开发板成功连接服务器
Update_Value(temp.temperature,humidity.relative_humidity);
} else { // 如果开发板未能成功连接服务器
connectMQTTServer(); // 则尝试连接服务器
}
}
void connectMQTTServer(){
String clientId = "UNOR4";
// 连接MQTT服务器
if (mqttClient.connect(clientId.c_str())) {
Serial.println("MQTT Server Connected.");
Serial.println("Server Address: ");
Serial.println(mqttServer);
Serial.println("ClientId:");
Serial.println(clientId);
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
void connectWifi(){
WiFi.begin(ssid, password);
//等待WiFi连接,成功连接后输出成功信息
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Connected!");
Serial.println("");
Serial.println(WiFi.localIP());
}
void Register_temp()
{
// Stream& output;
const char * topics="homeassistant/sensor/sensorBedroomT/config";
String output;
JsonDocument doc;
doc["device_class"] = "temperature";
doc["name"] = "Temperature";
doc["state_topic"] = "homeassistant/sensor/sensorroom/state";
doc["value_template"] = "{{ value_json.temperature}}";
doc["unique_id"] = "temp01ae";
JsonObject device = doc["device"].to<JsonObject>();
device["identifiers"][0] = "room01";
device["name"] = "room";
doc.shrinkToFit(); // optional
serializeJson(doc, output);
Serial.println(output.length());
if(mqttClient.publish(topics, output.c_str())){
Serial.println("Publish topic:");Serial.println(topics);
Serial.println("Publish message:");Serial.println(output);
} else {
Serial.println("Message Publish Failed.");
}
}
void Register_hum()
{
// Stream& output;
const char * topics="homeassistant/sensor/sensorBedroomH/config";
String output;
JsonDocument doc;
doc["device_class"] = "humidity";
doc["name"] = "Humidity";
doc["state_topic"] = "homeassistant/sensor/sensorroom/state";
doc["unit_of_measurement"] = "%";
doc["value_template"] = "{{ value_json.humidity}}";
doc["unique_id"] = "hum01ae";
JsonObject device = doc["device"].to<JsonObject>();
device["identifiers"][0] = "room01";
device["name"] = "room";
doc.shrinkToFit(); // optional
serializeJson(doc, output);
Serial.println(output);
Serial.println(output.length());
if(mqttClient.publish(topics, output.c_str())){
Serial.println("Publish topic:");Serial.println(topics);
Serial.println("Publish message:");Serial.println(output);
} else {
Serial.println("Message Publish Failed.");
}
}
void Update_Value(float temp,float hum)
{
String topics="homeassistant/sensor/sensorroom/state";
JsonDocument doc;
doc["temperature"] = temp;
doc["humidity"] = hum;
String output;
doc.shrinkToFit(); // optional
serializeJson(doc, output);
if(mqttClient.publish(topics.c_str(), output.c_str())){
Serial.println("Publish topic:");Serial.println(topics);
Serial.println("Publish message:");Serial.println(output);
} else {
Serial.println("Message Publish Failed.");
}
}
结果展示:
-
结果也使用视频进行展示
感想
试用Arduino的经历是一次宝贵的学习之旅。它不仅让我掌握了电子技术和编程知识,更重要的是激发了我的创造力和想象力。我相信,在未来的日子里,Arduino将继续陪伴我探索未知、实现梦想。对于所有对电子技术和创新感兴趣的人来说,Arduino无疑是一个值得尝试和深入学习的平台。
代码链接
【Follow me第二季第2期】 所有任务代码-嵌入式开发相关资料下载-EEWORLD下载中心
|