采用ESP8266的創(chuàng)意時(shí)鐘擺件
ESP8266這個(gè)模塊在近兩年來芯片大幅度漲價(jià)的趨勢(shì)下依然能夠保持十幾塊錢一片,簡(jiǎn)直是DIY的利器,其基本功能基本能夠滿足小型DIY應(yīng)用,速度也是杠杠的,就是對(duì)于我來說開發(fā)有點(diǎn)小麻煩了點(diǎn),不太習(xí)慣Arduino IDE、Lua腳本等方式寫代碼,所以我選擇的是SDK方式,可能是習(xí)慣了單片機(jī)的方式吧。
本文引用地址:http://butianyuan.cn/article/202401/455179.htm一、硬件部分
1.核心部分模塊使用ESP12,其基本的最小系統(tǒng)如下所示。
2.USB轉(zhuǎn)串口部分,這里采用的電路可以實(shí)現(xiàn)自動(dòng)下載,我們知道,平時(shí)我們下載ESP8266的固件的時(shí)候都是需要將GPIO0引腳拉低后再上電,才能進(jìn)入下載模式,這個(gè)一鍵下載電路就完美解決了這個(gè)問題,非常方便。
3.電源部分使用5V轉(zhuǎn)3.3V的芯片1117-3.3芯片,使用兩片,ESP8266和LED燈分開供電,因?yàn)長(zhǎng)ED燈比較多,怕電流太大了會(huì)導(dǎo)致wifi連接不穩(wěn)定。
4.LED驅(qū)動(dòng),這里使用TM1637數(shù)碼管專用驅(qū)動(dòng)芯片來驅(qū)動(dòng)LED燈,它使用IIC通信,非常方便。再加上MOS管增強(qiáng)驅(qū)動(dòng),使LED燈亮度更好。
5.LED矩陣組成4個(gè)8段數(shù)碼管和兩個(gè)點(diǎn)
6.畫好的PCB如下:
二、軟件部分
軟件使用RTOS的SDK方式,其實(shí)這個(gè)也很簡(jiǎn)單,歷程非常多。下面附上最主要的幾個(gè)函數(shù)
1.WiFi連接
/*wifi參數(shù)設(shè)置*/user_set_station_config(void) { wifi_set_opmode(STATION_MODE); //設(shè)置為STATION MODE strcpy(station_cfg.ssid, ssid); //ssid名稱 strcpy(station_cfg.password, password); //密碼 wifi_station_set_config(&station_cfg); //設(shè)置WIFI帳號(hào)和密碼}
2.網(wǎng)絡(luò)時(shí)間獲取
LOCAL unsigned char time_buf[8]; //空年月日時(shí)分秒周LOCAL void ICACHE_FLASH_ATTR SyncNetTimeCallBack(void) { //獲取時(shí)間戳 uint32 ts = sntp_get_current_timestamp(); unsigned char i, tmp; if (ts != 0) { os_timer_disarm(&getNetSyncTimer); os_delay_us(60000); //延時(shí)等待穩(wěn)定 os_delay_us(60000); //延時(shí)等待穩(wěn)定 //處理時(shí)間戳,返回具體的時(shí)間 char *pDate = (void *) sntp_get_real_time(ts); data = sntp_get_time_change(pDate); os_printf("20%x_%x_%x_%x:%x:%x_%xn",data.year,data.month,data.day,data.hour,data.minute,data.second,data.week); time_buf1[1] = data.year; time_buf1[2] = data.month; time_buf1[3] = data.day; time_buf1[4] = data.hour; time_buf1[5] = data.minute; time_buf1[6] = data.second; //time_buf1[4]/16*10+time_buf1[4]%16; os_printf("%d:%d:%d rn", time_buf1[4]/16*10+time_buf1[4]%16, time_buf1[5]/16*10+time_buf1[5]%16, time_buf1[6]/16*10+time_buf1[6]%16); sec=time_buf1[6]/16*10+time_buf1[6]%16; min=time_buf1[5]/16*10+time_buf1[5]%16; hour=time_buf1[4]/16*10+time_buf1[4]%16; os_timer_arm(&second_timer, 1000, 1); //使能毫秒定時(shí)器 } } void ICACHE_FLASH_ATTR wifi_event_handler_cb(System_Event_t *event) { //開始網(wǎng)絡(luò)授時(shí) sntp_setservername(0, "time1.aliyun.com"); sntp_setservername(1, "time2.aliyun.com"); sntp_setservername(2, "time3.aliyun.com"); // set sntp server after got ip address sntp_init(); os_timer_disarm(&getNetSyncTimer); os_timer_setfn(&getNetSyncTimer, (os_timer_func_t *) SyncNetTimeCallBack,NULL); os_timer_arm(&getNetSyncTimer, 1000, 1); }
3.兩個(gè)任務(wù),一個(gè)走時(shí),一個(gè)檢測(cè)光敏電阻,晚上的時(shí)候就熄滅掉,白天的時(shí)候亮起。具體的任務(wù)主體就是設(shè)一個(gè)1秒的定時(shí)器來走時(shí),然后間隔5分鐘重新從網(wǎng)絡(luò)獲取時(shí)間,這樣即使是1秒的定時(shí)器不準(zhǔn)影響也很小,因?yàn)槊课宸昼姇?huì)修正一次。
xTaskCreate(time_update, "time_update", 1024, NULL, 11, NULL); xTaskCreate(time_update1, "time_update1", 1024, NULL, 10, NULL);
三、實(shí)物如下
放桌子上拍攝看著效果不太好。
評(píng)論