本方案采用的是MCU+AT指令的形式開發,MCU是大家比較熟悉的意法半導體公司STM32F103C8T6,WiFi模塊使用的是安信可ESP-12F,本方案是一個Demo設計,比較簡單,僅實現了功能,算是一個拋磚引玉吧!
先上視頻演示:https://v.youku.com/v_show/id_XN ... m=a2hzp.8244740.0.0
WiFi模塊資料鏈接:wiki點ai-thinker點com/esp8266
STM32F103C8芯片資料鏈接:https://www.stmicroelectronics.c ... 103c8.html#overview
硬件部分,由時鐘電路+WiFi模塊+MCU最小系統+OLED顯示屏+穩壓電路+按鍵電路組成,這里采用時鐘電路是希望模塊在斷網后還能獲取一個比較精準的時間,并且電路設計上增加了儲能電容可以在斷電一個月后保持時間數據不丟失,當然這里也可以用STM32里面的RTC時鐘;OLED顯示屏采用的是裸屏設計,使整體電路板一體化效果好些;其他電路都是參考開發板or硬件手冊上設計的;硬件設計軟件采用的是 Altium Designer (13.0),原理圖概略圖如下圖所示:
11111.PNG (74.93 KB, 下載次數: 106)
下載附件
2019-5-19 10:01 上傳
實物圖如下圖所示:(電路板是找廠家打樣的,元器件是純人工手焊)
22222222222222.PNG (1.25 MB, 下載次數: 98)
下載附件
2019-5-19 10:02 上傳
軟件部分,由底層驅動+WiFi聯網+調用API接口并解析數據+OLED顯示組成;首先分析一波,這里面用到了MCU的USART、I2C*2、GPIO*2引腳資源,然后對應去找相關類似的例程,既然已經有輪子了,為何還要花時間去造輪子,當然是直接改例程來的舒服。這里開發方式采用的是庫函數開發,用的是STM32的標準庫,對應找到了OLED顯示屏的驅動資料、PCF8563的驅動資料、WiFi模組的驅動資料、按鍵輸入的驅動資料;將它們整合到一個工程里面,然后更改里面的引腳配置等,就完成了整個設計的底層驅動。
WiFi聯網,這里WiFi是設置成了STA模式(STA模式是啥,可自行問度娘),然后連接手機開的熱點(注意手機必須要能連接上公網,即我們常用的互聯網)。具體如何設置可以參考WiFi模塊的AT指令集,AT指令集在上面WiFi模塊資料里面有。手機開的WiFi熱點的賬號密碼需要事先知道,并寫入在程序里面,后續如果需要更改熱點的賬號密碼,就需要更改程序。
天氣和時間更新,即調用API接口并解析數據,這里用到了兩個API接口,第一個是心知天氣的天氣實況數據獲取,因為是免費版所以只能獲取到天氣現象和氣溫兩項數據;第二個是Nowapi的北京時間數據獲取。因為用到的兩個API接口是隸屬于兩個不同的服務器,所以程序上需要進行切換,連完這個服務器后需要斷開連另一個服務器,比較麻煩。后面我發現其實Nowapi里面就有天氣數據可以獲取,完全可以通過只連接這個服務器就實現天氣和時間數據的更新。實現方法參考下面的網址,寫比較詳細。
心知天氣:docs點seniverse點com/api/weather/now.html、服務器IP116.62.81.138(域名api.seniverse.com)、默認端口80
Nowapi:www點nowapi點com/api/life.time、服務器IP103.205.4.43(域名api.k780.com)、默認端口80
解析數據用的是比較簡單的方法,因為需要解析的數據量不大,所以并沒有移植cjson,直接用strtok函數硬解。
OLED顯示,OLED顯示用的是I2C接口,然后給的例程只有常用的標點符號和26個英文字母的字庫,如果需要漢字還需要自己添加字庫,一般是用到什么漢字就添加什么漢字的字庫,然后用例程里面給的功能函數去實現顯示。
顯示屏資料:http://pan.baidu.com/s/1dFri9Vz
下圖是用到的所有.c文件(除庫函數之外)
3333333333333.PNG (4.68 KB, 下載次數: 89)
下載附件
2019-5-19 10:03 上傳
bsp_usart1.c是用來串口調試使用,可以打印在電腦串口調試助手上顯示;bsp_SysTick.c是用來生成精準的延時函數,用于I2C通訊等對時序敏感的接口;bsp_esp8266.c里面是對WiFi模塊的一些初始化配置和WiFi的功能函數;Common.c里面是一些輔助函數;test.c里面是實現WiFi配網應用和API接口調用及解析;oled.c里面顯示屏的初始化配置和顯示功能函數;bsp_pcf8563.c里面是時鐘芯片的初始化配置和讀寫時間功能函數;bsp_key.c里面是按鍵的初始化配置、按鍵掃描功能函數和靜態內容顯示函數;bsp_TiMbase.c里面是定時器函數,這里為什么用到定時器,因為一般天氣和時間數據刷新的頻率不會太快,這里設定的是5分鐘更新一次,那么這里就需要用到定時器。
注意:api點k780點com/?app=life.time&appkey=41298&sign=eb689df06015c995b73ae1f60c133a77&format=json ,里面的appkey=41298和sign=eb689df06015c995b73ae1f60c133a77,最好更換成自己的appkey和sign(網址上注冊賬號) "GET api點seniverse點com/v3/weather/now.json?key=SO0c3M39I7uTr9XjF&location=guangzhou&language=zh-Hans&unit=c\n",里面的key=SO0c3M39I7uTr9XjF和location=guangzhou,最好換成自己的Key和城市(網址上注冊賬號)
單片機源程序如下:
- #include "stm32f10x.h"
- #include "bsp_usart1.h"
- #include "bsp_SysTick.h"
- #include "bsp_esp8266.h"
- #include "test.h"
- #include "oled.h"
- #include "bsp_pcf8563.h"
- #include "bsp_key.h"
- #include "bsp_TiMbase.h"
- /**
- * @brief 主函數
- * @param 無
- * @retval 無
- */
- int main ( void )
- {
- SysTick_Init(); //配置 SysTick 為 1ms 中斷一次
- Delay_us(100000); //延時100ms等待電壓穩定
- /* 初始化 */
-
- USARTx_Config(); //初始化串口1
- ESP8266_Init(); //初始化WiFi模塊使用的接口和外設
- Pcf8563_Gpio_Init(); //時鐘芯片初始化
-
- Pcf8563_SetTime(); //設置初始時間
-
- Key_GPIO_Config(); //按鍵初始化
- OLED_Init(); //初始化OLED
- OLED_Clear(); //清屏
-
- BASIC_TIM_Init();
- WIFI_Config_Show();
-
- printf ( "\r\nWecome!\r\n" ); //打印測試例程提示信息
- ESP8266_StaTcpClient_UnvarnishTest(); //建立TCP/IP連接
-
- while ( 1 );
-
-
- }
- /*********************************************END OF FILE**********************/
復制代碼
0.png (11.32 KB, 下載次數: 103)
下載附件
2019-5-19 19:00 上傳
全部資料51hei下載地址:
硬件-基于WiFi的網絡授時時鐘設計V1.0.7z
(10.66 MB, 下載次數: 292)
2019-5-19 10:03 上傳
點擊文件名下載附件
完整硬件圖紙 下載積分: 黑幣 -5
軟件-基于WiFi的網絡授時時鐘設計V1.0.7z
(217.07 KB, 下載次數: 300)
2019-5-19 10:03 上傳
點擊文件名下載附件
完整源代碼 下載積分: 黑幣 -5
|