原文地址:https://circuitdigest.com/microcontroller-projects/digital-dice-using-arduino
使用Arduino的数字骰子
经过**萨达姆** 2015年7月2日3
我们都熟悉骰子,经常使用骰子玩LUDO或SANP SIDI(蛇梯棋)游戏。骰子是一个乡绅型的实心盒子,在其所有侧面上均包含6个不同的数字。我们在玩游戏时将骰子放在表面上以获得随机数。在这个项目中,我们尝试使用arduino uno board用数字骰子复制它。代替掷骰子,这里我们需要按下一个按钮以获得0到6之间的一个随机数。
所需组件
- Arduino UNO
- 七段显示(共阳极)
- 按按钮
- 连接线
- 面包板
- 1 k电阻
- 电源供应
电路图和说明
如上面的数字骰子电路所示,arduino用于控制整个过程。电路中使用了两个按钮-一个用于启动骰子,另一个用于重置骰子。Arduino会读取这两个按钮并执行操作。七段显示器用于显示骰子结果。
Arduino持续执行rand()函数并将其值存储到一个临时变量中。当按下骰子按钮时,将使用适当的方法计算存储的值并将其显示在七段中(请参见文章的编程部分)。
在此骰子电路中,共阳极七段显示器用于显示骰子编号,它直接与arduino数字引脚号6、5、4、3、2、1、0连接。七段共阳极引脚为与+5伏220欧姆电阻连接。还连接了两个按钮,即骰子按钮和复位按钮,它们相对于地面分别连接到数字引脚14(A0)和15(A1)。
代码说明
该项目的编程部分在七段显示器上显示随机数字骰子数量方面发挥着非常重要的作用。Arduino不包含用于七段显示的任何库。因此,我们无需使用任何库就可以创建完整的代码。
首先,我们为七段显示选择数字引脚。
int pin [7] = {6,5,4,3,2,1,0};
之后,我们创建一个由6个数字组成的骰子数组,分别为1、2、3、4、5和6。
char digit[6]={0x02, 0x79, 0x24, 0x30, 0x19, 0x12};
现在我们给出了使用arduino引脚作为输出的指示。
void setup()
{
for(int i=0;i<7;i++)
pinMode(pin[i], OUTPUT);
pinMode(dice, INPUT);
pinMode(resett, INPUT);
digitalWrite(dice, HIGH);
digitalWrite(resett, HIGH);
我们默认会在七段显示器上发送一个用于显示零的代码。
int temp = 0x40;
for(int i = 0; i <7; i ++)
{
int temp1 = temp&0x01;
digitalWrite(pin [i],temp1);
temp = temp >> 1;
}
现在,我们运行rand()函数以获取一个随机数。
int temp = rand();
当我们按下骰子按钮程序时,首先映射该随机数,然后使用按位运算符将数字发送到七段显示。
if(digitalRead(dice)==0)
{
int k=temp%6;
temp=digit[k];
wait();
for(int i=0;i<7;i++)
{
int temp1=temp&0x01;
digitalWrite(pin[i], temp1);
temp=temp>>1;
}
delay(200);
}
与重置按钮相同。
在此程序中,我们一次发送一位。在这里,我们应用了一个for循环,该循环运行7次以将数据逐段发送到每个段。
代码
#define resett 15
#define dice 14
char digit[6]={0x02, 0x79, 0x24, 0x30, 0x19, 0x12};
int pin[7]={6,5,4,3,2,1,0};
void setup()
{
for(int i=0;i<7;i++)
pinMode(pin[i], OUTPUT);
pinMode(dice, INPUT);
pinMode(resett, INPUT);
digitalWrite(dice, HIGH);
digitalWrite(resett, HIGH);
int temp=0x40;
for(int i=0;i<7;i++)
{
int temp1=temp&0x01;
digitalWrite(pin[i], temp1);
temp=temp>>1;
}
delay(1000);
}
void loop()
{
int temp=rand();
if(digitalRead(dice)==0)
{
int k=temp%6;
temp=digit[k];
wait();
for(int i=0;i<7;i++)
{
int temp1=temp&0x01;
digitalWrite(pin[i], temp1);
temp=temp>>1;
}
delay(200);
}
if(digitalRead(resett)==0)
{
temp=0x40;
for(int i=0;i<7;i++)
{
int temp1=temp&0x01;
digitalWrite(pin[i], temp1);
temp=temp>>1;
}
}
}
void wait()
{
for(int m=0;m<10;m++)
{
for(int k=0;k<6;k++)
{
int ch=digit[k];
for(int l=0;l<7;l++)
{
char tem2=ch&0x01;
digitalWrite(pin[l], tem2);
ch=ch>>1;
}
delay(50);
}
}
}