一、项目目标
点灯!通过网络连接到智能云端,尝试将设备模拟成可以控制的灯,远程端发送指令,将灯光开启关闭,或调整灯光的亮度,0到90%时,矩阵亮起逐渐变大的范围,90%以上时,灯板显示出太阳的图标。
二、硬件部分
1.Arduino UNO WiFi R4开发板:作为核心控制单元,负责运行程序和处理各种输入输出信号。
2.LED灯:开发版上8x12的LED。
3.电阻:用于限制通过LED的电流,保护LED不被烧毁。
4.电源:可以使用USB线连接电脑为Arduino开发板供电,也可以使用外部电源适配器(需注意电压和接口匹配)。
三、流程设计
四、设计思路
(1)头文件和全局变量
(2)定义函数
DisplayMartrixLED函数——如何显示LED矩阵
DisplaySun函数——显示太阳图案
ClearMarixLED函数——清空LED矩阵的显示
setup函数——初始化
五、软件部分
1.开发环境:使用Arduino Cloud,这是一个专门用于Arduino开发的开发环境。
2.编写代码
(1)头文件和全局变量
#include <Arduino_LED_Matrix.h>
#include "thingProperties.h"
byte frame[8][12] = //LED矩阵
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
ArduinoLEDMatrix matrix;
头文件:
#include <Arduino_LED_Matrix.h> 引入了用于控制LED矩阵的库。
#include "thingProperties.h" 引入了与Arduino Cloud相关的属性文件。
全局变量:
matrix_led 是一个在Arduino Cloud中定义的变量,用于控制LED矩阵的显示。
frame 是一个8x12的二维数组,用于存储LED矩阵的显示图案。
matrix 是 ArduinoLEDMatrix 类型的对象,用于控制LED矩阵。
(2)函数定义
DisplayMartrixLED函数
void DisplayMartrixLED()
{
Serial.println("DisplayMartrixLED()");
if(matrix_led == 0)
{
Serial.println("matrix_led == 0");
ClearMarixLED();
}
else if(matrix_led > 0 && matrix_led <= 90)
{
Serial.println("matrix_led > 0 && matrix_led < 100");
for(int i = 0; i < 8; i++)
for(int j = 0; j < 12; j++)
{
if(j <= matrix_led / 10)
{
frame[i][j] = 1;
}
else
{
frame[i][j] = 0;
}
}
}
else
{
DisplaySun();
}
matrix.renderBitmap(frame, 8, 12);
}
这个函数根据 matrix_led 的值来决定如何显示LED矩阵:
如果 matrix_led 等于0,调用 ClearMarixLED 函数清空LED矩阵。
如果 matrix_led 大于0且小于等于90,根据 matrix_led 的值设置 frame 数组中部分元素为1,形成特定图案。
如果 matrix_led 大于90,调用 DisplaySun 函数显示太阳图案。
最后调用 matrix.renderBitmap(frame, 8, 12) 显示最终的图案。
DisplaySun函数
void DisplaySun(){
ClearMarixLED();
frame[0][0] = 1;
frame[0][9] = 1;
frame[1][2] = 1;
frame[1][5] = 1;
frame[1][8] = 1;
frame[2][4] = 1;
frame[2][6] = 1;
frame[3][3] = 1;
frame[3][7] = 1;
frame[4][4] = 1;
frame[4][6] = 1;
frame[5][2] = 1;
frame[5][5] = 1;
frame[5][8] = 1;
frame[6][1] = 1;
frame[6][9] = 1;
frame[7][0] = 1;
frame[7][10] = 1;
}
这个函数用于在LED矩阵上显示太阳图案。它首先调用 ClearMarixLED 清空矩阵,然后设置 frame 数组中的特定元素为1,形成太阳的形状。
ClearMarixLED函数
void ClearMarixLED()
{
for(int i = 0; i < 8; i++)
for(int j = 0; j < 12; j++)
{
frame[i][j] = 0;
}
}
这个函数用于清空 frame 数组,将所有元素设置为0,从而清空LED矩阵的显示。
(3)setup函数
void setup() {
// Initialize matrix LED
matrix.begin();
matrix.renderBitmap(frame, 8, 12);
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance
在 setup 函数中:
调用 matrix.begin() 初始化LED矩阵。
调用 matrix.renderBitmap(frame, 8, 12) 显示初始的空白图案。
初始化串口通信,波特率为9600。
六、完成功能
1. 0到10点亮第一排
2. 10到20点亮第二排
3. 20到30点亮第三排
4. 30到40点亮第四排
5. 40到50点亮第五排
6. 50到60点亮第六排
7. 60到70点亮第七排
8. 70到80点亮第八排
9. 80到89点亮第九排
10. 90点亮第十排
11. 91到100呈现“太阳”的图标
七、程序代码:
#include <Arduino_LED_Matrix.h>
#include "thingProperties.h"
byte frame[8][12] = //LED矩阵
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
ArduinoLEDMatrix matrix;
void DisplayMartrixLED()
{
Serial.println("DisplayMartrixLED()");
if(matrix_led == 0)
{
Serial.println("matrix_led == 0");
ClearMarixLED();
}
else if(matrix_led > 0 && matrix_led <= 90)
{
Serial.println("matrix_led > 0 && matrix_led < 100");
for(int i = 0; i < 8; i++)
for(int j = 0; j < 12; j++)
{
if(j <= matrix_led / 10)
{
frame[i][j] = 1;
}
else
{
frame[i][j] = 0;
}
}
}
else
{
DisplaySun();
}
matrix.renderBitmap(frame, 8, 12);
}
void DisplaySun(){
ClearMarixLED();
//显示太阳图案
frame[0][0] = 1; //二维数组,用于存储LED矩阵的显示图案
frame[0][9] = 1;
frame[1][2] = 1;
frame[1][5] = 1;
frame[1][8] = 1;
frame[2][4] = 1;
frame[2][6] = 1;
frame[3][3] = 1;
frame[3][7] = 1;
frame[4][4] = 1;
frame[4][6] = 1;
frame[5][2] = 1;
frame[5][5] = 1;
frame[5][8] = 1;
frame[6][1] = 1;
frame[6][9] = 1;
frame[7][0] = 1;
frame[7][10] = 1;
}
void ClearMarixLED()
{
for(int i = 0; i < 8; i++)
for(int j = 0; j < 12; j++)
{
frame[i][j] = 0;
}
}
void setup() { //初始化LED矩阵和串口通信
// Initialize matrix LED
matrix.begin();
matrix.renderBitmap(frame, 8, 12);
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
/*
The following function allows you to obtain more information
related to the state of network and IoT Cloud connection and errors
the higher number the more granular information you’ll get.
The default is 0 (only errors).
Maximum is 4
*/
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
void loop() {
ArduinoCloud.update();
// Your code here
}
/*
Since MatrixLed is READ_WRITE variable, onMatrixLedChange() is
executed every time a new value is received from IoT Cloud.
*/
void onMatrixLedChange() {
// Add your code here to act upon MatrixLed change
Serial.println("onMatrixLedChange()");
Serial.println(matrix_led);
DisplayMartrixLED();
}
八、调试与测试
1.完成代码编写后,将其上传到Arduino UNO WiFi R4开发板。确保开发板已正确连接到电脑,并且在Arduino Cloud中选择了正确的开发板和端口。
2.查看程序运行过程中的调试信息,例如WiFi连接状态、按钮状态读取等。
3.手动测试LED的亮灭控制,检查电路连接是否正确,按钮是否正常工作。
4.对于网络远程控制功能,使用电脑连接到同一网络,测试LED的功能。
九、优化与扩展
1.优化代码:检查代码的效率和可读性,减少不必要的变量定义、优化循环结构等。
2.增加用户界面:在以后的学习中可以使用LCD显示屏或OLED显示屏来显示LED的状态和其他相关信息,提供更友好的用户界面。
3.扩展控制功能:后面可以添加更多的控制方式,如通过蓝牙连接手机APP进行控制,或者与智能家居系统集成,实现更复杂的自动化控制。
4.提高稳定性:在代码中添加错误处理机制,例如处理WiFi连接失败、网络请求超时等情况,提高系统的稳定性和可靠性。
十、心得体会:
在本次 Arduino uno R4 WiFi 点灯项目中,我收获很多。在软件编程环节,熟悉 Arduino 编程环境,运用 C/C++语言控制引脚电平来实现点灯操作。当成功通过 WiFi 模块远程控制灯的亮灭时,成就感油然而生。这个项目不仅提升了我的动手实践能力,还加深了我对物联网概念的理解。它让我明白,通过简单的硬件与编程结合,就能构建出具有实际应用价值的物联网小系统,为我今后探索更复杂的物联网项目奠定了坚实基础,也激发了我对智能硬件开发的浓厚兴趣。