50浏览
查看: 50|回复: 0

[入门教程] Arduino入门教程21--数码管摇骰子「DFR0100」

[复制链接]
本帖最后由 zoey不种土豆 于 2024-11-21 20:32 编辑

本项目旨在通过Arduino和数码管实现一个摇骰子的功能。当倾斜开关被触发时,数码管将随机显示0到9之间的一个数字,模拟摇骰子的效果。

元件清单
Arduino入门教程21--数码管摇骰子「DFR0100」图1

硬件连接
Arduino入门教程21--数码管摇骰子「DFR0100」图2
1 数码管摇骰子连线图

示例代码
样例代码:
  1. // 项目 - 数码管摇骰子  
  2. // 定义数码管的引脚  
  3. const int pinA = 3;  
  4. const int pinB = 2;  
  5. const int pinC = 8;  
  6. const int pinDP = 9;  
  7. const int pinF = 4;  
  8. const int pinG = 5;  
  9. const int pinE = 6;  
  10. const int pinD = 7;  
  11.   
  12. // 定义倾斜开关的引脚  
  13. const int tiltSwitchPin = 13;  
  14. int sensorValue;  
  15. int lastTiltState = HIGH;   // 上一次从倾斜传感器读取的状态  
  16. unsigned long lastDebounceTime = 0; // 上次检查时间  
  17. unsigned long debounceDelay = 500;   // 消抖延迟时间(毫秒)  
  18. // 二维数组定义数码管的数字0-9的显示模式  
  19. int numbers[10][8] = {  
  20.   {0, 0, 0, 0, 0, 0, 1, 1}, // 数字0  
  21.   {1, 0, 0, 1, 1, 1, 1, 1}, // 数字1  
  22.   {0, 0, 1, 0, 0, 1, 0, 1}, // 数字2  
  23.   {0, 0, 0, 0, 1, 1, 0, 1}, // 数字3  
  24.   {1, 0, 0, 1, 1, 0, 0, 1}, // 数字4  
  25.   {0, 1, 0, 0, 1, 0, 0, 1}, // 数字5  
  26.   {0, 1, 0, 0, 0, 0, 0, 1}, // 数字6  
  27.   {0, 0, 0, 1, 1, 1, 1, 1}, // 数字7  
  28.   {0, 0, 0, 0, 0, 0, 0, 1}, // 数字8  
  29.   {0, 0, 0, 0, 1, 0, 0, 1}  // 数字9  
  30. };  
  31.   
  32. void setup() {  
  33.   Serial.begin(9600);  
  34.   // 设置数码管的引脚为输出  
  35.   pinMode(pinA, OUTPUT);  
  36.   pinMode(pinB, OUTPUT);  
  37.   pinMode(pinC, OUTPUT);  
  38.   pinMode(pinDP, OUTPUT);  
  39.   pinMode(pinF, OUTPUT);  
  40.   pinMode(pinG, OUTPUT);  
  41.   pinMode(pinE, OUTPUT);  
  42.   pinMode(pinD, OUTPUT);  
  43.   
  44.   // 设置倾斜开关的引脚为输入并启用内部上拉电阻  
  45.   pinMode(tiltSwitchPin, INPUT_PULLUP);  
  46. }  
  47.   
  48. void loop() {  
  49.   unsigned long currentTime = millis();
  50.   int sensorValue = digitalRead(tiltSwitchPin);  
  51.   // 如果倾斜开关状态改变并且过来消抖时间:  
  52.   if (sensorValue != lastTiltState && (currentTime - lastDebounceTime) > debounceDelay) {  
  53.     int randomNumber = random(0, 10); // 生成一个0到9的随机数  
  54.     displayNumber(randomNumber); // 显示随机数
  55.     // 更新状态变量和消抖时间:
  56.     lastTiltState = sensorValue;
  57.     lastDebounceTime = currentTime;
  58.   }  
  59. }
  60. // 显示数码管的数字
  61. void displayNumber(int number) {
  62.   digitalWrite(pinA, numbers[number][0]);
  63.   digitalWrite(pinB, numbers[number][1]);
  64.   digitalWrite(pinC, numbers[number][2]);
  65.   digitalWrite(pinD, numbers[number][3]);
  66.   digitalWrite(pinE, numbers[number][4]);
  67.   digitalWrite(pinF, numbers[number][5]);
  68.   digitalWrite(pinG, numbers[number][6]);
  69.   digitalWrite(pinDP, numbers[number][7]);
  70. // 如果需要显示小数点,将这里的状态改为0
  71. }
复制代码


代码回顾
在setup()之外的变量定义中,这些语句都是熟面孔了,请大家结合代码注释自行理解,定义数码管引脚请参考项目【红外遥控数码管】。在setup()函数中,设置数码管的引脚为输出,并设置倾斜开关引脚为输入模式并启用上拉电阻,如下:
  1. pinMode(tiltSwitchPin, INPUT_PULLUP);
复制代码
当没有触发时,引脚读取为高电平(HIGH)。
接着是loop()函数,在loop()中很关键的一点是采用软件编程来实现倾斜开关的消抖。
消抖的逻辑是通过比较当前状态和上一次状态,以及检查时间间隔是否超过设定的消抖延迟时间,来避免由于物理开关的接触抖动而导致的多次触发。
首先定义变量lastDebounceTime,用于存储上一次检测到倾斜开关状态变化的时间点。debounceDelay 在这个项目中被设置为500毫秒。这意味着,如果倾斜开关的状态在500毫秒内频繁变化,那么这些变化将被视为抖动,并且不会被视为有效的状态变化。
  1. unsigned long lastDebounceTime = 0;
  2. unsigned long debounceDelay = 500;
复制代码
在 loop() 函数内部,先获取当前的时间点(currentTime)和倾斜开关当前的状态值(sensorValue )。
  1. unsigned long currentTime = millis();
  2. int sensorValue = digitalRead(tiltSwitchPin);
复制代码
之后程序会检查倾斜开关的状态(sensorValue)。如果当前状态(sensorValue)与上一次状态(lastTiltState)不同,并且时间间隔超过设定的消抖延迟时间,那么程序将认为这是一个有效的状态变化。
  1. if (sensorValue!=lastTiltState && (currentTime-lastDebounceTime) > debounceDelay){  
  2.     ......
  3.   }  
复制代码
如果检测到是一个有效的变化,则执行if中的操作:
  1. int randomNumber = random(0, 10);
  2. displayNumber(randomNumber);
  3. lastTiltState = sensorValue;
  4. lastDebounceTime = currentTime;
复制代码
生成一个随机数,并调用displayNumber()函数将随机数显示在数码管上,接着更新状态变量和重置消抖时间。

示例代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail