带 Arduino 的数码时钟 |最简单的设计
组件和用品
| × | 1 | ||||
| × | 1 |
关于这个项目
经过一天的辛苦工作,终于成功制作了带有Arduino和光隔离芯片的数码时钟,不需要很难购买的数码驱动。
观看视频了解完整说明:
制作项目的零件清单:
1. Arduino UNO https://amzn.to/2P58O7s
2. 数码管 6 个 https://amzn.to/3aHyJvX
3. 光耦芯片TLP627
4. DC 升压模块从 12VDC 到 390VDC https://amzn.to/30kpdK9
5.面包板https://amzn.to/2uCrnsW
6. 实时时钟模块 DS3231 https://amzn.to/2SIyEzI
在 utsource.net 上购买电子元件
Step 1. 电路设计
该电路采用光电隔离芯片,通过Arduino(使用5VDC)控制数码管(使用150VDC)。通过矩阵连接,所以我们只需要Arduino的16个输出就可以控制6个数码管的60个灯。实时时钟模块DS3231用于保持时间(甚至关闭电源),它通过I2C网络与Arduino通信。 Arduino会实时读取,然后按顺序高频开/关数码管,使人眼看到6个数字是永久性的
步骤 2. Arduino 代码
//Youtube频道:engineer2you
#include
#include "DS3231.h"
RTClib RTC;
DS3231 Clock;
int 小时;
int 分钟;
int 秒;
const int nixie_0 =2;
const int nixie_1 =3;
const int nixie_2 =4;
const int nixie_3 =5;
const int nixie_4 =6;
const int nixie_5 =7;
const int nixie_6 =8;
const int nixie_7 =9;
const int nixie_8 =10;
const int nixie_9 =11;
const int row_1 =0;
const int row_2 =1;
const int row_3 =14;
const int row_4 =15;
const int row_5 =16;
const int row_6 =17;
const int time_on =2;
void setup() {
pinMode(nixie_0, OUTPUT);
pinMode(nixie_1, OUTPUT);
pinMode(nixie_2, OUTPUT);
pinMode(nixie_3, OUTPUT);
pinMode(nixie_4, OUTPUT);
pinMode( nixie_5, OUTPUT);
pinMode(nixie_6, OUTPUT);
pinMode(nixie_7, OUTPUT);
pinMode(nixie_8, OUTPUT);
pinMode(nixie_9, OUTPUT);
pinMode(row_1, OUTPUT);
pinMode(row_2, OUTPUT);
pinMode(row_3, OUTPUT);
pinMode(row_4, OUTPUT);
pinMode(row_5) , OUTPUT);
pinMode(row_6, OUTPUT);
//Serial.begin(9600); //不应该使用seiral println,它会影响输出引脚D0 &D1
Wire.begin();
}
void loop() {
//--- ----------------获取时钟值---------------------------
DateTime now =RTC.now();
hour =now.hour();
minute =now.minute();
second =now.second();
/ /-------------------显示时钟编号----------------------
int j; //从右数第二个数字
int k; //从右边开始的第一个数字
j =second/10;
k =second%10;
//-----------显示第二个的第一个数字
off_all();
on_number(0,k+2);
delay(time_on);
//-----------显示秒数
off_all();
on_number(1,j+2);
delay(time_on);
j =分钟/10;
k =minute%10;
//-----------显示第一个分钟数
off_all();
on_number(14,k+2);
delay(time_on);
//-----------显示分钟的秒数
off_all();
on_number(15,j+2 );
delay(time_on);
j =小时/10;
k =小时%10;
//-----------先显示小时数
off_all();
on_number(16,k+2);
delay(time_on);
//-----------显示第二个小时数
off_all();
on_number(17,j+2 );
延迟(time_on);
}
void on_number(int row, int nixie){
digitalWrite(row, HIGH);
digitalWrite(nixie, HIGH );
}
void off_all(){
digitalWrite(row_1, LOW);
digitalWrite(row_2, LOW);
digitalWrite(row_3, LOW);
digitalWrite(row_4, LOW);
digitalWrite(row_5, LOW);
digitalWrite(row_6, LOW);
digitalWrite(nixie_0, LOW);
digitalWrite(nixie_1) , LOW);
digitalWrite(nixie_2, LOW);
digitalWrite(nixie_3, LOW);
digitalWrite(nixie_4, LOW);
digitalWrite(nixie_5, LOW);
digitalWrite(nixie_6, LOW);
digitalWrite(nixie_7, LOW);
digitalWrite(nixie_8, LOW);
digitalWrite(nixie_9, LOW);
delayMicroseconds(400); //防止对其他管产生“鬼”效应
}
基本上,代码会从DS3231模块实时获取,并通过光隔离芯片显示给6个数码管。
步骤 3. 构建电路 图> 图> 图> 图>
这只是实验,所以我在面包板上制作了所有东西。幸运的是,它第一次运行,没有任何问题
下一步,我会尝试在MDF外壳中制作一个装饰精美的数码钟,这样我就可以把它放在我的房间里了。
代码
- 代码片段 #1
代码片段 #1纯文本
//Youtube频道:engineer2you#include#include "DS3231.h"RTClib RTC;DS3231 Clock;int hour;int minute;int second;const int nixie_0 =2;const int nixie_1 =3; const int nixie_2 =4;const int nixie_3 =5; const int nixie_4 =6;const int nixie_5 =7;const int nixie_6 =8;const int nixie_7 =9;const int nixie_8 =10;const int nixie_9 =11;const int row_1 =0;const int row_2 =1;const int row_3 =14;const int row_4 =15;const int row_5 =16;const int row_6 =17;const int time_on =2;void setup() { pinMode(nixie_0, OUTPUT); pinMode(nixie_1,输出); pinMode(nixie_2,输出); pinMode(nixie_3,输出); pinMode(nixie_4,输出); pinMode(nixie_5,输出); pinMode(nixie_6,输出); pinMode(nixie_7,输出); pinMode(nixie_8,输出); pinMode(nixie_9,输出); pinMode(row_1,输出); pinMode(row_2,输出); pinMode(row_3, 输出); pinMode(row_4,输出); pinMode(row_5,输出); pinMode(row_6,输出); //Serial.begin(9600); //不应该使用seiral println,它会影响输出引脚D0 &D1 Wire.begin();}void loop() { //--------------------获取时钟值--------------------------- DateTime now =RTC.now();小时 =now.hour();分钟 =now.minute();第二 =now.second(); //--------------------显示时钟号---------------------- int j; //从右数第二个数字 int k; //从右数第一个数字 j =second/10; k =秒%10; //-----------显示第二个的第一个数字 off_all(); on_number(0,k+2);延迟(时间); //-----------显示秒的秒数 off_all(); on_number(1,j+2);延迟(时间); j =分钟/10; k =分钟%10; //-----------显示第一个分钟数 off_all(); on_number(14,k+2);延迟(时间); //-----------显示秒数 off_all(); on_number(15,j+2);延迟(时间); j =小时/10; k =小时%10; //-----------显示第一个小时数 off_all(); on_number(16,k+2);延迟(时间); //-----------显示第二个小时数 off_all(); on_number(17,j+2);延迟(time_on);}void on_number(int row,int nixie){ digitalWrite(row,HIGH); digitalWrite(nixie, HIGH);}void off_all(){ digitalWrite(row_1, LOW);数字写入(row_2,低);数字写入(row_3,低);数字写入(row_4,低);数字写入(row_5,低);数字写入(row_6,低);数字写入(nixie_0,低);数字写入(nixie_1,低);数字写入(nixie_2,低);数字写入(nixie_3,低);数字写入(nixie_4,低);数字写入(nixie_5,低);数字写入(nixie_6,低);数字写入(nixie_7,低);数字写入(nixie_8,低);数字写入(nixie_9,低);延迟微秒(400); //防止对其他管产生“鬼”效应}
制造工艺