zoey不种土豆 发表于 2024-11-21 20:32:44

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

本帖最后由 zoey不种土豆 于 2024-11-21 20:32 编辑

本项目旨在通过Arduino和数码管实现一个摇骰子的功能。当倾斜开关被触发时,数码管将随机显示0到9之间的一个数字,模拟摇骰子的效果。
元件清单
硬件连接
图 1 数码管摇骰子连线图
示例代码
样例代码:// 项目 - 数码管摇骰子
// 定义数码管的引脚
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 = {
{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);
digitalWrite(pinB, numbers);
digitalWrite(pinC, numbers);
digitalWrite(pinD, numbers);
digitalWrite(pinE, numbers);
digitalWrite(pinF, numbers);
digitalWrite(pinG, numbers);
digitalWrite(pinDP, numbers);
// 如果需要显示小数点,将这里的状态改为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()函数将随机数显示在数码管上,接着更新状态变量和重置消抖时间。
示例代码
下一课:Arduino入门教程22--指尖开关「DFR0100」
页: [1]
查看完整版本: Arduino入门教程21--数码管摇骰子「DFR0100」