【开源】纯手工低成本打造拟辉光管时钟,也可以很酷炫
不想錯過我的推送,記得右上角-查看公眾號-設(shè)為星標,摘下星星送給我
《命運石之門》里 “世界線變動率探測儀”,各種輝光管的作品,讓熱愛DIY的小伙伴歡喜,但是輝光管的價格又望而卻步,并且現(xiàn)在已經(jīng)很難買到了。怎么能難倒我們的工程師呢?擬輝光管時鐘制作指南來了,先看一張效果圖:
制作過程如下視頻(英文原聲,大家自行理解):
在分享制作過程之前,我們先來了解下LIXIE顯示原理。
LIXIE的一端包含有LED,也可以是WS2812B智能LED,能根據(jù)需要改變顯示顏色的。LED發(fā)出的光線被聚集到一疊樹脂玻璃Plexiglas中。這類“端面照光”顯示器利用全內(nèi)反射的現(xiàn)象,可將光保持在樹脂玻璃內(nèi)刻蝕出圖案的區(qū)域。每片代表一個數(shù)字,并且通常一次只照亮一張樹脂玻璃片,從而顯示出具體的數(shù)字。
在今天分享的時鐘項目中,時鐘和分鐘的顯示需要四位數(shù),每位數(shù)需要雕刻出0-9這些數(shù)字,然后再添加兩個圓點來區(qū)分小時和分鐘,所以總共需要82個LED。這里指示數(shù)字使用藍色LED燈,區(qū)分時分圓點的用白色LED燈。
除了82個LED之外,還需要以下器件:
ATmega328P,即Uno MCU
MCP23017 集成電路
兩個 22pF 電容器
330 歐姆電阻
RTC 模塊組件,DS3231
16 MHz 石英振蕩器
藍牙模塊HC-05
EEPROM,CAT24C02WI-G
蜂鳴器
一些端子連接
所有這些 LED 與 Arduino 的接線,將相同行的陽極焊接在一起以獲得 10 行和相同列的陰極。
之后,使用 Arduino 代碼控制所需的數(shù)字就會非常容易。如果想了解如何控制相同矩陣的 LED ,大家可以去搜下光立方的控制方法。
制作的第一步:CAD 和硬件零件。
從激光雕刻和切割零件開始,使用 solidworks 軟件制作了上述設(shè)計,可以從文末的下載鏈接獲取 DXF 文件,此設(shè)計 100% 推薦用于幫助大家制作設(shè)備。
制作的第二步:電路圖繪制。
整個控制電路圖如下:
使用RTC模塊組件進行校準時間和日期配置等,并且通過I2C與MCU建立通信以進行數(shù)據(jù)傳輸。在時鐘里添加鬧鐘功能,可以通過蜂鳴器進行提示。為了與時鐘接口,使用藍牙模塊,調(diào)用Android 應(yīng)用程序,實時調(diào)整時間和日期。
制作的第三步:PCB焊接。
制作電路圖后,將其轉(zhuǎn)換為定制的PCB設(shè)計,并投板生產(chǎn)。
這就是仿輝光管LIXIE時鐘所有的組件了:
一切準備就緒,下面就開始將電子元件焊接到 PCB 上,為此需要烙鐵和焊芯線以及用于 SMD 元件的SMD rework(如果使用 RTC 模塊,則不需要)。
下圖是已經(jīng)將每個組件焊接到其位置,可以使用PCB的兩面來焊接電子元件。
接下來就是進入硬件焊接的第二部分,LED連接,大工程。
正如上面的照片中看到的,在設(shè)計中為每個 LED 創(chuàng)建了一個孔,因此只需使用一些膠水固定 LED,然后將相同行的所有陽極和相同列的陰極焊接在一起。完成之后,將有 14 根用于矩陣的電線,因此只需擰緊它們。
然后,將放置Plexiglas零件并擰緊連接點來繼續(xù)組裝。
制作的第四步:軟件部分。
現(xiàn)在需要的只有軟件代碼,這個Arduino代碼可以從文末的鏈接免費獲得。代碼做了注釋,大家可以根據(jù)自己的需要進行調(diào)整。
/************************************************************************************************************************************************************************ * - Author : BELKHIR Mohamed * * - Profession : (Electrical Ingineer) MEGA DAS owner * * - Main purpose : Industrial Application * * - Copyright (c) holder : All rights reserved ** - License : BSD 2-Clause License * * - Date : 08/15/2019 ** ***********************************************************************************************************************************************************************//*********************************** NOTE **************************************/ // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met:// * Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution.// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED /* MMMMMMMXlxMMWXOkOkkOOOKWMMMMMMMMMMMMMMWKOkkOkkkOXMN0OkOkkOk0NMMMMMMN0000OkkOKNMXOOOOOkOk0WMWKOOOOOkkOO0000000OOOOO0NMMMOcMMMMMMMXlxMMWK; ,0WMMMMMMMMMMMMMMWk' :XMNO, :XMMMMMMN000c .,okKWMXc .xWMNk' cO0000000kc. .kMMMOcMMMMMMMXldMMMN: cWMMMMMMMMMMMMMMMMK, dMMMWx. 'OMMMMMMMMMO :oNMMMMMMo ;KMMM0' .xMMMMMMMMMWd. .kMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMNl :XMMMMMMMX dkWMMMMMMMo ;KMMM0' .dMMMMMMMMMMNc .kMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMK, oWMMMMMW kkWMMMMMMMMo ,KMWM0' .xMMMMMMMMMMMx..kMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMk. .OMMMMM 0xXMMMMMMMMMo ,KMMM0' .xMMMMMMMMMMM0'.kMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMNl ;XMMM XxOMMMMMMMMMMo ,KMWM0' .xMMMMMMMMMMMN:.kMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMK; oWM WkkNMMMMMMMMMMo ,KMWM0' .xMMMMMMMMMMMWd.xMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMk. .k MKxKMMMMMMMMMMMo ,KMWM0' .xMMMMMMMMMMMMNOXMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMWl ;0kOWMMMMMMMMMMMo ,KMWM0' .xMMMMMMMMMMMMMMMMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMMK; ,xNMMMMMMMMMMMMo ,KMWM0' .xMMMMMMNXWMMMMMMMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMMMO. .xMMMMMMMMMMMMMo ,KMWM0' .xMMMMMK::KMMMMMMMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMMMWo ;XMMMMMMMMMMMMo ,KMWM0' .xMMMMXc ,KMMMMMMMMMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMMMMX; oWMMMMMMMMMMMo ,KMWM0' ckkxo' ,KMMMMMMMWMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMMMMM . .kMMMMMMMMMMMo ,KMWM0' oKKKOo. ,KMMWWWWWWMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMMMM Wo ;KMMMMMMMMMMo ,KMWM0' .xMWWWWx.,KMWWWWWWWMOcMMMMMMMXlxMMMN: cNMMMMMMMMMMMMMMMMK, dMMMMMMMMMM MMk. oWMMMMMMMMMo ,KMWM0' .xMWWWWNkxXMWWWWWWWMOcMMMMMMMXlxMWMN: :NMMMMMMMMMMMMMMMMK, dMMMMMMMMM MMXxo. .kMMMMMMMMMo ,KMWM0' .xMWWWWWWWWWWWWWWWWWOcMMMMMMMXlxMWMN: :NMMMMMMMMMMMMMWWMK, dMMMMMMMM MMWkkWo ;KMMMMMMMMo ,KMWM0' .xMWWWWWWWWWWWWWWWWWOcMMMMMMMXlxMWMN: :NMMMMMMMMMMMMXoxWK, dMMMMMMM MMMOxXMX; lNMMMMMMWo ,KMWM0' .xWWWWWWWWWWWWW0lOWWOcMMMMMMMXlxMWMN: :NMWMMMMMMMMMMx.cWK, dMMMMMM MMMXx0MMMO. .kWMMMMMWo ,KWWW0' .dWWWWWWWWWWWWNc.kWWOcMMMMMMMXlxMWMN: :NMWWWMWWWWMMWl cWK, dMMMMM MMMWkkWMMMWo ,KMMMMMWo ,KWWW0' .dWWWWWWWWWWWWK,.kWWO:MMMMMMMXlxMWMN: :NMWWWWWWWWWMX; lWK, dMMMM MMMM0xXMMMMMX: lNMMMWWo ,KWWW0' .dWWWWWWWWWWWWO..kWWO:MMMMMMMXlxWWWN: :NMWWWWWWWWWMO. lWK, dMMM MWWMXxOMMMMMMMO. .xWMMWWo ,KWWW0' .dWWWWWWWWWWWWo .kWWO:MMMMMMMXlxWWWN: :NWWWWWWWWWWNc lW0' dMW MWWMWdlXWWMMMWWWd ,KMWWWo ,KWWW0' .dWWWWWWWWWWW0, .kWWO:MMMMMMMXlxWWWN: :NWWWWWWWWWXl. cW0, oW WWMWM0''OWWWWMWWMX: cXWWWl ,0WNWO' dWWWWWWWWWNO; .kWWO:MMMMMMMXlxWWW0l,,,,,,lOOOOOOOOOko;,,;xNOc,,,,,;lKWN0OOOd;;lkXWWWWWWNx;;;;,,:xXWKo;,,,,,:kNWNk:,,,,,;lkOOOOOOOOxc;,,c0WWO:*/#if defined(ESP8266) #include <pgmspace.h> #else #include <avr/pgmspace.h> #endif #include <Wire.h> // must be incuded here so that Arduino library object file references work #include <RtcDS3231.h> // Include the RTC library #include <EEPROM.h> // Include the EEPROM library needed for alarm handeling #include "Adafruit_MCP23017.h" // Include the MCP library to interface the MCP iCRtcDS3231 Rtc; // Create the RTC instance RtcDateTime dateTimeData; Adafruit_MCP23017 MyMCP; // Create the MCP instancechar SerialData; // Use this variable to read each caractere received through serial port char SerialDataDecisison; String dateData=""; // Store all serial caracters in this variable String timeData=""; // Store all serial caracters in this variable String alarmData=""; // Store all serial caracters in this variable int monthNumber=13; long int dotBlinkTime=millis(); int alarmHours=0; int alarmMinutes=0; int alarmSeconds=0; int alarmActivate=0; int alarmCounterControl=0; int alarmCounter=0; int displayDot=1; long int buzzerTime=millis(); long int buzzerTimeControl=millis(); long int dispalDate=millis();const int N0=1; // The first line of plexiglass LEDs 0 const int N1=0; // The second line of plexiglass LEDs 1 const int N2=15; // The third line of plexiglass LEDs 2 const int N3=14; // . const int N4=13; // . const int N5=12; // . const int N6=11; // . const int N7=9; // . const int N8=10; // . const int N9=8; // The last line of plexiglass LEDs 9 const int dig1=2; // Control of the first digit const int dig2=3; // . const int dig3=4; // . const int dig4=5; // Control of the fourth digit const int dot=6; // Control of the two dots const int buzzer=3; // Control of the buzzerconst int delaySeq=5000;void setup() {Serial.begin(9600);Serial.setTimeout(100);Wire.setClock(3400000);pinMode(buzzer,OUTPUT);digitalWrite(buzzer,LOW);MyMCP.begin(1);//--------RTC SETUP ------------Rtc.Begin();for(int i=0;i<16;i++){MyMCP.pinMode(i,OUTPUT);MyMCP.digitalWrite(i,LOW);}clearDisplay();if (!Rtc.IsDateTimeValid()) {// Common Cuases:// 1) first time you ran and the device wasn't running yet// 2) the battery on the device is low or even missingSerial.println("RTC lost confidence in the DateTime!");// following line sets the RTC to the date & time this sketch was compiled// it will also reset the valid flag internally unless the Rtc device is// having an issue}if (!Rtc.GetIsRunning()){Serial.println("RTC was not actively running, starting now");Rtc.SetIsRunning(true);}Rtc.Enable32kHzPin(false);Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone); dateTimeData=Rtc.GetDateTime();if(EEPROM.read(0)==1){alarmMinutes=EEPROM.read(1);alarmHours=EEPROM.read(2);alarmActivate=1;} }void loop() {while(Serial.available()) // While serial data are available we store it {delay(10);SerialDataDecisison=Serial.read();if(SerialDataDecisison=='d'){monthNumber=Serial.parseInt();switch (monthNumber){case 1 : dateData+="Jan"; break;case 2 : dateData+="Feb"; break;case 3 : dateData+="Mar"; break;case 4 : dateData+="Apr"; break;case 5 : dateData+="May"; break;case 6 : dateData+="Jun"; break;case 7 : dateData+="Jul"; break;case 8 : dateData+="Aug"; break;case 9 : dateData+="Sep"; break;case 10 : dateData+="Oct"; break;case 11 : dateData+="Nov"; break;case 12 : dateData+="Dec"; break;}while(Serial.available()) // While serial data are available we store it {delay(10);SerialData=Serial.read();dateData+=SerialData;}const char* newDate=dateData.c_str();dateTimeData=Rtc.GetDateTime();String TimeFromRTC=(String(dateTimeData.Hour())+":"+String(dateTimeData.Minute())+":"+String(dateTimeData.Second()));const char* sameTime=TimeFromRTC.c_str();Serial.println(sameTime);RtcDateTime RtcConfig = RtcDateTime(newDate, sameTime);Rtc.SetDateTime(RtcConfig);}if(SerialDataDecisison=='t'){while(Serial.available()) // While serial data are available we store it {delay(10);SerialData=Serial.read();timeData+=SerialData;}const char* newTime=timeData.c_str();dateTimeData=Rtc.GetDateTime();String DateFromRTC=(String(dateTimeData.Month())+" "+String(dateTimeData.Day())+" "+String(dateTimeData.Year()));const char* sameDate=DateFromRTC.c_str();Serial.println(sameDate);RtcDateTime RtcConfig = RtcDateTime(sameDate, newTime);Rtc.SetDateTime(RtcConfig);}if(SerialDataDecisison=='a'){while(Serial.available()) // While serial data are available we store it {delay(10);SerialData=Serial.read();alarmData+=SerialData;}alarmHours=getValue(alarmData, ':', 0).toInt();alarmMinutes=getValue(alarmData, ':', 1).toInt();alarmSeconds=getValue(alarmData, ':', 2).toInt();EEPROM.write(0,1);EEPROM.write(1,alarmMinutes);EEPROM.write(2,alarmHours);alarmActivate=1;buzzerTime=millis();}}dateData="";timeData="";alarmData="";if(millis()-dotBlinkTime<1000&&displayDot==1){MyMCP.digitalWrite(dot,HIGH);}if(millis()-dotBlinkTime>1000&&displayDot==1){MyMCP.digitalWrite(dot,LOW);if(millis()-dotBlinkTime>2000&&displayDot==1){dotBlinkTime=millis();}}RtcDateTime now = Rtc.GetDateTime();if(millis()-dispalDate<10000){displayMode(now.Minute(),"right");displayMode(now.Hour(),"left");displayDot=1;}if(millis()-dispalDate>10000){displayDot=0;MyMCP.digitalWrite(dot,LOW);displayMode(now.Day(),"right");displayMode(now.Month(),"left");if(millis()-dispalDate>15000){dispalDate=millis();displayDot=1;}}if(alarmActivate==1&&now.Hour()==alarmHours&&now.Minute()==alarmMinutes){if(alarmCounterControl<8){alarmControl();}else{alarmCounterControl=0;alarmActivate=0;EEPROM.write(0,0);}} } void alarmControl() {if(millis()-buzzerTime<65){digitalWrite(buzzer,HIGH);}if(millis()-buzzerTime>65){digitalWrite(buzzer,LOW);if(millis()-buzzerTime>130&&alarmCounter<4){buzzerTime=millis();alarmCounter+=1;}if(millis()-buzzerTime>1000){alarmCounter=0;alarmCounterControl+=1;}} } void clearDisplay() {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);delay(0); } void displayMode(int value, String side) {if(side=="right"){switch (value%10){case 0 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N0,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N0,LOW);}break;case 1 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N1,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N1,LOW);}break;case 2 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N2,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N2,LOW);}break;case 3 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N3,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N3,LOW);}break;case 4 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N4,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N4,LOW);}break;case 5 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N5,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N5,LOW);}break;case 6 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N6,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N6,LOW);}break;case 7 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N7,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N7,LOW);}break;case 8 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N8,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N8,LOW);}break;case 9 : {MyMCP.digitalWrite(dig1,LOW);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N9,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N9,LOW);}break;}switch (value/10){case 0 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N0,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N0,LOW);}break;case 1 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N1,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N1,LOW);}break;case 2 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N2,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N2,LOW);}break;case 3 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N3,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N3,LOW);}break;case 4 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N4,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N4,LOW);}break;case 5 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N5,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N5,LOW);}break;case 6 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N6,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N6,LOW);}break;case 7 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N7,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N7,LOW);}break;case 8 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N8,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N8,LOW);}break;case 9 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,LOW);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N9,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N9,LOW);}break;}}if(side=="left"){switch (value%10){case 0 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N0,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N0,LOW);}break;case 1 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N1,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N1,LOW);}break;case 2 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N2,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N2,LOW);}break;case 3 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N3,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N3,LOW);}break;case 4 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N4,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N4,LOW);}break;case 5 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N5,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N5,LOW);}break;case 6 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N6,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N6,LOW);}break;case 7 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N7,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N7,LOW);}break;case 8 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N8,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N8,LOW);}break;case 9 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,LOW);MyMCP.digitalWrite(dig4,HIGH);MyMCP.digitalWrite(N9,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N9,LOW);}break;}switch (value/10){case 0 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N0,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N0,LOW);}break;case 1 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N1,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N1,LOW);}break;case 2 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N2,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N2,LOW);}break;case 3 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N3,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N3,LOW);}break;case 4 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N4,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N4,LOW);}break;case 5 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N5,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N5,LOW);}break;case 6 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N6,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N6,LOW);}break;case 7 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N7,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N7,LOW);}break;case 8 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N8,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(N8,LOW);}break;case 9 : {MyMCP.digitalWrite(dig1,HIGH);MyMCP.digitalWrite(dig2,HIGH);MyMCP.digitalWrite(dig3,HIGH);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N9,HIGH);delayMicroseconds(delaySeq);MyMCP.digitalWrite(dig4,LOW);MyMCP.digitalWrite(N9,LOW);}break;}} } String getValue(String data, char separator, int index) {int found = 0;int strIndex[] = { 0, -1 };int maxIndex = data.length() - 1;for (int i = 0; i <= maxIndex && found <= index; i++) {if (data.charAt(i) == separator || i == maxIndex) {found++;strIndex[0] = strIndex[1] + 1;strIndex[1] = (i == maxIndex) ? i+1 : i;}}return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; }代碼編譯完成之后,就可以使用 Arduino IDE將代碼上傳到 ATmega328 MCU,然后將MCU 放置在 PCB 上的插座中即可。
最后,使用外部 5v 電源適配器給整個項目供電,就可以測試了。
當(dāng)然,還可以創(chuàng)建了一個Android應(yīng)用程序來使用它,同時設(shè)置時間,日期和時鐘的鬧鐘。
雖然這個項目制作過程很簡單,但整體來說是一個比較有趣,有實際意義的作品。這個作為一個引子,大家可以DIY自己的時鐘,比如使用不同顏色的LED來顯示數(shù)字。
好了,接下來的時間,交給大家了,高清原理圖,源碼,CAD文件,都在下面鏈接了。
原文鏈接:
https://www.hackster.io/diyguyChris/arduino-lixie-clock-6ce547
作者:DIY GUY Chris,達爾聞?wù)f編輯
項目資料下載 |?百度網(wǎng)盤鏈接:
https://pan.baidu.com/s/1WefAOvilbfU8NYAg6de8aA
提取碼:y826
END
一個巨型的ESP8266模塊,圍觀圍觀
用 ESP32 制造便攜式 IoT 顯示器
拆解一款29元包郵的“超聲波”清洗機,體驗一下智商稅
如何做一個炫酷的墨水屏電子鐘?
總結(jié)
以上是生活随笔為你收集整理的【开源】纯手工低成本打造拟辉光管时钟,也可以很酷炫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 噪音太大怎么办?简单几步笔记本更安静时间
- 下一篇: 同步传输与异步传输区别