本帖最后由 zoey不种土豆 于 2024-12-31 16:55 编辑  
 
本项目旨在通过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()函数将随机数显示在数码管上,接着更新状态变量和重置消抖时间。 
示例代码  
 |