Arduino:使用 TM1637驱动的LED数码管和DS3231模块做一个简易时钟

之前用四位LED八段数码管做过温度计,效果不错。半夜里不会太亮以至于影响到睡觉,然而想看的时候却显示的绝对清晰。

干脆再做一个时钟吧,想看时间瞄一眼就好,省得摸手机。

LED数码管选了一种由TM1637驱动的四位LED模块,没有小数点但是有时间分隔符,非常适合显示HH:mm。使用起来很简单,只需要两个IO口即可。DS3231选了I2C的模块,甚至还支持温度检测(本项目未使用此功能)。

接线很简单。DS3231就按硬件I2C标准连接Arduino就好,LED模块我选了A0、A1这两个口。当然这个是可以任意改的,代码中指定好CLK和DIO连接哪两个IO口即可。

较新版的Arduino IDE支持在库管理中在线搜索并下载安装库,因此库安装还是相当方便的。TM1637相关库选用了DigitalTube的,DS3231选用了Sodaq的。

代码比较简单。这个LED模块支持亮度设置,挺好的,晚上不会太刺眼。需要说明的是DS3231模块时间校准设置时需要正确构造 DateTime对象。为了尽可能的准确,预留好代码编译和上传的时间。比如,现在是14:58分,预估编译+上传需要10秒钟,那么DateTime可以构造成15:00,并且在14:59:50的时候开始运行。记得该次运行的时候rtc.setDateTime(dt);是不能被注释的。一旦上传成功,就必须把它注释掉并且再次上传,不然Arduino掉电后下次运行还是从15:00开始计时。此外,只要不执行setDateTime,DateTime对象就并不要求给出准确的时间,甚至可以不必定义。

LED的时间分割符控制是通过point方法实现的,参数为true代表显示,为false代表不现实。

#include "TM1637.h"
#include <Wire.h>
#include "Sodaq_DS3231.h"
DateTime dt(2018, 5, 4, 14, 5, 0, 5); // 年 月 日 时 分 秒 星期。周日-周六对应0-6

//pins definitions for TM1637 and can be changed to other ports
#define CLK A0  
#define DIO A1
TM1637 tm1637(CLK, DIO);
  
void setup()
{
  tm1637.init();
 
  // 设置LED亮度。最暗到最亮 0-7。典型值2。
  tm1637.set(1);
 
  Wire.begin();
  rtc.begin();
 
  // 第一次使用时钟模块,或者需要校准时放开下列注释
  // 一旦校准完毕,继续注释掉,并再次上传
  // 定义dt的时候建议预留一些编译和上传的时间
  //rtc.setDateTime(dt);
}
 
// 时间分隔符闪烁标识
bool ShowPoint = true;
 
void loop()
{
  DateTime now = rtc.now();
 
  int h = now.hour();
  int mn = now.minute();
 
  int b0 = h / 10;
  int b1 = h % 10;
 
  int b2 = mn / 10;
  int b3 = mn % 10;
 
  tm1637.point(ShowPoint);
  tm1637.display(0, b0);
  tm1637.display(1, b1);
  tm1637.display(2, b2);
  tm1637.display(3, b3);
 
  ShowPoint = !ShowPoint;
 
  delay(1000);
 
}

这样就实现了一个最简单的只能显示时分的数字钟。显然和市售商品相比,时间校准方式是个可以改进的点。



Arduino使用TM1637数字管驱动的步骤和方法如下: 1. 硬件连接: - 将TM1637模块的VCC引脚连接到Arduino的5V引脚。 - 将TM1637模块的GND引脚连接到Arduino的GND引脚。 - 将TM1637模块的DIO引脚连接到Arduino的任意数字引脚(例如D2)。 - 将TM1637模块的CLK引脚连接到Arduino的任意数字引脚(例如D3)。 2. 安装库文件: - 打开Arduino IDE。 - 在菜单栏中选择 "工具" -> "管理库"。 - 在库管理器中搜索 "TM1637"。 - 选择适用于ArduinoTM1637库并点击 "安装"。 3. 编写代码: - 在Arduino IDE中创建一个新的空白项目。 - 在代码中包含TM1637库: ```cpp #include <TM1637Display.h> ``` - 定义TM1637对象和相关变量: ```cpp #define CLK_PIN 2 #define DIO_PIN 3 TM1637Display display(CLK_PIN, DIO_PIN); int numDigits = 4; int brightness = 7; ``` - 在 `setup()` 函数中初始化TM1637模块: ```cpp void setup() { display.setBrightness(brightness); display.clear(); } ``` - 在 `loop()` 函数中显示数字或字符: ```cpp void loop() { display.showNumberDec(1234, false); // 显示一个十进制数字 delay(1000); display.showNumberDecEx(5678, 0b01000000, true); // 显示一个带小数点的数字 delay(1000); display.showNumberHex(0xABCD, true); // 显示一个十六进制数 delay(1000); display.setSegments({0xFF, 0xFF, 0xFF, 0xFF}); // 显示自定义段 delay(1000); } ``` 4. 上传并运行代码: - 将Arduino板连接到计算机上。 - 选择正确的Arduino板和端口。 - 点击上传按钮以将代码上传到Arduino板上。 - 打开串口监视器以查看数字管显示的结果。 这样,你就可以在Arduino使用TM1637数字管驱动了。根据你的需求,可以使用不同的函数来显示数字、字符或自定义段。请根据你的具体情况修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ki1381

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值