《Arduino & C 实战 | 实验 —— Arduino 按钮随机 LED 控制》
本文介绍了基于Arduino的按钮随机LED实验。实验使用Arduino Uno控制器、5个LED灯、电阻和按钮等材料,通过编写代码实现按下按钮随机点亮不同颜色LED的功能。文章详细解析了初始代码的实现原理,包括引脚定义、按钮状态读取、随机数生成和LED控制逻辑。针对初始代码进行了优化改进,通过引入数组存储LED引脚、添加防抖处理、避免重复随机数等,使代码更简洁高效。最后提出作业要求,建议结合AI
目录
1.所需要的材料
| 物品 | 数量 |
| Arduino Uno控制器 | 1 |
| LED小灯 | 5 |
| 220Ω电阻 | 5 |
| 10kΩ电阻 | 1 |
| 面包版 | 1 |
| 按钮 | 1 |
| 连接线若干 | 19 |
2.实验的步骤
- 先如图所示连接(不要连错了)


- 使用Arduino IDE输入此段代码(未改进状态)
const int redLed = 2; const int yellowLed = 3; const int whiteLed = 4; const int blueLed = 5; const int greenLed = 6; const int askButton = 12; int askButtonState = 0; int awnser = 0; void setup() { pinMode(redLed, OUTPUT); pinMode(yellowLed, OUTPUT); pinMode(whiteLed, OUTPUT); pinMode(blueLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(askButton, INPUT); } void loop() { askButtonState = digitalRead(askButton); if (askButtonState == HIGH) { digitalWrite(redLed, LOW); digitalWrite(yellowLed, LOW); digitalWrite(whiteLed, LOW); digitalWrite(blueLed, LOW); digitalWrite(greenLed, LOW); delay(100); awnser = random(5); switch (awnser) { case 0: digitalWrite(greenLed, LOW); digitalWrite(yellowLed, LOW); digitalWrite(whiteLed, LOW); digitalWrite(blueLed, LOW); digitalWrite(redLed, HIGH); delay(1000); break; case 1: digitalWrite(redLed, LOW); digitalWrite(whiteLed, LOW); digitalWrite(blueLed, LOW); digitalWrite(greenLed, LOW); digitalWrite(yellowLed, HIGH); delay(1000); break; case 2: digitalWrite(redLed, LOW); digitalWrite(yellowLed, LOW); digitalWrite(blueLed, LOW); digitalWrite(greenLed, LOW); digitalWrite(whiteLed, HIGH); delay(1000); break; case 3: // digitalWrite(redLed, LOW); digitalWrite(whiteLed, LOW); digitalWrite(yellowLed, LOW); digitalWrite(greenLed, LOW); digitalWrite(blueLed, HIGH); delay(1000); break; case 4: digitalWrite(redLed, LOW); digitalWrite(whiteLed, LOW); digitalWrite(blueLed, LOW); digitalWrite(yellowLed, LOW); digitalWrite(greenLed, HIGH); delay(1000); break; } } }3.解释代码
const int redLed = 2; // 红色LED接2号引脚
const int yellowLed = 3; // 黄色LED接3号引脚
const int whiteLed = 4; // 白色LED接4号引脚
const int blueLed = 5; // 蓝色LED接5号引脚
const int greenLed = 6; // 绿色LED接6号引脚
const int askButton = 12;// 按钮接12号引脚
const int:表示「定义一个不会变的整数」(比如 LED 接的引脚号固定,不会中途变)
int askButtonState = 0; // 存储按钮的状态(0=没按,1=按下)
int awnser = 0; // 存储随机数(0-4),用来决定亮哪盏灯
int:表示「整数变量」(值可以变)askButtonState:专门存按钮的状态(HIGH = 按下,LOW = 没按)awnser:专门存随机生成的数字(0 对应红灯、1 对应黄灯...4 对应绿灯)
void setup() {
pinMode(redLed, OUTPUT); // 红色LED引脚设为「输出模式」(给灯供电)
pinMode(yellowLed, OUTPUT); // 黄色LED引脚设为输出模式
pinMode(whiteLed, OUTPUT); // 白色LED引脚设为输出模式
pinMode(blueLed, OUTPUT); // 蓝色LED引脚设为输出模式
pinMode(greenLed, OUTPUT); // 绿色LED引脚设为输出模式
pinMode(askButton, INPUT); // 按钮引脚设为「输入模式」(读取按钮是否按下)
}
void setup():Arduino 特有的函数,只运行一次(程序启动时初始化用)pinMode(引脚, 模式):设置引脚的作用OUTPUT(输出):给引脚送电 / 断电,控制 LED 亮灭INPUT(输入):读取引脚的信号(比如按钮按下时会有高电平信号)
void loop() {
// 第一步:读取按钮状态,存到 askButtonState 变量里
askButtonState = digitalRead(askButton);
// 第二步:判断按钮是否被按下(HIGH=按下)
if (askButtonState == HIGH) {
// 按下后先做:所有LED都熄灭(防止多灯同时亮)
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(whiteLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(greenLed, LOW);
delay(100); // 等待100毫秒(0.1秒),让熄灭更稳定
// 第三步:生成一个随机数(0、1、2、3、4中的一个),存到 awnser 里
awnser = random(5);
// 第四步:根据随机数,决定亮哪盏灯(switch=「分支判断」)
switch (awnser) {
case 0: // 如果随机数是0 → 亮红灯
digitalWrite(greenLed, LOW); // 先确保其他灯灭(冗余但保险)
digitalWrite(yellowLed, LOW);
digitalWrite(whiteLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(redLed, HIGH); // 红灯通电(亮)
delay(1000); // 保持亮1秒(1000毫秒)
break; // 结束这个分支,不往下执行
case 1: // 随机数是1 → 亮黄灯
digitalWrite(redLed, LOW);
digitalWrite(whiteLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(greenLed, LOW);
digitalWrite(yellowLed, HIGH);
delay(1000);
break;
case 2: // 随机数是2 → 亮白灯
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(greenLed, LOW);
digitalWrite(whiteLed, HIGH);
delay(1000);
break;
case 3: // 随机数是3 → 亮蓝灯
digitalWrite(redLed, LOW);
digitalWrite(whiteLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, HIGH);
delay(1000);
break;
case 4: // 随机数是4 → 亮绿灯
digitalWrite(redLed, LOW);
digitalWrite(whiteLed, LOW);
digitalWrite(blueLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, HIGH);
delay(1000);
break;
}
}
}
void loop():Arduino 特有的函数,程序启动后会一直重复执行(循环不停)- 关键函数解释:
digitalRead(引脚):读取输入引脚的状态(返回 HIGH = 高电平 / 按下,LOW = 低电平 / 没按)
digitalWrite(引脚, 状态):控制输出引脚的状态(HIGH = 通电 / 亮,LOW = 断电 / 灭)delay(毫秒):让程序暂停指定时间(比如 delay (1000) 就是停 1 秒)random(5):生成一个 0~4 之间的随机整数(因为括号里是 5,不包含 5 本身)switch...case:相当于「选择题」,根据awnser的值,执行对应的分支(亮对应的灯)- 每个
case后面的break很重要:表示执行完这个分支就退出,不让程序继续往下跑
- 每个

4.对代码的改进
// 1. 定义LED和按钮引脚(保持原有接线不变)
const int redLed = 2;
const int yellowLed = 3;
const int whiteLed = 4;
const int blueLed = 5;
const int greenLed = 6;
const int askButton = 12;
// 2. 定义变量(新增lastAnswer存储上一次随机数,修复awnser拼写错误)
int askButtonState = 0;
int answer = 0; // 修正拼写错误(原awnser→answer)
int lastAnswer = -1; // 存储上一次的随机数(初始值-1,确保第一次能正常生成)
// 新增LED引脚数组,简化后续操作
const int ledPins[] = {redLed, yellowLed, whiteLed, blueLed, greenLed}; // 顺序对应case 0-4
void setup() {
// 3. 初始化引脚(用循环简化重复代码,不用逐个写pinMode)
for (int i = 0; i < 5; i++) {
pinMode(ledPins[i], OUTPUT); // 循环初始化5个LED为输出
}
pinMode(askButton, INPUT); // 按钮为输入
// 4. 设置随机数种子,让每次上电的随机序列都不同(A0不用接线)
randomSeed(analogRead(A0));
}
void loop() {
// 5. 读取按钮状态+防抖处理(避免一次按下多次响应)
askButtonState = digitalRead(askButton);
if (askButtonState == HIGH) {
delay(20); // 防抖延时20毫秒,过滤物理抖动
// 再次读取确认是真按下(双重验证,防抖更稳)
if (digitalRead(askButton) != HIGH) {
return; // 不是真按下,直接返回循环
}
// 6. 统一熄灭所有LED(只写一次,简化代码)
for (int i = 0; i < 5; i++) {
digitalWrite(ledPins[i], LOW);
}
delay(100); // 稳定熄灭
// 7. 生成随机数(避免连续重复同一灯)
do {
answer = random(5); // 生成0-4的随机数
} while (answer == lastAnswer); // 如果和上一次相同,重新生成
lastAnswer = answer; // 更新上一次的随机数
// 8. 简化亮灯逻辑(用数组直接对应,不用switch大量重复代码)
digitalWrite(ledPins[answer], HIGH); // 点亮随机对应的LED
delay(1000); // 亮1秒
digitalWrite(ledPins[answer], LOW); // 1秒后自动熄灭(解决不灭问题)
}
}
视频展示
video_20251108_161231
5.扩展
. askButtonState = digitalRead(askButton); if (askButtonState == HIGH) 这两句是干嘛用的
“先去查按钮有没有被按,把结果记在小本子上;然后看小本子,如果记的是‘按下’,就执行后面的亮灯逻辑;如果没按,就啥也不做,回到循环开头再查一次。”
. 解释一下random()函数
按你要求的范围,随机抽一个整数出来
用法 1:random(最大值) → 抽 0 到「最大值 - 1」的随机数
比如代码里的 random(5):
用法 2:random(最小值, 最大值) → 抽「最小值」到「最大值 - 1」的随机数
比如 random(1, 6):
6.作业
根据Arduino 按钮随机LED实验,自行定义一个函数, 优化上代码,进行数据的封装,要求结合DeepSeek或者豆包等 AI工具。
首先需要知道自行定义函数和数据封装是什么
| 自定义函数 | 一个函数只干一件事(比如 “按钮读取器” 就只负责判断按钮有没有被按,不管别的); 用的时候不用关心内部怎么工作(就像用榨汁机不用懂电机原理,按个键就行); 能减少重复代码(之前写 10 行,现在 1 行调用就搞定)。 |
| 数据封装 |
|
于是通过豆包有了改进后的以下代码
// 1. 把“LED相关的常量+变量”集中定义(数据集中,为封装做准备)
const int ledPins[] = {2, 3, 4, 5, 6}; // 红、黄、白、蓝、绿
const int BUTTON_PIN = 12;
const int LED_COUNT = 5;
const int LIGHT_DURATION = 1000; // 亮灯时长(毫秒)
// 2. 自定义函数:初始化硬件(把“初始化逻辑”拆出来)
void initHardware() {
for (int i = 0; i < LED_COUNT; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // 初始灭灯
}
pinMode(BUTTON_PIN, INPUT);
randomSeed(analogRead(A0)); // 随机数种子初始化
}
// 3. 自定义函数:读取按钮(防抖逻辑封装在这里)
bool readButtonWithDebounce() {
int state = digitalRead(BUTTON_PIN);
if (state == HIGH) {
delay(20); // 防抖
if (digitalRead(BUTTON_PIN) == HIGH) {
return true; // 真按下,返回true
}
}
return false; // 没按下,返回false
}
// 4. 自定义函数:生成不重复的随机数(随机数逻辑封装在这里)
int generateUniqueRandom(int lastNum) {
int newNum;
do {
newNum = random(LED_COUNT);
} while (newNum == lastNum);
return newNum; // 返回新的不重复随机数
}
// 5. 自定义函数:LED控制(亮灯、灭灯、反馈逻辑封装在这里)
void controlLED(int ledIndex) {
// 统一灭灯
for (int i = 0; i < LED_COUNT; i++) {
digitalWrite(ledPins[i], LOW);
}
delay(100);
// 亮灯+自动灭灯
digitalWrite(ledPins[ledIndex], HIGH);
delay(LIGHT_DURATION);
digitalWrite(ledPins[ledIndex], LOW);
}
// 全局变量(只保留必要的,其他数据在函数内定义)
int lastAnswer = -1;
void setup() {
initHardware(); // 调用自定义函数:初始化硬件
}
void loop() {
// 调用自定义函数:读按钮(不用关心防抖细节,只看返回值)
if (readButtonWithDebounce()) {
// 调用自定义函数:生成随机数(不用关心生成逻辑)
int currentAnswer = generateUniqueRandom(lastAnswer);
// 调用自定义函数:控制LED(不用关心亮灭细节)
controlLED(currentAnswer);
lastAnswer = currentAnswer;
}
}
这里是Qx,谢谢观看!!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)