【实验七】Arduino开发板实战
·
目录
本实验硬件平台为 Arduino Uno R3 主控板,核心主控芯片为 ATmega328P,具备多路数字与模拟引脚、串口通信接口,可通过 USB 直接供电和程序烧录。
软件开发环境为 Arduino IDE,本次测试代码为内置 07.Display 显示输出官方示例,路径为文件→示例→07.Display,包含 barGraph、RowColumnScanning 共 2 个范例,主要用于学习 LED 光柱条图模拟显示、行列扫描点阵矩阵驱动等 IO 可视化显示输出编程技术。

一、barGraph 实验测试
1.1 硬件接线方式
- 电位器接线:电位器两端引脚分别接 + 5V、GND,中间抽头引脚接模拟输入 A0
- LED 光柱接线:10 颗 LED 各自串联 220Ω 限流电阻,正极依次接 D2~D11 引脚,负极统一接 GND
- 整体供电:Arduino Uno R3 通过 USB 数据线连接电脑,完成供电与程序烧录,无需串口监视器即可直观观察光柱变化

1.2 中文注释代码
/* LED bar graph LED光柱条形图显示示例 读取电位器模拟输入数值,映射为LED点亮等级,实现光柱可视化指示效果; 电位器数值越大,点亮的LED数量越多,模拟条形柱状图显示模拟量大小。 电路说明: - 电位器中间引脚接模拟引脚A0 - 10个LED经220Ω电阻分别连接数字引脚2~11,负极接GND */ // 常量定义 const int analogPin = A0; // 电位器模拟输入引脚 const int ledCount = 10; // 光柱LED总数量 // 数组存储全部LED引脚编号 int ledPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; void setup() { // 遍历数组,将全部LED引脚设置为输出模式 for (int thisLed = 0; thisLed < ledCount; thisLed++) { pinMode(ledPins[thisLed], OUTPUT); } } void loop() { // 读取电位器原始0~1023模拟数值 int sensorReading = analogRead(analogPin); // 将模拟量映射为0~10的LED点亮等级 int ledLevel = map(sensorReading, 0, 1023, 0, ledCount); // 循环遍历所有LED,分级点亮 for (int thisLed = 0; thisLed < ledCount; thisLed++) { // 索引小于等级则点亮该LED if (thisLed < ledLevel) { digitalWrite(ledPins[thisLed], HIGH); } // 超出等级的LED全部熄灭 else { digitalWrite(ledPins[thisLed], LOW); } } }
1.3 核心原理
- 数组批量管理 IO 引脚:使用一维数组存储 10 路 LED 引脚,配合 for 循环批量初始化、批量控制输出,简化多 LED 管理代码
- 模拟量映射分级:
map()函数将 0~1023 连续模拟值线性映射为 0~10 的整数等级,对应可点亮的 LED 个数 - 光柱分级显示逻辑:循环遍历 LED 数组,索引序号小于当前等级则保持点亮,其余熄灭,形成从左到右逐级增长的光柱条形图
- 模拟量可视化方案:把看不见的电压数值转换为直观的灯光长度,可用于音量、液位、压力等传感器可视化指示
- 功能目的:学习数组批量 IO 控制、map 数值映射、分级显示逻辑,掌握多 LED 光柱可视化显示的基础编程方法
二、RowColumnScanning 实验测试
2.1 硬件接线方式
- 8×8 共阴极点阵矩阵接线(行接阳极,列接阴极)
- 点阵 8 根行阳极引脚依次接数字引脚:2、7、19 (A5)、5、13、18 (A4)、12、16 (A2)
- 点阵 8 根列阴极引脚依次接数字引脚:6、11、10、3、17 (A3)、4、8、9
- 模拟引脚 A2~A5 复用为数字输出引脚,扩展 IO 数量驱动矩阵
- 双电位器输入(XY 光标控制)
- X 轴电位器中间抽头接 A0,两端分别接 + 5V、GND
- Y 轴电位器中间抽头接 A1,两端分别接 + 5V、GND
- 整体供电:Arduino Uno R3 通过 USB 数据线供电、烧录程序,转动电位器可移动点阵上的光标位置

以下是基于上图的引脚连接矩阵:

2.2 中文注释代码
/* Row-Column Scanning 8×8点阵行列扫描显示示例 使用行列动态扫描驱动8×8共阴极LED点阵,搭配两路电位器控制屏幕内光标坐标; 二维数组存储每一个灯珠亮灭状态,逐行循环刷新实现稳定画面显示。 适配Lumex LDM-24488NI共阴极点阵,行引脚为阳极,列引脚为阴极。 电路说明: - 点阵行阳极:D2、D7、A5、D5、D13、A4、D12、A2 - 点阵列阴极:D6、D11、D10、D3、A3、D4、D8、D9 - 两个电位器分别接模拟A0、A1,控制光标X、Y坐标 */ // 一维数组:存储8根点阵行阳极引脚 const int row[8] = { 2, 7, 19, 5, 13, 18, 12, 16 }; // 一维数组:存储8根点阵列阴极引脚 const int col[8] = { 6, 11, 10, 3, 17, 4, 8, 9 }; // 二维数组pixels[行][列],存储8×8点阵每个灯珠的亮灭状态 int pixels[8][8]; // 光标当前坐标 int x = 5; int y = 5; void setup() { // 初始化所有行、列引脚为输出模式 for (int thisPin = 0; thisPin < 8; thisPin++) { pinMode(col[thisPin], OUTPUT); pinMode(row[thisPin], OUTPUT); // 阴极默认高电平,所有LED初始熄灭 digitalWrite(col[thisPin], HIGH); } // 初始化整个点阵:全部灯珠默认熄灭(HIGH) for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { pixels[x][y] = HIGH; } } } void loop() { readSensors(); // 读取电位器,更新光标坐标 refreshScreen(); // 行列扫描刷新点阵画面 } // 读取两路电位器,更新光标XY位置 void readSensors() { // 清除上一帧光标位置 pixels[x][y] = HIGH; // A0映射为X轴,数值反转实现左右方向对应 x = 7 - map(analogRead(A0), 0, 1023, 0, 7); // A1映射为Y轴 y = map(analogRead(A1), 0, 1023, 0, 7); // 设置新光标位置为点亮状态(LOW) pixels[x][y] = LOW; } // 逐行动态扫描刷新8×8点阵屏幕 void refreshScreen() { // 遍历每一行阳极 for (int thisRow = 0; thisRow < 8; thisRow++) { digitalWrite(row[thisRow], HIGH); // 选中当前行,阳极拉高 // 遍历该行所有列阴极 for (int thisCol = 0; thisCol < 8; thisCol++) { int thisPixel = pixels[thisRow][thisCol]; digitalWrite(col[thisCol], thisPixel); // 当前像素需要点亮时,阴极拉低;扫描完成立即拉高消隐防止重影 if (thisPixel == LOW) { digitalWrite(col[thisCol], HIGH); } } digitalWrite(row[thisRow], LOW); // 关闭当前行,切换下一行 } }
2.3 核心原理
- 二维数组画面缓存:
pixels[8][8]二维数组存储 8×8 点阵每颗 LED 的亮灭状态,相当于屏幕显存,统一管理画面内容 - 动态行列扫描驱动:逐行拉高中阳极,再根据显存状态控制每一列阴极电平;利用人眼视觉暂留快速循环刷新,实现稳定画面
- 共阴极点阵电平逻辑:行阳极 HIGH、列阴极 LOW 时对应 LED 点亮;扫描完成立刻拉高阴极消隐,消除拖影、重影
- 模拟量坐标映射:两路电位器 ADC 数值通过
map()映射为 0~7 点阵坐标,一路反转映射实现左右方向匹配,控制光标移动 - IO 引脚复用扩展:复用 A2~A5 模拟引脚作为数字输出,扩展可用 IO 口,满足 8×8 点阵 16 根控制线需求
- 功能目的:学习二维数组存储画面、点阵行列动态扫描驱动原理,掌握模拟量映射坐标、多 IO 引脚扩展控制,理解 LED 矩阵低占空比扫描显示技术
更多推荐

所有评论(0)