給大家分享一個(gè)用ESP8266做一個(gè)高顏值的RGB時(shí)鐘的項(xiàng)目!
這個(gè)時(shí)鐘還具有自動亮度控制功能并配備了溫度傳感器!
材料準(zhǔn)備
第1步: 準(zhǔn)備工作
Neo Pixel是可尋址的LED,我們可以通過編程,讓它顯示任何一種顏色或者數(shù)字。
Neo Pixel有不同的smd封裝,這個(gè)項(xiàng)目使用的是Ws2812b-5050 mini RGB。
這種迷你LED的額定電壓為3.0V到5.5V,電流為16mA(每個(gè)LED)。
NodeMCU有3.3V的穩(wěn)壓器,可以正常驅(qū)動所有的LED。
第2步:使用Neo Pixel Led制作7段顯示器
在這里,我們需要把所有的電源并聯(lián)起來,把所有的數(shù)據(jù)連接串聯(lián)起來,使用7段顯示方法,如上圖連接所有的LED。
每段有2個(gè)LED,整個(gè)面板總共有14個(gè)LED。
我們需要4個(gè)面板來顯示時(shí)間(2個(gè)顯示小時(shí),2個(gè)顯示分鐘)。
當(dāng)然還可以再連接兩個(gè)面板來顯示秒/任何其他數(shù)值,或者溫度。
不管怎么連接,記住總是要把第一個(gè)面板的DOUT
連接到第二個(gè)面板的DIN
。
第3步:連接儀表盤
為了連接小時(shí)和分鐘面板,在兩面板之間有一個(gè)小的PCB板,名為Dash
,包含了2個(gè)LED作為二進(jìn)制數(shù)字,這2個(gè)LED燈每隔一秒就會發(fā)光一次。
第4步:NodeMCU/ESP8266介紹
ESP8266集成了一個(gè)32位Tensilica處理器,標(biāo)準(zhǔn)的數(shù)字外圍接口。
我們的ESP8266具有板載Wi-Fi支持,通過它我們可以連上互聯(lián)網(wǎng)調(diào)整時(shí)間,而不需要任何RTC(實(shí)時(shí)時(shí)鐘)模塊。
這樣子的話可以減少連接,使整個(gè)項(xiàng)目變得更簡單一些。
第5步:代碼中支持的功能
如果使用本文提供的代碼,那么我們可以在這個(gè)7段時(shí)鐘中增加2個(gè)額外的功能:
- 使用觸覺開關(guān)的溫度和濕度顯示
在13號針腳上添加一個(gè)DHT11傳感器,在12號針腳上添加一個(gè)觸覺按鈕,可以在屏幕上獲得攝氏或華氏的溫度值。
用一個(gè)10k電阻將按鈕的第12針腳連接到5V,另一端連接到GND。也就是說,當(dāng)按鈕針腳被拉到GND時(shí),顯示器將顯示溫度讀數(shù)。如果沒有這個(gè)溫度傳感器,代碼也可以工作,所以如果你想讓項(xiàng)目簡單一點(diǎn),也可以不需要這些連接。
- 使用引腳A0的LDR傳感器進(jìn)行亮度控制
通過在A0引腳上做一個(gè)電阻分壓器網(wǎng)絡(luò),添加一個(gè)帶有10k電阻的LDR傳感器,可以相應(yīng)地改變亮度。
白天的亮度高,晚上的亮度低。如果你不想要可調(diào)節(jié)亮度,這部分代碼也可以在沒有這些傳感器的情況下工作,它將會鎖定在默認(rèn)設(shè)置。
第6步:視頻演示
第7步:7段時(shí)鐘
現(xiàn)在,我們有4個(gè)面板和一個(gè)Dash(儀表盤)。
根據(jù)上面GIF圖來連接面板和儀表盤;將2個(gè)面板串聯(lián)在一起。
然后使用上面給出的原理圖連接NodeMCU。
第8步:代碼
- 首先使用庫來初始化代碼:
#include
#include
#include
#include
#include
#include
#include
- 定義所有像素、I/O引腳、傳感器引腳:
#definePIXEL_PER_SEGMENT2//NumberofLEDsineachSegment
#definePIXEL_DIGITS4//NumberofconnectedDigits
#definePIXEL_PIN2//GPIOPin
#definePIXEL_DASH1//Binarysegment
#defineLDR_PINA0//LDRpin
#defineDHT_PIN13//DHTSensorpin
#defineBUTTON_PIN12//Buttonpin
3. 對于時(shí)間格式,使用Wi-Fi把ESP8266連接到互聯(lián)網(wǎng):
WiFi.begin(ssid,password);
Serial.print("Connecting.");
while(WiFi.status()!=WL_CONNECTED)
- 時(shí)間設(shè)置:
voiddisp_Time(){
clearDisplay();
writeDigit(0,Hour/10);
writeDigit(1,Hour%10);
writeDigit(2,Minute/10);
writeDigit(3,Minute%10);
writeDigit(4,Second/10);
writeDigit(5,Second%10);
disp_Dash();
5. 面板上的顏色設(shè)置:
if(index==0||index==1)color=strip.Color(0,Brightness,0);
if(index==2||index==3)color=strip.Color(0,Brightness,0);
if(index==4||index==5)color=strip.Color(Brightness,0,0);
這只是一個(gè)簡單的介紹,同時(shí)代碼還有溫度和自動時(shí)間選項(xiàng)。
溫度模式可以通過數(shù)字針腳12的開關(guān)來選擇。
第9步:完整代碼
#include
#include
#include
#include
#include
#include
#include
#definePIXEL_PER_SEGMENT2//NumberofLEDsineachSegment
#definePIXEL_DIGITS4//NumberofconnectedDigits
#definePIXEL_PIN2//GPIOPin
#definePIXEL_DASH1//Binarysegment
#defineLDR_PINA0//LDRpin
#defineDHT_PIN13//DHTSensorpin
#defineBUTTON_PIN12//Buttonpin
//Uncommentthetypeofsensorinuse
#defineDHT_TYPEDHT11//DHT11
//#defineDHT_TYPEDHT22//DHT22(AM2302)
//#defineDHT_TYPEDHT21//DHT21(AM2301)
#defineTIME_FORMAT12//12=12hoursformat||24=24hoursformat
Adafruit_NeoPixelstrip=Adafruit_NeoPixel((PIXEL_PER_SEGMENT*7*PIXEL_DIGITS)+(PIXEL_DASH*2),PIXEL_PIN,NEO_GRB+NEO_KHZ800);
DHTdht(DHT_PIN,DHT_TYPE);
//setWi-FiSSIDandpassword
constchar*ssid="Hackster";
constchar*password="Sainisagar7294";
WiFiUDPntpUDP;
//'time.nist.gov'isused(defaultserver)with+1houroffset(3600seconds)60seconds(60000milliseconds)updateinterval
NTPClienttimeClient(ntpUDP,"time.nist.gov",19800,60000);//GMT+5:30:5*3600+30*60=19800
intperiod=2000;//Updatefrequency
unsignedlongtime_now=0;
intSecond,Minute,Hour;
//setdefaultbrightness
intBrightness=40;
//currenttemperature,updatedinloop()
intTemperature;
boolShow_Temp=false;
//Digitsarray
bytedigits[12]={
//abcdefg
0b1111110,//0
0b0110000,//1
0b1101101,//2
0b1111001,//3
0b0110011,//4
0b1011011,//5
0b1011111,//6
0b1110000,//7
0b1111111,//8
0b1110011,//9
0b1001110,//C
0b1000111,//F
};
//ClearallthePixels
voidclearDisplay(){
for(inti=0;i0,0,0));
}
strip.show();
}
voidsetup(){
Serial.begin(115200);
strip.begin();
strip.show();
dht.begin();
pinMode(BUTTON_PIN,INPUT);
WiFi.begin(ssid,password);
Serial.print("Connecting.");
while(WiFi.status()!=WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("connected");
timeClient.begin();
delay(10);
}
voidloop(){
if(WiFi.status()==WL_CONNECTED){//checkWiFiconnectionstatus
intsensor_val=analogRead(LDR_PIN);
Brightness=40;
timeClient.update();
intHours;
unsignedlongunix_epoch=timeClient.getEpochTime();//getUNIXEpochtime
Second=second(unix_epoch);//getseconds
Minute=minute(unix_epoch);//getminutes
Hours=hour(unix_epoch);//gethours
if(TIME_FORMAT==12){
if(Hours>12){
Hour=Hours-12;
}
else
Hour=Hours;
}
else
Hour=Hours;
}
if(digitalRead(BUTTON_PIN)==LOW){
Show_Temp=true;
}
else
Show_Temp=false;
if(Show_Temp){
Temperature=dht.readTemperature();
Serial.println(Temperature);
clearDisplay();
writeDigit(0,Temperature/10);
writeDigit(1,Temperature%10);
writeDigit(2,10);
strip.setPixelColor(28,strip.Color(Brightness,Brightness,Brightness));
strip.show();
delay(3000);
clearDisplay();
Show_Temp=false;
}
while(millis()>time_now+period){
time_now=millis();
disp_Time();//ShowTime
}
}
voiddisp_Time(){
clearDisplay();
writeDigit(0,Hour/10);
writeDigit(1,Hour%10);
writeDigit(2,Minute/10);
writeDigit(3,Minute%10);
writeDigit(4,Second/10);
writeDigit(5,Second%10);
disp_Dash();
strip.show();
}
voiddisp_Dash(){
intdot,dash;
for(inti=0;i2;i++){
dot=2*(PIXEL_PER_SEGMENT*7)+i;
for(intj=0;j2*(PIXEL_PER_SEGMENT*7)+2);
Second%2==0?strip.setPixelColor(dash,strip.Color(0,Brightness,0)):strip.setPixelColor(dash,strip.Color(0,Brightness,0));
}
}
}
voidwriteDigit(intindex,intval){
bytedigit=digits[val];
intmargin;
if(index==0||index==1)margin=0;
if(index==2||index==3)margin=1;
if(index==4||index==5)margin=2;
for(inti=6;i>=0;i--){
intoffset=index*(PIXEL_PER_SEGMENT*7)+i*PIXEL_PER_SEGMENT+margin*2;
uint32_tcolor;
if(digit&0x01!=0){
if(index==0||index==1)color=strip.Color(Brightness,0,Brightness);
if(index==2||index==3)color=strip.Color(Brightness,0,Brightness);
if(index==4||index==5)color=strip.Color(Brightness,0,0);
}
else
color=strip.Color(0,0,0);
for(intj=offset;j>1;
}
}
第10步:完整電路圖(高清版本文末下載)
第11步:PCB設(shè)計(jì)(面板部分)
主要的PCB設(shè)計(jì),用于顯示數(shù)字和其他字母。
點(diǎn)擊閱讀原文可以下載源文件。
第12步:PCB設(shè)計(jì)(Dash部分)
第13步:故障排除
-
DIN
總是與DOUT
串聯(lián)在一起,如果接反了或從任何地方斷開了,整個(gè)裝置就會停止工作; -
按上面的圖連接Dash;
-
確保所有的連接都焊接好,干焊會導(dǎo)致數(shù)據(jù)值和顏色的改變;
-
在焊接時(shí),不要把印刷電路板加熱太多,溫度保持在300度。
第14步:完整展示
喜歡大家喜歡這個(gè)項(xiàng)目!
審核編輯 :李倩
-
led
+關(guān)注
關(guān)注
242文章
23333瀏覽量
662174 -
pcb
+關(guān)注
關(guān)注
4324文章
23148瀏覽量
399056 -
穩(wěn)壓器
+關(guān)注
關(guān)注
24文章
4254瀏覽量
94003
原文標(biāo)題:酷,用ESP8266做一個(gè)高顏值的RGB時(shí)鐘!
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論