Funpack3-5-板卡三-UNO R4
0. 任务目标
任务三:1.使用Arduino Cloud云平台连接UNO R4开发板,首先通过云平台远程控制1颗LED灯的亮灭,再通过云平台下发指令控制UNO R4开发板LED矩阵的亮度,当下发值在0~90时,LED矩阵逐渐亮起,当下发值在90~99之间时LED矩阵显示出太阳图标,当下发值为100时,LED矩阵所有像素全亮。最后使用一颗DHT20温湿度传感器连接UNO R4开发板,通过Arduino Cloud云平台实时读取传感器周围的温湿度值。
1. 硬件
1.1硬件连接演示图
硬件上用于云平台控制的单颗LED与LED矩阵来自Arduino UNO R4板卡的板载资源,而用于测量环境温湿度的DHT20探测器通过IIC总线与板卡连接,DHT20探测器支持2.2~5.5V的电压输入,这里使用5V作为传感器供电电压。
1.2硬件连接实物图
2. 软件代码
2.1 LED矩阵库制作
Arduino官方为UNO R4的Matrix LED矩阵提供了网站(Led Matrix Editor)用于一键生成图案数组,结合《Arduino_LED_Matrix.h》库即可在UNO R4板卡上展示对应的图案。以本次项目中的太阳图案为例,先在Led Matrix Editor上绘制对应图案:
点击右上角的下载按钮,即可生成对应的数组:
uint32_t sun[] = {//90~99
0x600f01f,
0x87fe7fe1,
0xf80f0060,
};
结合matrixled.loadFrame();函数可观察到实际效果为:
本项目所涉及的其他LED矩阵图案以此类推。
2.2 Arduino Cloud云平台使用
1. 首先在首页的Things选项卡中创建一个工程,依次在右侧Associated Device中选择UNO R4板卡,在NetWork中配置自己的无线路由名称与密码,配置界面如下图所示:
2. 在Things选项卡中切换到Sketch页面,在该页面编写工程相关代码,编写好代码后依次点击编译、下载按钮。首次使用应该下载Arduino Agnet插件方便Arduino Cloud访问本地硬件设备。
3. 在Things选项卡中点击Setup,进入Cloud Variables页面,创建云平台与硬件开发板的交互变量,这里根据项目目标依次创建Bool型的led、int型的matrix、float型的hum和Temp变量,分别用来显示与控制led灯、LED矩阵和温湿度传感器的值。
4. 点击左侧边栏的dashboard选项,进入Dashboard编辑页面,Dashboard中包含各种插件,根据3中云变量的特点和定义依次拖拽出Switch、Guage、Slider插件,并与云变量相关联。
2.3 软件代码整体设计思路与主要代码片段介绍
2.3.1代码整体设计思路
Arduino Cloud Sketch中编写的代码与在Arduino IDE中编写基本一致,主要包含硬件初始化和loop循环函数两部分。硬件初始化中主要根据本次项目的需要初始化了GPIO13、LEDmatrix函数、DHT20温湿度传感器。
Loop函数中主要是循环读取下发的LED矩阵控制变量、LED控制变量和DHT20的温湿度值。对于Arduino Cloud平台的通讯由底层函数自动完成。
2.3.2 头文件代码介绍
全部头文件如下:
#include "Arduino_LED_Matrix.h" // Include the LED_Matrix library
#include <DFRobot_DHT20.h>
#include "thingProperties.h"
“Arduino_LED_Matrix.h”文件主要用于驱动UNO R4板载的LED矩阵。“DFRobot_DHT20.h”文件主要用于驱动DHT20温湿度传感器。“thingProperties.h”主要用于连接Arduino Cloud云平台,每次增加、删除云变量或更新WIFI信息时该文件会自动更新。
2.3.3 setup代码介绍
setup模块的代码在板卡上电后只会运行一次,主要用于相关寄存器初始化,本项目中代码如下:
// Initialize serial and wait for port to open:
Serial.begin(115200);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
Serial.print("Init Start\n");
pinMode(LED_BUILTIN, OUTPUT);
matrixled.begin(); // Initialize the LED matrix
Serial.print("matrixled.begin(); \n");
matrixled.loadFrame(fullOn);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
Serial.print("ArduinoCloud.printDebugInfo();\n");
//Initialize DHT20 sensor
while(dht20.begin()){
Serial.println("Initialize DHT20 sensor failed");
delay(1000);
}
matrixled.clear();
Serial.print("System Init Done\n");
delay(1500);
最先初始化的是串口模块,波特率为115200。接下来初始化的模依次为LED和LED矩阵模块。LED配置为输出模式,LED矩阵在初试化后会全亮,表示上述相关模块初始化完成。
在 ArduinoCloud.begin(ArduinoIoTPreferredConnection);中配置Arduino Cloud连接相关的函数,其中WIFI名称及密码应该在thingProperties.h预先配置完成。(注:Arduino Cloud国内连接会偶有不稳定情况,如果网络在被代理后连接不上Arduino Cloud可以尝试关闭代理后重试)
最后初试化的为DHT20模块,该模块应用了UNO R4的硬件IIC接口,在该模块初始化完成后LED矩阵会全灭,代表工程所有模块初始化完成。
2.3.4 Loop代码介绍
Loop模块的代码会在上电后被重复运行,本文中主要用于两个方面,一是通过 ArduinoCloud.update()函数更新Arduino Cloud的云变量。二是通过temp、hum 两个变量获取DHT20传感器的温度和湿度参数。
ArduinoCloud.update();
// Your code here
//Get ambient temperature
temp = dht20.getTemperature();
Serial.print("temperature:");
Serial.print(temp);
Serial.print("C\n");
//Get relative humidity
hum = dht20.getHumidity()*100;
Serial.print(" humidity:");
Serial.print(hum);
Serial.println(" %RH\n");
delay(1000);
除此之外,该部分代码还包含了一些串口打印信息,主要用于通过串口调试传感器数据是否正常。
2.3.4 onMatrixChange函数代码介绍
该部分代码主要用于处理Arduino Cloud传下来的LED矩阵显示参数,并将该控制参数代表的LED矩阵画面实时显示出来。
// Add your code here to act upon Matrix change
int group;
if(matrix<=0){
group = 0;
matrixled.clear();
}else if(matrix>=100){
matrixled.loadFrame(fullOn);
}else{
group = matrix / 10;
switch (group) {
case 0:
// 当 expression 的值等于 value1 时执行的代码
matrixled.loadFrame(zero);
break;
case 1:
// 当 expression 的值等于 value1 时执行的代码
matrixled.loadFrame(one);
break;
case 2:
// 当 expression 的值等于 value2 时执行的代码
matrixled.loadFrame(two);
break;
// 更多 case 语句
case 3:
// 当 expression 的值等于 value3 时执行的代码
matrixled.loadFrame(three);
break;
case 4:
// 当 expression 的值等于 value4 时执行的代码
matrixled.loadFrame(four);
break;
case 5:
// 当 expression 的值等于 value5 时执行的代码
matrixled.loadFrame(five);
break;
case 6:
// 当 expression 的值等于 value6 时执行的代码
matrixled.loadFrame(six);
break;
case 7:
// 当 expression 的值等于 value7 时执行的代码
matrixled.loadFrame(seven);
break;
case 8:
// 当 expression 的值等于 value8 时执行的代码
matrixled.loadFrame(eight);
break;
case 9:
// 当 expression 的值等于 value9 时执行的代码
matrixled.loadFrame(sun);
break;
default:
// 当 expression 的值不匹配任何 case 时执行的代码
matrixled.loadFrame(fullOn);
break;
}
}
//matrix.clear();
delay(500); // Pause for 500 milliseconds (half a second)
因为云平台传下来的参数值范围为0~100,所以,参数更新后首先除以10,变为0~10的范围,然后再通过case函数依次显示在2.1中预先定义好的图案形状。
3. 项目总结
本次项目主要学习了Arduino Cloud平台的使用,通过下发控制命令和上传传感器值实现了与云平台的双向通讯。