Arduino-抢答器

该实验介绍了如何使用Arduino创建一个简单的抢答器,通过按键控制不同颜色的LED灯亮起。当按下特定颜色的按键时,对应LED灯亮起,直至按下复位键熄灭。实验涉及按键输入、LED输出及循环扫描技术。

抢答器实验

实验器件:

■ 按键开关:4 个

■ 红色LED灯:1 个

■ 黄色LED灯:1 个

■ 绿色LED灯:1 个

■ 220欧电阻:7 个

■ 面包板:1 个

■ 多彩杜邦线:若干

实验连线

将代码上传到开发板。

程序代码

int redled=8; //红色LED 输出

int yellowled=7; //黄色LED输出

int greenled=6; //绿色LED输出

int redpin=5; //红色按键引脚

int yellowpin=4; //黄色按键引脚

int greenpin=3; //绿色按键引脚

int restpin=2; //复位按键引脚定义

int red;

int yellow;

int green;

void setup()

{

pinMode(redled,OUTPUT);

pinMode(yellowled,OUTPUT);

pinMode(greenled,OUTPUT);

pinMode(redpin,INPUT);

pinMode(yellowpin,INPUT);

pinMode(greenpin,INPUT);

}

void loop() //按键循环扫描

{

red=digitalRead(redpin);

yellow=digitalRead(yellowpin);

green=digitalRead(greenpin);

if(red==LOW)RED_YES();

if(yellow==LOW)YELLOW_YES();

if(green==LOW)GREEN_YES();

}

void RED_YES()//一直执行红灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,HIGH);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,LOW);

}

clear_led();

}

void YELLOW_YES()//一直执行黄灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,LOW);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,HIGH);

}

clear_led();

}

void GREEN_YES()//一直执行绿灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,LOW);

digitalWrite(greenled,HIGH);

digitalWrite(yellowled,LOW);

}

clear_led();

}

void clear_led()//清除LED

{

digitalWrite(redled,LOW);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,LOW);

}

实验结论

当红灯按键按下时,红色LED灯被点亮,按其他按键不会点亮其他LED灯。按下复位按键,LED灯熄灭。

按下黄灯按键,黄灯点亮。按其他按键不会点亮其他LED灯。按下复位按键,LED灯熄灭。

按下绿灯按键,绿灯点亮。按其他按键不会点亮其他LED灯。按下复位按键,LED灯熄灭。

### 使用Arduino实现三人抢答器 #### 电路图设计 为了构建一个简单的三人抢答器,需要三个按钮作为输入设备以及对应的指示灯来显示哪个选手按下按钮。这些组件通过面包板连接到Arduino开发板。 对于每个参赛者而言,会有一个按钮和一个LED相连。按钮的一端接地(GND),另一端接到数字引脚并带有上拉电阻;而LED则正极接至另一个数字引脚负极经过限流电阻回到GND。这样的配置可以确保当某个按钮被按下的时候能够触发相应的中断服务程序,并点亮对应编号的LED表示该名选手成功抢答[^1]。 #### Arduino代码示例 下面是一个用于创建三人抢答器的基础Arduino草图(Sketch): ```cpp const byte buttonPins[] = {2, 3, 4}; // 定义三个按钮所连的引脚 const byte ledPins[] = {5, 6, 7}; // 对应定义三盏LED所在的引脚 volatile bool isAnswered = false; byte winnerIndex; void setup() { Serial.begin(9600); for(int i=0;i<sizeof(buttonPins)/sizeof(*buttonPins);++i){ pinMode(buttonPins[i], INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(buttonPins[i]), handleButtonPress, FALLING); pinMode(ledPins[i], OUTPUT); digitalWrite(ledPins[i], LOW); } } void loop(){ if(isAnswered){ delay(2000); resetGame(); } } // 中断处理函数 void handleButtonPress(){ if(!isAnswered){ noInterrupts(); // 关闭所有中断防止其他按钮干扰 for(byte index=0;index<sizeof(buttonPins)/sizeof(*buttonPins);++index){ if(!digitalRead(buttonPins[index])){ winnerIndex=index; break; } } isAnswered=true; interrupts(); // 开启中断继续监听剩余事件 lightWinnerLed(winnerIndex); printWinnerInfo(winnerIndex+1); } } void lightWinnerLed(const byte& playerNumber){ for(byte i=0;i<sizeof(ledPins)/sizeof(*ledPins);++i){ digitalWrite(ledPins[i],LOW); } digitalWrite(ledPins[playerNumber], HIGH); } void printWinnerInfo(const byte& playerNumber){ String message="Player "; message+=String(playerNumber)+" wins!"; Serial.println(message); } void resetGame(){ isAnswered=false; for(byte i=0;i<sizeof(ledPins)/sizeof(*ledPins);++i){ digitalWrite(ledPins[i],LOW); } } ``` 此段代码实现了基本的功能需求,在实际应用中可能还需要考虑更多细节优化用户体验,比如加入蜂鸣器提示音效或是LCD显示屏展示更多信息等扩展功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻筠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值