不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我
《命运石之门》里 “世界线变动率探测仪”,各种辉光管的作品,让热爱DIY的小伙伴欢喜,但是辉光管的价格又望而却步,并且现在已经很难买到了。怎么能难倒我们的工程师呢?拟辉光管时钟制作指南来了,先看一张效果图:
制作过程如下视频(英文原声,大家自行理解):
在分享制作过程之前,我们先来了解下LIXIE显示原理。
LIXIE的一端包含有LED,也可以是WS2812B智能LED,能根据需要改变显示颜色的。LED发出的光线被聚集到一叠树脂玻璃Plexiglas中。这类“端面照光”显示器利用全内反射的现象,可将光保持在树脂玻璃内刻蚀出图案的区域。每片代表一个数字,并且通常一次只照亮一张树脂玻璃片,从而显示出具体的数字。
在今天分享的时钟项目中,时钟和分钟的显示需要四位数,每位数需要雕刻出0-9这些数字,然后再添加两个圆点来区分小时和分钟,所以总共需要82个LED。这里指示数字使用蓝色LED灯,区分时分圆点的用白色LED灯。
除了82个LED之外,还需要以下器件:
ATmega328P,即Uno MCU
MCP23017 集成电路
两个 22pF 电容器
330 欧姆电阻
RTC 模块组件,DS3231
16 MHz 石英振荡器
蓝牙模块HC-05
EEPROM,CAT24C02WI-G
蜂鸣器
-
一些端子连接
制作的第一步:CAD 和硬件零件。
从激光雕刻和切割零件开始,使用 solidworks 软件制作了上述设计,可以从文末的下载链接获取 DXF 文件,此设计 100% 推荐用于帮助大家制作设备。
制作的第二步:电路图绘制。
整个控制电路图如下:
制作的第三步:PCB焊接。

一切准备就绪,下面就开始将电子元件焊接到 PCB 上,为此需要烙铁和焊芯线以及用于 SMD 元件的SMD rework(如果使用 RTC 模块,则不需要)。
下图是已经将每个组件焊接到其位置,可以使用PCB的两面来焊接电子元件。

制作的第四步:软件部分。
/************************************************************************************************************************************************************************* - 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:*/RtcDS3231 Rtc; // Create the RTC instanceRtcDateTime dateTimeData;Adafruit_MCP23017 MyMCP; // Create the MCP instancechar SerialData; // Use this variable to read each caractere received through serial portchar SerialDataDecisison;String dateData=""; // Store all serial caracters in this variableString timeData=""; // Store all serial caracters in this variableString alarmData=""; // Store all serial caracters in this variableint 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 0const int N1=0; // The second line of plexiglass LEDs 1const int N2=15; // The third line of plexiglass LEDs 2const 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 9const int dig1=2; // Control of the first digitconst int dig2=3; // .const int dig3=4; // .const int dig4=5; // Control of the fourth digitconst int dot=6; // Control of the two dotsconst 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]) : "";}
好了,接下来的时间,交给大家了,高清原理图,源码,CAD文件,都在下面链接了。
原文链接:
https://www.hackster.io/diyguyChris/arduino-lixie-clock-6ce547
项目资料下载 | 百度网盘链接:
https://pan.baidu.com/s/1WefAOvilbfU8NYAg6de8aA
提取码:y826
一个巨型的ESP8266模块,围观围观
用 ESP32 制造便携式 IoT 显示器
拆解一款29元包邮的“超声波”清洗机,体验一下智商税
如何做一个炫酷的墨水屏电子钟?

