亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

DIY 最简单的 IV9 Numitron 时钟与 Arduino

组件和用品

Arduino Nano R3
× 1
Maxim Integrated DS3231M - ±5ppm,I2C 实时时钟
× 1
TPIC6C595 移位寄存器
× 4
IV9 Numitron 管
× 4
LED(通用)
× 2
电容 100 nF
× 4
1N4007 – 高电压、高额定电流二极管
× 2
滑动开关
× 1
电阻 1k ohm
× 1

必要的工具和机器

烙铁(通用)
焊锡丝,无铅

应用和在线服务

Arduino IDE

关于这个项目

这次我将向您展示如何制作一个漂亮的复古风格的 Numitron 电子管时钟。除了正确的时间之外,设备还会每 30 秒简要显示日期、年份和当前温度。

我从给定的 Github 页面得到了制作这款手表的想法:https://github.com/theremotheman/simple_numitron_clock_with_4_shift_registers_and_rtc3231。

我首先按照网站上的说明做了这个项目,发现它包含很多缺陷。

这是第一个使用 74HC595 的原型机的样子

对于 74HC595 IC 根据数据表的总最大电流为 70 毫安,在这种情况下超过了数倍(数字 8 约为 160 毫安),因此一段时间后 IC 会过热而无法正常工作。另一个不足是代码循环中的延迟太多,因此每 60 秒只读取一次时间。在图片中,您可以看到主要根据上页说明制作的成品时钟。一开始,它完全正常工作,但过了一会儿,随机段被激活,IC-s、numitrons或微控制器很容易烧毁。在第一种情况下,问题是通过使用 TPIC6C595 IC 而不是 74HC595 来解决的,后者是为更大的电流提供的。还要注意这两种集成电路的管脚不兼容。

-------------------------------------------------- --------------------------------

https://www.pcbgogo.com/promo/from_MirkoPavleskiMK

-------------------------------------------------- ---------------------------------

并且新代码是使用millis()而不是delay()函数创建的,所以现在实时时钟被不断读取。我还添加了一个开关,可以改变 numitron 的光强度,从而改变寿命。如您所见,该设备的构建相对简单,我认为这是制作电子管时钟的最简单方法。 Numitron 价格低廉,易于获得,并且不使用额外的高压电源。

制作这个时钟只需要几个组件:

- 四颗 Numitron 电子管 IV9

- 四路集成电路TPIC6C595

- Arduino 微控制器

- DS3231 实时时钟模块

- 两个 LED 秒

- 开关

- 和四个去耦电容

实时模块还包含一个温度计,因此为了更准确地显示温度,它位于盒子外面,由网格保护。首先,需要将实时时钟与 PC 时钟同步,我们在 DS1307RTC 库的帮助下做到了这一点。然后我们上传代码,设备就准备好了。剩下的就是修改代码,让我们可以在按钮的帮助下设置时间,在下一个时期作为项目更新。

最后,把时钟装在一个合适的盒子里,是每个橱窗里的美丽装饰。

代码

  • Arduino 代码
Arduino 代码C/C++
#include  //带有温度的 ds3231RTC_DS3231 rtc; //设置使用哪个rtc模块#include  //wiring#include  //time lib#include  //time function#include  //rtc #include #define led 7const int latchPin =13; //latchconst int clockPin =10; //clockconst int dataPin =11; //dataunsigned long previousMillis =0; // 存储上次 LED 闪烁时间间隔 =30000; // 闪烁的时间间隔(毫秒)unsigned long previousMillisDiode =0; // 存储上次 LED 闪烁时间间隔二极管 =500; // 闪烁的间隔(毫秒)const int nums[12] ={ //设置显示数组 - 根据文档:pin1 是通用的,pin2 是点(草图中未使用),其余部分应连接到移位寄存器一个 0b10111110, //0 0b00000110, //1 0b01111010, //2 0b01101110, //3 0b11000110, //4 0b11101100, //5 //5 0b111161010,10,10,10,10,10,10,10,10 9 0b11001010,//st。 0b10111000 //celz.};int hour1; //小时第一个数字小时2; //小时秒数int minute1; //分钟第一个数字int minute2; //分秒 numberint day1; //第一个数字int day2; //日秒数int月1; //第一个数字int month2; //月第二个数字int year1; //年第一个数字 - 常量 2int year2; //年第二个数字 - 常数 0(你想活那么久来改变它?)int year3; //年第三个数字int year4; //年第四个数字int hourDecimal; //hourint minuteDecimal 的十进制解析; //十进制解析minuteint dayDecimal; //dayint monthDecimal的十进制解析; //monthint year70的十进制解析; //unix epochint temp1之后的一年; //第一个温度 numberint temp2; //第二个温度数字int tempDecimal; //十进制解析温度(前两个数字)void setup() { pinMode (led,OUTPUT); pinMode(latchPin, OUTPUT); //将引脚设置为输出,以便您可以控制移位寄存器 pinMode(clockPin, OUTPUT); //设置引脚输出,以便您可以控制移位寄存器 pinMode(dataPin, OUTPUT); //将引脚设置为输出,以便您可以控制移位寄存器 Serial.begin(9600); // 初始化 SPI:SPI.begin(); // 将 SS 引脚拉低选择芯片:digitalWrite(clockPin,LOW); }void loop() { tmElements_t tm; //从 DS1307RTC 库命名 RTC.read(tm); // 读取 rtc 时间/日期/年 minuteDecimal =tm.Minute / 10; //通过除以十hourDecimal =tm.Hour / 10 将输出解析为可读(更短); //通过除以十天Decimal =tm.Day / 10将输出解析为可读(更短); //通过除以十个月Decimal =tm.Month / 10,将输出解析为可读(更短); //将输出解析为可读(更短)除以十 year70 =tm.Year - 30; //通过从 unix epoch(1970) 中减去来显示真实年份 hour1 =hourDecimal; // 很简单,hour2 =tm.Hour - 10 * hourDecimal; //进行计算以仅显示两位数字字符串中的第二个数字 minute1 =minuteDecimal; //简单的minute2 =tm.Minute - 10 * minuteDecimal; //进行计算以仅显示两位数字字符串中的第二个数字 day1 =dayDecimal; //简单的 day2 =tm.Day - 10 * dayDecimal; //进行计算以仅显示两位数字符串中的第二个数字 month1 =monthDecimal; //简单的month2 =tm.Month - 10 * monthDecimal; //计算只显示两位数字符串中的第二个数字 year1 =2; //第一年的数字,你真的需要改变吗?你有飞行汽车之类的吗?年 2 =0; //第二年的数字,如果你需要改变你应该和孙子一起玩而不是 year3 =year70 / 10; //将输出解析为可读(更短)除以十 year4 =year70 - 10 * year3; //进行计算以仅显示两位数字符串中的第二个数字 tempDecimal =rtc.getTemperature()/10; //通过除以十来解析输出为可读(更短) temp1 =tempDecimal; //简单的 temp2 =rtc.getTemperature() - 10 * tempDecimal; //进行计算以仅显示两位数字符串中的第二个数字 if (millis() - previousMillisDiode>=intervalDiode) { previousMillisDiode =millis(); digitalWrite(led, !digitalRead(led)); //改变LED状态}if (millis() - previousMillis>=interval) { previousMillis =millis();数字写入(时钟引脚,低); SPI.transfer (0b00000000); SPI.transfer (0b00000000); SPI.transfer (0b00000000); SPI.transfer (0b00000000);数字写入(时钟引脚,高);延迟(500); //numitron 关闭 0.5 秒以产生“呼吸”效果 digitalWrite (clockPin, LOW); SPI.transfer (nums[month2]); SPI.transfer (nums[month1]); SPI.transfer (nums[day2]); SPI.transfer (nums[day1]);数字写入(时钟引脚,高);延迟(1500);数字写入(时钟引脚,低); SPI.transfer (0b00000000); SPI.transfer (0b00000000); SPI.transfer (0b00000000); SPI.transfer (0b00000000);数字写入(时钟引脚,高);延迟(500); //numitron 关闭 0.5 秒以产生“呼吸”效果 digitalWrite (clockPin, LOW); SPI.transfer (nums[year4]); SPI.transfer (nums[year3]); SPI.transfer (nums[year2]); SPI.transfer (nums[year1]);数字写入(时钟引脚,高);延迟(1500);数字写入(时钟引脚,低); SPI.transfer (0b00000000); SPI.transfer (0b00000000); SPI.transfer (0b00000000); SPI.transfer (0b00000000);数字写入(时钟引脚,高);延迟(500); //numitron 关闭 0.5 秒以产生“呼吸”效果 digitalWrite (clockPin, LOW); SPI.transfer (0b10111000); SPI.transfer (0b11001010); SPI.transfer (nums[temp2]); SPI.transfer (nums[temp1]);数字写入(时钟引脚,高);延迟(1500);数字写入(时钟引脚,低); SPI.transfer (0b00000000); SPI.transfer (0b00000000); SPI.transfer (0b00000000); SPI.transfer (0b00000000);数字写入(时钟引脚,高);延迟(500); //numitron 关闭 0.5 秒以产生“呼吸”效果 } else { digitalWrite (clockPin, LOW); SPI.transfer (nums[minute2]); SPI.transfer (nums[minute1]); SPI.transfer (nums[hour2]); SPI.transfer (nums[hour1]);数字写入(时钟引脚,高); }}

示意图


制造工艺

  1. Arduino Gyroscope Game with MPU-6050
  2. 带有伊斯兰祈祷时间的 Arduino 时钟
  3. 主时钟
  4. Arduino 温度。使用 3.2 显示的监视器和实时时钟
  5. DIY 电压表与 Arduino 和诺基亚 5110 显示器
  6. MobBob:由 Android 智能手机控制的 DIY Arduino 机器人
  7. 带旋转编码器的DIY简易测量轮
  8. 带有 Arduino、Yaler 和 IFTTT 的物联网仪表
  9. 单 LED 矩阵 Arduino 翻转时钟
  10. 带夏普 GP2Y1010AU0F 传感器的 DIY 空气质量监测仪
  11. 带有 Arduino Nano 的手持盖革计数器
  12. 带 DS1302 RTC 的简单闹钟