新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 采用ESP8266的創意時鐘擺件

        采用ESP8266的創意時鐘擺件

        作者: 時間:2024-01-29 來源:趣味硬件 收藏

        這個模塊在近兩年來芯片大幅度漲價的趨勢下依然能夠保持十幾塊錢一片,簡直是DIY的利器,其基本功能基本能夠滿足小型DIY應用,速度也是杠杠的,就是對于我來說開發有點小麻煩了點,不太習慣Arduino IDE、Lua腳本等方式寫代碼,所以我選擇的是SDK方式,可能是習慣了的方式吧。

        本文引用地址:http://www.104case.com/article/202401/455179.htm

        一、硬件部分

        1.核心部分模塊使用,其基本的最小系統如下所示。


        2.USB轉串口部分,這里采用的電路可以實現自動下載,我們知道,平時我們下載的固件的時候都是需要將GPIO0引腳拉低后再上電,才能進入下載模式,這個一鍵下載電路就完美解決了這個問題,非常方便。


        3.電源部分使用5V轉3.3V的芯片1117-3.3芯片,使用兩片,和LED燈分開供電,因為LED燈比較多,怕電流太大了會導致wifi連接不穩定。



        4.LED驅動,這里使用TM1637數碼管專用驅動芯片來驅動LED燈,它使用IIC通信,非常方便。再加上MOS管增強驅動,使LED燈亮度更好。




        5.LED矩陣組成4個8段數碼管和兩個點



        6.畫好的PCB如下:



        二、軟件部分

        軟件使用RTOS的SDK方式,其實這個也很簡單,歷程非常多。下面附上最主要的幾個函數

        1.WiFi連接

        /*wifi參數設置*/user_set_station_config(void)
        {    wifi_set_opmode(STATION_MODE);              //設置為STATION MODE
            strcpy(station_cfg.ssid, ssid);          //ssid名稱
            strcpy(station_cfg.password, password);  //密碼
            wifi_station_set_config(&station_cfg);      //設置WIFI帳號和密碼}

        2.網絡時間獲取

        LOCAL unsigned char time_buf[8]; //空年月日時分秒周LOCAL void ICACHE_FLASH_ATTR SyncNetTimeCallBack(void) {    //獲取時間戳
        	uint32 ts = sntp_get_current_timestamp();
        	 unsigned char i, tmp;	if (ts != 0) {
        		os_timer_disarm(&getNetSyncTimer);
        		os_delay_us(60000); //延時等待穩定
        		os_delay_us(60000); //延時等待穩定
                //處理時間戳,返回具體的時間
        		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); //使能毫秒定時器
        	}
        }
        void ICACHE_FLASH_ATTR wifi_event_handler_cb(System_Event_t *event) {		//開始網絡授時
        		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.兩個任務,一個走時,一個檢測光敏電阻,晚上的時候就熄滅掉,白天的時候亮起。具體的任務主體就是設一個1秒的定時器來走時,然后間隔5分鐘重新從網絡獲取時間,這樣即使是1秒的定時器不準影響也很小,因為每五分鐘會修正一次。

        	 xTaskCreate(time_update, "time_update", 1024, NULL, 11, NULL);
        	 xTaskCreate(time_update1, "time_update1", 1024, NULL, 10, NULL);

        三、實物如下




        放桌子上拍攝看著效果不太好。




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新昌县| 通许县| 大安市| 湘阴县| 镇原县| 呼和浩特市| 常熟市| 高州市| 名山县| 阳曲县| 兰西县| 中卫市| 高碑店市| 哈巴河县| 安泽县| 隆林| 兴国县| 巴南区| 郴州市| 攀枝花市| 南丹县| 建始县| 奎屯市| 忻城县| 阿拉善盟| 西乌| 罗山县| 镇安县| 遂平县| 武定县| 安徽省| 那坡县| 突泉县| 枣庄市| 包头市| 长垣县| 城固县| 建湖县| 永泰县| 铜陵市| 洛宁县|