用Arduino写个抢答器

描述

1前言

事情是这样的,本来在准备公众号文章,想着用tinkercad模拟一下自己写的程序,结果无论自己如何调整程序,都无法达到预期的效果,后来经过层层排查发现是被一个按键整破防了。

按钮

这种四脚按键的四个引脚在按下之前是两两相通的原理图如下:

按钮

我在之前一直认为这种按钮的四个脚都是独立的,并且在按下后四个脚都会相通,经过查询资料发现原来自己认为的一直都是错的,这里把错误分享给大家,希望大家引以为戒(应该也不会有人像我一样傻吧)

2效果演示

所需材料:

  • Arduinio uno开发板一个
  • 按键四个
  • LED灯三个
  • 电阻七个
  • 杜邦线若干

连接电路图:按钮

实现功能:

1、主持人按下按钮才能开始抢答,并且闪灯提示;

2、选手A抢答后选手B、C将无法进行抢答;

3、主持人再次点击按钮可以恢复抢答模式,并闪灯提示;

3主程序

//定义LED灯的引脚
const int greenLed = 10;
const int yellowLed = 9;
const int redLed = 8;

//定义按键开关引脚
const int greenButton = 2; 
const int yellowButton = 3; 
const int redButton = 4;
const int startButton = 5; 

int r=1,y=1,b=1,s=1;  //定义三个变量存储三个按键开关的状态
bool ready = false;   //定义一个变量用于记录抢答器是否就绪的状态

void setup() {
  // put your setup code here, to run once:
  // 定义引脚输入输出状态
  pinMode(redLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(redButton, INPUT);
  pinMode(yellowButton, INPUT);
  pinMode(greenLed, INPUT);
  pinMode(startButton, INPUT);

  //将LED灯的初始化状态设定为熄灭
  digitalWrite(redLed, LOW);
  digitalWrite(yellowLed, LOW);
  digitalWrite(greenLed, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  // 读取四个按键开关的状态
     r = digitalRead(redButton);
     y = digitalRead(yellowButton);
     b = digitalRead(greenButton);
     s = digitalRead(startButton);

     if(s==0){  //如果主持人按下开始抢答按钮,选手前面的LED闪烁3次
       for(int i=0;i<3;i++){
        digitalWrite(redLed, HIGH);
        digitalWrite(yellowLed, HIGH);
        digitalWrite(greenLed, HIGH);
        delay(500);
        digitalWrite(redLed, LOW);
        digitalWrite(yellowLed, LOW);
        digitalWrite(greenLed, LOW);
        delay(500);
      }
      ready = true;
     }

     //当抢答器处于就绪状态时
     //红色按键按下
     if(ready && r==0){
      digitalWrite(redLed, HIGH);
      ready = false;
      }

      //黄色按键按下
     if(ready && y==0){
      digitalWrite(yellowLed, HIGH);
      ready = false;
      }

      //蓝色按键按下
      if(ready && b==0){
      digitalWrite(greenLed, HIGH);
      ready = false;
      }       
}

4效果演示

,时长00:41

[ ]

5代码分析

在实现抢答环节中主要用到了if函数,但是有一个参数至关重要,ready的状态直接决定了能否进入if循环,所以使用ready = false;实现各个按键的互锁。

判断条件ready && y==0用来判断是否已经准备就绪,并且其他人还未成功抢到,只有这两种情况同时满足才能进入if,并将ready的状态改为false,防止进入其他if

另外有的朋友可能会说if放置的先后顺序会影响结果,其实代码的运行速度是非常快的,并不会出现像大家想想的那种情况,所以在一定程度上还是公平的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分