猜数字案例
有一位8段数码管,和一个按钮。每次按下按钮,随机生成一个0~9的数并在LED显示器上显示出来。
首先先可以参考下官网上的案例。这个案例是从0到9所有数字循环显示,里面用到了数码管对应引脚,while,switch case,自定义函数这些知识点。
/*
19 MC猜数字 - 1 电路搭建
太极创客
www.taichi-maker.com
此程序用于太极创客<<零基础入门学用Arduino教程>>中,博主搬运只为学习!!!请支持原作者。
MC猜数字电路测试使用。
2017-04-21
*/
void setup() {
pinMode(2, INPUT_PULLUP);
for (int i = 2; i <= 9; i++) {
pinMode(i, OUTPUT);
}
}
// the loop function runs over and over again forever
void loop() {
int myNumber = 0;
while(myNumber <= 9){
displayNumber(myNumber);
delay(500);
displayClear();
myNumber++;
while(!digitalRead(2)){
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
delay(500);
}
}
void displayClear(){
// 清理显示内容
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void displayNumber(int number){
switch(number){
case 1:
digitalWrite(4, HIGH);
digitalWrite(7, HIGH);
break;
case 2:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
case 3:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
break;
case 4:
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
break;
case 5:
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
break;
case 6:
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
case 7:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(7, HIGH);
break;
case 8:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
case 9:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
break;
case 0:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
default:
digitalWrite(5, HIGH);
}
}
基本原理就是下面这张图:
a:3号引脚。
b:4号引脚。
c:7号引脚。
d:8号引脚。
e:9号引脚。
f:6号引脚。
g:5号引脚。
数码管的8段(包括小数点)都共用一个阴极,就是3或8出口。阴极通过一个200~500的电阻接GND。
while,switch case,自定义函数都和c差不多,看上面的例子就能明白。
改成按下按钮随机生成数,我们只需要改成:
int myNumber=0;
void loop() {
while(!digitalRead(2)){//不按下按钮
displayClear();
myNumber=random(0,10);
displayNumber(myNumber);
}
}
第一次按下按钮,就会进入while,清空当前显示的字段,生成随机数并且显示该字段。因为不按下按钮就一直不会进入循环,清空显示,所以一直显示。
如果想查看随机数,可以在setup()中设置 Serial.begin(9600)
,loop中利用Serial.print(), Serial.println()
输出,注意Arduino中不能+号字符串拼接。
比较诡异的是random()是伪随机。每次程序重新启动,顺序都是一样的。用randomSeed()可以解决这个问题。
在setup()中加一句:
randomSeed(analogRead(A0)); //A0引脚防空,这样每次读到的都是不一样的。