前段時間推完了命運石之門
裡面的世界線變動率探測儀讓我有了做一個輝光管時鐘的想法
於是查資料
本來想採用蘇聯產IN-8的側顯管
但是側顯價格實在是。。
因為預算有限
只能退而求其次選擇頂顯管
本次採用的是QS30-1
是南昌電子管廠於上世紀80年代生產
QS30-1 圖片來源
QS30-1包裝盒
下圖是Q30-1的引腳參數和限流電阻參數
一共使用了6枚分別用於顯示時分秒
本次採用的控制方案是使用Arduino單片機當然是那個小小的nano版本 也可以用其他的比如ESP32或者51
Arduino nano
而驅動輝光管本次採用了6個俄羅斯產輝光管專用BCD譯碼芯片K155ID1分別驅動6個輝光管
當然也有很多其他方法驅動、比如使用Vcb大於170V的三極管來分別連結每個輝光管的陰極來驅動、但是這種控制方式要用到10*6也就是60個三極管、很枯燥無味了(下面驅動INS-1時就是這種)
或者還有一種是共陰極控制陽極、就是陰極並聯分別給時分秒的信號、然後逐個高速點亮、因為視覺暫留的原因就像全亮了。這種方法好就好在只用一個譯碼管或者少數三極管就行 、壞就壞在我不想用這種(笑
K155ID1引腳定義
3、4、6、7引腳輸入BCD碼K155ID1把BCD碼轉換成10進制然後輸出信號給陰極點亮對應數字 Vcc需要5v供電GND的話因為最後所有的都要共地我直接跟74HC595的GND連在一起了
說到74HC595、這個也是必不可少的、因為單片機引腳不夠、一個K155ID1就需要4路來輸入一共6個也就是24路(ps:如果採用三極管方案就是60路了)、但是Arduino的數字引腳只有12個D2-D13、所以就要用74HC595來擴展引腳
本次使用的是3片74HC595
74HC595引腳定義
輸出口Q0-Q7共八位可輸出兩組BCD碼也就是可以驅動兩個K155ID1、但是時分秒數據在這裡一共是6組BCD碼24位輸出、所以就使用3塊74HC595級聯來實現
級聯方式是前一個芯片的9號Q7S引腳與後一個14號DS引腳連接、11、12號SHCP、STCP引腳並接、以此類推
OE是輸出使能引腳、用於判斷是否輸出鎖存器數據到輸出引腳、低電平時輸出所以與GND連接。MR是控制移位寄存器重置的引腳、低電平時重置、使用要連接到Vcc上讓寄存器不被重置
最後DS、SHCP、STCP引腳連接單片機的數字腳、讓BCD碼串行輸入然後並行輸出給譯碼器
以上是輝光管驅動的邏輯部分
而時分秒之間的冒號「:」採用的是前蘇聯產的INS-1氖泡
INS-1圖片來源
下圖是INS-1的數據
工作電壓65-90V 起輝電壓55V 工作電流0.5mA
本次共使用了4個氖泡、每兩個組成一個冒號
而時鐘的冒號通常會閃爍、讓其閃爍也有很多方式、最簡單的比如直接使用單片機連接高壓三極管的基極、控制導通截止來控制氖泡
但是這顯得電路板上太單調了
索然無味!
所以我選擇使用NE555來產生一個1Hz的方波信號給三極管基極的方式繞過單片機來讓氖泡每秒閃一次
首先是如何使用NE555產生1Hz的方波信號、這時候需要使用NE555的非穩態工作模式
非穩態工作電路
最後3號引腳輸出的頻率由R1、R2、C共同決定公式如下
f=1.44/(R1+2R2)*C
因為我有只有22uf的電解電容、最後選擇了這個組合
而高壓部分使用的是4路2N5551三極管基級串上4.7K的基極電阻集電極接負載射電級接地這樣一個簡單的驅動電路
氖泡的工作電壓為65-90v、工作電流5mA、所以限流電阻在(170-65)/0.005到(170-90)/0.005之間、也就是21k到160k之間所以我就隨便甩了個100k上去
但是!恐怖的是、2N5551的Vcb只有150V、170V超過了耐壓值、呃不是我不用高耐壓值的三極管、我用了2SC4382、這個Vcb=200v但是不知道為什麼射級集電極之間沒有被完全截止、呃、就只能用2n5551了
反正最後也沒炸
贏!
以上是氖管驅動部分
接下來是Arduino需要時鐘
這次使用的是DS1302 RTC加上32768晶振、再加上3v鈕扣電池讓DS1302在沒電的情況下走時
連上就是了。
至於170v和5v電源
嗯 用的是18650電池並聯加上穩壓模塊輸出5v再用升壓模塊升壓到170v
雖然復刻boost升壓電路不是很難
但是能不能穩定運行我真是沒信心
我可不想因為破電源炸板子
最後附上總覽原理圖(有些地方有錯誤)
然後就是考慮pcb佈局和飛線了
為了板子整潔點還用排針和杜邦線做了個模塊化設計(笑
用了一塊10*22cm的萬能板(質量差的要死老是掉點差點把我整破防)
佈局
飛線邏輯部分用的awg30的線、電源部分就用awg26的線(剛開始沒發現555部分有個地方短路了、通電測試的時候直接把線干冒煙了吸了口大的)
總體來說就是大概飛了6個小時線
然後
發現鎖存器到解碼之間順序反了。。。
但是問題不大
代碼上chatgpt可以解決
程序部分基本都拜託Chat GPT了
ai時代就是好啊
就是剛開始忘記我把時鐘引腳接到D多少了還好只有3個組合方式不多
附上代碼
#include <Ds1302.h>
// === DS1302 引脚定义 ===
const int CE_PIN = 6;
const int IO_PIN = 7;
const int SCLK_PIN = 5;
Ds1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
// === 74HC595 引脚定义 ===
const int DATA_PIN = 2;
const int LATCH_PIN = 3;
const int CLOCK_PIN = 4;
byte nixieData[3]; // 三片595 = 24位 = 六个辉光管
// === 更新显示 ===
void updateDisplay() {
digitalWrite(LATCH_PIN, LOW);
for (int i = 2; i >= 0; i--) {
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, nixieData[i]);
}
digitalWrite(LATCH_PIN, HIGH);
}
// === 设置单个辉光管数字 ===
void setDigit(int tubeIndex, int value) {
value &= 0x0F;
int bitPos = tubeIndex * 4;
int byteIndex = bitPos / 8;
int bitOffset = bitPos % 8;
nixieData[byteIndex] &= ~(0x0F << bitOffset);
nixieData[byteIndex] |= (value << bitOffset);
if (bitOffset > 4) {
int remain = 8 - bitOffset;
int nextBits = 4 - remain;
nixieData[byteIndex + 1] &= ~( (1 << nextBits) - 1 );
nixieData[byteIndex + 1] |= (value >> remain);
}
}
// === 动画工具函数 ===
static void chaoticBurst(unsigned long duration_ms, uint8_t minDelayMs = 15, uint8_t maxDelayMs = 35) {
unsigned long t0 = millis();
while (millis() - t0 < duration_ms) {
for (int i = 0; i < 6; i++) setDigit(i, random(10));
updateDisplay();
delay(random(minDelayMs, maxDelayMs));
}
}
static void sweepOnce(bool reverse = false, uint8_t stepDelayMs = 40) {
int start = reverse ? 5 : 0;
int end = reverse ? -1 : 6;
int step = reverse ? -1 : 1;
for (int i = 0; i < 6; i++) setDigit(i, random(10));
for (int idx = start; idx != end; idx += step) {
for (int k = 0; k < 3; k++) {
for (int i = 0; i < 6; i++) {
if (i == idx) setDigit(i, random(10));
else if (random(100) < 20) setDigit(i, random(10));
}
updateDisplay();
delay(stepDelayMs);
}
}
}
// === 开机动画(乱序+扫管+星闪)===
void startupAnimation() {
chaoticBurst(800, 18, 30);
sweepOnce(false, 35);
sweepOnce(true, 35);
chaoticBurst(900, 12, 24);
for (int blink = 0; blink < 3; blink++) {
int hits = 1 + random(2);
for (int h = 0; h < hits; h++) {
int i = random(6);
setDigit(i, random(10));
}
updateDisplay();
delay(80);
}
for (int i = 0; i < 6; i++) setDigit(i, 0);
updateDisplay();
}
// === 整点报时:扫管 + 高亮新小时 + 乱序收尾 ===
void hourlyChaos() {
Ds1302::DateTime now;
rtc.getDateTime(&now);
int hour = now.hour;
int h10 = hour / 10;
int h1 = hour % 10;
// Phase 1:短前奏
for (int t = 0; t < 3; t++) {
for (int i = 0; i < 6; i++) setDigit(i, random(10));
updateDisplay();
delay(60);
}
// Phase 2:左右扫管
sweepOnce(false, 28);
sweepOnce(true, 28);
// Phase 3:高亮小时两位闪烁
for (int blink = 0; blink < 2; blink++) {
for (int i = 0; i < 6; i++) setDigit(i, random(10));
setDigit(1, h10);
setDigit(0, h1);
updateDisplay();
delay(160);
for (int i = 0; i < 6; i++) setDigit(i, random(10));
updateDisplay();
delay(120);
}
// Phase 4:乱序收尾
chaoticBurst(600, 16, 28);
// 收尾:恢复当前时间显示
rtc.getDateTime(&now);
int minute = now.minute;
int second = now.second;
int digits[6] = {
now.hour % 10, now.hour / 10,
minute % 10, minute / 10,
second % 10, second / 10
};
for (int i = 0; i < 6; i++) setDigit(i, digits[i]);
updateDisplay();
}
// === 全局变量 ===
int lastHour = -1;
// === 主程序 ===
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
Serial.begin(9600);
rtc.init();
randomSeed((analogRead(A0) << 10) ^ micros());
startupAnimation();
Ds1302::DateTime setTime;
// setTime.year = 2025;
// setTime.month = 11;
// setTime.day = 3;
// setTime.hour = 21;
// setTime.minute = 42;
// setTime.second = 30;
// rtc.setDateTime(&setTime);
}
void loop() {
Ds1302::DateTime now;
rtc.getDateTime(&now);
Serial.print("Time: ");
Serial.print(now.hour); Serial.print(":");
Serial.print(now.minute); Serial.print(":");
Serial.println(now.second);
int hour = now.hour;
int minute = now.minute;
int second = now.second;
// 整点检测
if (hour != lastHour && minute == 0 && second == 0) {
hourlyChaos();
lastHour = hour;
}
// 时间显示
int digits[6] = {
hour % 10, hour / 10,
minute % 10, minute / 10,
second % 10, second / 10
};
for (int i = 0; i < 6; i++) setDigit(i, digits[i]);
updateDisplay();
delay(1000);
}
最後是外殼
本來的建模還稍顯炫酷
呃 但是我3D打印機太狗屎了打不出來 不是炒麵就是翹邊
只能大改變成這樣模塊化(大噓(因為建模不會分件用熱熔膠黏的)
總成本大概300-400?
反正最貴的是那個輝光管
媽的一個40*6=240塊
最後附上視頻
Comments | 1 条评论
ztfmnpqtzemrfiikmnvtpsswwyfwxp