你是否还在为不能使Arduino实现按钮控制随机点亮LED灯而感到困惑?

2025博客之星年度评选已开启 10w+人浏览 3.3k人参与

实验目的

通过Arduino实现按钮控制随机点亮LED灯的效果,掌握数字输入(按钮)和数字输出(LED)的基本用法,并学习随机数生成的应用。

所需材料

  • Arduino开发板(如UNO)
  • 面包板
  • 1个按钮开关
  • 3个LED灯(不同颜色)
  • 220Ω电阻(限流用)
  • 10kΩ电阻(按钮下拉用)
  • 杜邦线若干

电路连接

  • 将按钮一端接Arduino的D2引脚,另一端通过10kΩ电阻接地,实现下拉。按钮与D2连接处同时接5V电源。
  • 三个LED的正极分别接D3D4D5引脚,负极通过220Ω电阻接地。

代码实现

以下是修改后的代码,优化了逻辑结构并修复了原始代码中的问题(如case 1缺少break语句、冗余的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;  // 按钮引脚

int askButtonState = 0;
int answer = 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) {
    // 清除所有LED
    digitalWrite(redLed, LOW);
    digitalWrite(yellowLed, LOW);
    digitalWrite(whiteLed, LOW);
    digitalWrite(blueLed, LOW);
    digitalWrite(greenLed, LOW);
    
    delay(100);  // 防抖延迟
    answer = random(5);  // 生成0-4的随机数
    
    switch (answer) {
      case 0:  // No
        digitalWrite(redLed, HIGH);
        break;
      case 1:  // Rather not
        digitalWrite(yellowLed, HIGH);
        break;
      case 2:  // Maybe
        digitalWrite(whiteLed, HIGH);
        break;
      case 3:  // Rather yes
        digitalWrite(blueLed, HIGH);
        break;
      case 4:  // Yes
        digitalWrite(greenLed, HIGH);
        break;
    }
    delay(1000);  // 结果展示时间
  }
}

主要改进点

  1. 冗余代码删除:移除了每个case中重复设置的LED关闭语句,改为在switch前统一清除状态。
  2. 修复逻辑错误:补全了case 1遗漏的break语句。
  3. 变量拼写修正:将awnser统一改为answer
  4. 延迟优化:将结果展示的delay(1000)移至switch外,避免重复代码。
  5. 注释规范化:调整注释格式,增强可读性。

使用方法

  • 按下按钮后,系统会随机点亮一个LED,对应不同回答:
    • 红色:No
    • 黄色:Rather not
    • 白色:Maybe
    • 蓝色:Rather yes
    • 绿色:Yes
  • 每次触发后会有1秒的结果展示时间。

实验现象

每次按下按钮时,三个LED中会随机点亮一个,其他LED保持熄灭状态。

关键点解析

  • 下拉电阻:10kΩ电阻确保按钮未按下时D2引脚稳定接地,避免信号浮动。
  • 防抖处理:通过延时和状态比对(lastButtonState)消除按钮机械抖动的影响。
  • 随机数生成randomSeed(analogRead(0))利用悬空模拟引脚的噪声初始化随机数,增强随机性。

总结与心得

  • 硬件设计:合理使用限流电阻和下拉电阻是保证电路稳定性的关键。LED电流需控制在安全范围内(通常5-20mA)。
  • 软件逻辑:通过状态机(记录上一次按钮状态)实现可靠的触发检测,避免误判。随机数需配合种子初始化,否则可能重复相同序列。
  • 扩展思考:可尝试增加更多LED或加入蜂鸣器,实现声光同步随机效果。通过串口打印调试信息能进一步优化代码可靠性。

此实验结合了输入检测、输出控制和算法应用,适合作为Arduino初学者的综合性练习项目。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值