目录

1.所需要的材料

2.实验的步骤

3.解释代码

​编辑

4.对代码的改进

5.扩展

6.作业


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. 数据和操作(函数)绑在一起(盒子里既有工具,又有工具用的零件);
  2. 外面的代码不能随便改盒子里的数据(避免误操作,比如不小心把 LED 引脚号改乱);
  3. 想用时只需要 “按规则调用工具”(不用管内部数据怎么放、工具怎么转)。

于是通过豆包有了改进后的以下代码

// 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,谢谢观看!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐