本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于Arduino Nano 的电子骰子

发布时间:2021-08-02
分享到:

基于Arduino Nano 的电子骰子

发布时间:2021-08-02
分享到:

 该项目主要介绍基于微型 Arduino Nano 板构建一个电子骰子,来模仿我们在不同游戏中玩的骰子。因为塑料和木制骰子会随着时间的推移而磨损,并且可能会表现出对特定数字的偏见,有一定的作弊风险。由于这个骰子是完全电子的,并且以零偏置编程,这使它成为一种更公平随处可得的游戏工具。当玩家获得最高幸运数字6 时,它会显示明亮的红灯并发出欢呼声。那么,让我们开始吧!

第 1 步:获取所需零件

如果您是专业人士或电子爱好者,可以使用已有的Arduino Nano或在网上购买。我们没有使用 7 段显示器,因为它需要大量的电线和电阻器,而且它浪费了可用于连接其他设备的电路板引脚。我使用了四针 7 段显示器TM1637来替代他,它有四个 7 段显示器和一个冒号。一个蜂鸣器、一个轻触开关、一个电阻器和几条连接线就可以完成我们的材料清单。另外,您还需要一台安装了Arduino IDE 的笔记本电脑。

组件列表

  • Arduino纳米
  • TM1637 7-7段显示器
  • 有源蜂鸣器
  • 一个微动开关
  • 10K 欧姆电阻
  • 连接电线

第 2 步:TM1637 4 位 7 段显示器

如前所述,裸露的 7 段显示器也使用更多的电线和附加电阻。如果我们连接一个 4 位 7 段显示器,它将需要 12 条线连接,以及电阻器和晶体管。这意味着可用于连接任何其他设备的大量接线和引脚浪费。

TM1637 将引脚连接减少到四个。两个引脚用于电源连接、电源和接地,另外两个引脚用于时钟和数据输入-输出。所以,我们节省了 8 针!

该模块的核心是来自 TitanMicroelectronics TM1637 的廉价串行 LED 驱动器。因此显示器以这个芯片名称为前缀,称为TM1637 7段显示器。

TM1637 支持许多功能,例如 LED 的开/关和亮度控制以及访问每个段。您还可以在软件级别调整 LED 亮度。

TM1637 模块包括四个 0.36 段 7 段显示器来显示数据。

TM1637 模块在 3.3 到 5 伏的电源电压下工作,并通过两线总线进行通信,因此它只需要两个数据引脚加上电源和接地,总共只有四个引脚。

引脚排列

  • CLK - 显示器的时钟输入引脚 - 用于上升沿的数据输入输出
  • DIO - 数据输入输出引脚 - 用于串行数据输入和输出
  • VDD - 正电源 - 接 3.3V 至 5V
  • GND - 接地引脚 - 接地

第 3 步:TM1637 库安装

要将 TM1637 7 段显示器与 Arduino nano 配合使用,您需要安装其库。在“管理库”搜索框中输入“TM1637 ”并通过seed studio安装“Grove 4-Digit Display”,如您在图像中看到的帮助。

第 4 步:建立连接

我使用了数字引脚 D2、D3 显示器、连接到触觉开关的 D4 和连接到蜂鸣器的 D5。

以下是连接:

  1. D2 -> 显示时钟
  2. D3 -> 显示 DIO
  3. D4 -> 切换
  4. D5 -> 蜂鸣器
  5. 地->地
  6. VCC -> VCC

第 5 步:编程

理解代码

包含 TM1637 库头文件:

#include <TM1637.h>

引脚和变量声明:

整数时钟 = 2;
INT DIO = 3;
INT DIC = 4;
INT BUZ = 5;

int buttonState = 0;
int randNum = 0;

定义输入和输出引脚:

pinMode(DIC,输入);
  pinMode(BUZ,输出);

以 9600bps 初始化串行通信:

Serial.begin(9600);

定义引脚低或高的状态:

数字写入(DIC,低);
  数字写入(BUZ,高);

初始化 TM1637 显示:

tm.init();

设置显示亮度级别:

tm.set(2);tm.init();

读取开关是否被按下:

buttonState = digitalRead(DIC);

如果开关被按下,HIGH,调用throwDice函数并将其发送到串行监视器进行调试:

randNum = throwDice();    
Serial.println(randNum);

使用 Switch Case 语句显示相应的数字:

开关(randNum){
      情况1:
        tm.display(0, 1);
        tm.display(1, 1);
        tm.point(1);
        tm.display(2, 1);
        tm.display(3, 1);
        延迟(5000);
        随机数 = 0;
        休息;
      案例2:
        tm.display(0, 2);
        tm.display(1, 2);
        tm.point(1);
        tm.display(2, 2);
        tm.display(3, 2);
        延迟(5000);
        随机数 = 0;
        休息;
      案例3:
        tm.display(0, 3);
        tm.display(1, 3);
        tm.point(1);
        tm.display(2, 3);
        tm.display(3, 3);
        延迟(5000);
        随机数 = 0;
        休息;
      案例4:
        tm.display(0, 4);
        tm.display(1, 4);
        tm.point(1);
        tm.display(2, 4);
        tm.display(3, 4);
        延迟(5000);
        随机数 = 0;
        休息;
      案例5:
        tm.display(0, 5);
        tm.display(1, 5);
        tm.point(1);
        tm.display(2, 5);
        tm.display(3, 5);
        延迟(5000);
        随机数 = 0;
        休息;

如果随机数是 6 驱动蜂鸣器:

<pre>案例6:
        tm.display(0, 6);
        tm.display(1, 6);
        tm.point(1);
        tm.display(2, 6);
        tm.display(3, 6);
        数字写入(BUZ,低);
        延迟(5000);
        数字写入(BUZ,高);
        随机数 = 0;
        休息;

重置按钮状态和随机数:

按钮状态 = 0;  
随机数 = 0; 

否则如果没有按下开关继续显示 0:

其他
  {

    tm.display(0, 0);
    tm.display(1, 0);
    tm.point(1);
    tm.display(2, 0);
    tm.display(3, 0);

    按钮状态 = 0;
    随机数 = 0;
  }

函数throwDice使用内置的random()函数生成 1 到 6 之间的随机数:

int numRand = random(1, 7); 

将生成的随机数返回给调用者:

返回 numRand;

完整代码
将其上传到您的 Arduino Nano 板上

/*项目:Electornis骰子
  开发商: Rajeev Mehndiratta
  日期:28/07/2021
  硬件:Arduino NANO(旧引导程序)
*/

#include <TM1637.h>

//声明引脚

整数时钟 = 2;
INT DIO = 3;
INT DIC = 4;
INT BUZ = 5;

int buttonState = 0;
int randNum = 0;

TM1637 tm(时钟,DIO);

无效设置(){
  // 把你的设置代码放在这里,运行一次:

  //定义输入输出引脚
  pinMode(DIC,输入);
  pinMode(BUZ,输出);

  //初始化串口通信@9600
  Serial.begin(9600);

  //定义引脚状态
  数字写入(DIC,低);
  数字写入(BUZ,高);

  //初始化伪随机数生成器
  随机种子(模拟读取(0));

  //初始化TM1637七段显示
  tm.init();

  //设置亮度;0-7
  tm.set(2);tm.init();
}

无效循环(){
  // 把你的主要代码放在这里,重复运行:

  //读取按钮
  buttonState = digitalRead(DIC);

  //决策
  如果(按钮状态 == HIGH)
  {
    randNum = throwDice(); //调用thowDice函数
    Serial.println(randNum); //用于调试的串行打印

    //切换大小写
    // tm.display(position, character);
    开关(randNum){
      情况1:
        tm.display(0, 1);
        tm.display(1, 1);
        tm.point(1);
        tm.display(2, 1);
        tm.display(3, 1);
        延迟(5000);
        随机数 = 0;
        休息;
      案例2:
        tm.display(0, 2);
        tm.display(1, 2);
        tm.point(1);
        tm.display(2, 2);
        tm.display(3, 2);
        延迟(5000);
        随机数 = 0;
        休息;
      案例3:
        tm.display(0, 3);
        tm.display(1, 3);
        tm.point(1);
        tm.display(2, 3);
        tm.display(3, 3);
        延迟(5000);
        随机数 = 0;
        休息;
      案例4:
        tm.display(0, 4);
        tm.display(1, 4);
        tm.point(1);
        tm.display(2, 4);
        tm.display(3, 4);
        延迟(5000);
        随机数 = 0;
        休息;
      案例5:
        tm.display(0, 5);
        tm.display(1, 5);
        tm.point(1);
        tm.display(2, 5);
        tm.display(3, 5);
        延迟(5000);
        随机数 = 0;
        休息;
      案例6:
        tm.display(0, 6);
        tm.display(1, 6);
        tm.point(1);
        tm.display(2, 6);
        tm.display(3, 6);
        数字写入(BUZ,低);
        延迟(5000);
        数字写入(BUZ,高);
        随机数 = 0;
        休息;
    }
    按钮状态 = 0; //排除误触发
    随机数 = 0; //清除最后一位

  }

  //等待开关被按下

  别的
  {

    tm.display(0, 0);
    tm.display(1, 0);
    tm.point(1);
    tm.display(2, 0);
    tm.display(3, 0);

    按钮状态 = 0;
    随机数 = 0;
  }

}

//生成随机数的函数

int throwDice() {

  int numRand = random(1, 7); // min=1 和 max= max-1, 6
  返回 numRand;
}

第 6 步: 视频演示:

这是我的原型的图像,显​​示了组件的名称。

我添加了一个演示视频,也可以观看它以了解项目的工作情况。

我希望你们都会喜欢这个小而有用的项目。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论