本帖最后由 zoey不种土豆 于 2024-11-21 20:32 编辑
本项目旨在通过Arduino和数码管实现一个摇骰子的功能。当倾斜开关被触发时,数码管将随机显示0到9之间的一个数字,模拟摇骰子的效果。
元件清单
硬件连接
示例代码
样例代码:
- // 项目 - 数码管摇骰子
- // 定义数码管的引脚
- const int pinA = 3;
- const int pinB = 2;
- const int pinC = 8;
- const int pinDP = 9;
- const int pinF = 4;
- const int pinG = 5;
- const int pinE = 6;
- const int pinD = 7;
-
- // 定义倾斜开关的引脚
- const int tiltSwitchPin = 13;
- int sensorValue;
- int lastTiltState = HIGH; // 上一次从倾斜传感器读取的状态
- unsigned long lastDebounceTime = 0; // 上次检查时间
- unsigned long debounceDelay = 500; // 消抖延迟时间(毫秒)
-
- // 二维数组定义数码管的数字0-9的显示模式
- int numbers[10][8] = {
- {0, 0, 0, 0, 0, 0, 1, 1}, // 数字0
- {1, 0, 0, 1, 1, 1, 1, 1}, // 数字1
- {0, 0, 1, 0, 0, 1, 0, 1}, // 数字2
- {0, 0, 0, 0, 1, 1, 0, 1}, // 数字3
- {1, 0, 0, 1, 1, 0, 0, 1}, // 数字4
- {0, 1, 0, 0, 1, 0, 0, 1}, // 数字5
- {0, 1, 0, 0, 0, 0, 0, 1}, // 数字6
- {0, 0, 0, 1, 1, 1, 1, 1}, // 数字7
- {0, 0, 0, 0, 0, 0, 0, 1}, // 数字8
- {0, 0, 0, 0, 1, 0, 0, 1} // 数字9
- };
-
- void setup() {
- Serial.begin(9600);
- // 设置数码管的引脚为输出
- pinMode(pinA, OUTPUT);
- pinMode(pinB, OUTPUT);
- pinMode(pinC, OUTPUT);
- pinMode(pinDP, OUTPUT);
- pinMode(pinF, OUTPUT);
- pinMode(pinG, OUTPUT);
- pinMode(pinE, OUTPUT);
- pinMode(pinD, OUTPUT);
-
- // 设置倾斜开关的引脚为输入并启用内部上拉电阻
- pinMode(tiltSwitchPin, INPUT_PULLUP);
- }
-
- void loop() {
- unsigned long currentTime = millis();
- int sensorValue = digitalRead(tiltSwitchPin);
- // 如果倾斜开关状态改变并且过来消抖时间:
- if (sensorValue != lastTiltState && (currentTime - lastDebounceTime) > debounceDelay) {
- int randomNumber = random(0, 10); // 生成一个0到9的随机数
- displayNumber(randomNumber); // 显示随机数
- // 更新状态变量和消抖时间:
- lastTiltState = sensorValue;
- lastDebounceTime = currentTime;
- }
-
- }
-
- // 显示数码管的数字
- void displayNumber(int number) {
- digitalWrite(pinA, numbers[number][0]);
- digitalWrite(pinB, numbers[number][1]);
- digitalWrite(pinC, numbers[number][2]);
- digitalWrite(pinD, numbers[number][3]);
- digitalWrite(pinE, numbers[number][4]);
- digitalWrite(pinF, numbers[number][5]);
- digitalWrite(pinG, numbers[number][6]);
- digitalWrite(pinDP, numbers[number][7]);
- // 如果需要显示小数点,将这里的状态改为0
- }
复制代码
代码回顾
在setup()之外的变量定义中,这些语句都是熟面孔了,请大家结合代码注释自行理解,定义数码管引脚请参考项目【红外遥控数码管】。在setup()函数中,设置数码管的引脚为输出,并设置倾斜开关引脚为输入模式并启用上拉电阻,如下:
- pinMode(tiltSwitchPin, INPUT_PULLUP);
复制代码
当没有触发时,引脚读取为高电平(HIGH)。 接着是loop()函数,在loop()中很关键的一点是采用软件编程来实现倾斜开关的消抖。 消抖的逻辑是通过比较当前状态和上一次状态,以及检查时间间隔是否超过设定的消抖延迟时间,来避免由于物理开关的接触抖动而导致的多次触发。 首先定义变量lastDebounceTime,用于存储上一次检测到倾斜开关状态变化的时间点。debounceDelay 在这个项目中被设置为500毫秒。这意味着,如果倾斜开关的状态在500毫秒内频繁变化,那么这些变化将被视为抖动,并且不会被视为有效的状态变化。 - unsigned long lastDebounceTime = 0;
- unsigned long debounceDelay = 500;
复制代码
在 loop() 函数内部,先获取当前的时间点(currentTime)和倾斜开关当前的状态值(sensorValue )。 - unsigned long currentTime = millis();
- int sensorValue = digitalRead(tiltSwitchPin);
复制代码
之后程序会检查倾斜开关的状态(sensorValue)。如果当前状态(sensorValue)与上一次状态(lastTiltState)不同,并且时间间隔超过设定的消抖延迟时间,那么程序将认为这是一个有效的状态变化。 - if (sensorValue!=lastTiltState && (currentTime-lastDebounceTime) > debounceDelay){
- ......
- }
复制代码
如果检测到是一个有效的变化,则执行if中的操作: - int randomNumber = random(0, 10);
- displayNumber(randomNumber);
- lastTiltState = sensorValue;
- lastDebounceTime = currentTime;
复制代码
生成一个随机数,并调用displayNumber()函数将随机数显示在数码管上,接着更新状态变量和重置消抖时间。
示例代码
|