找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10478|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

基于WiFi的網(wǎng)絡(luò)授時時鐘(帶實時天氣更新)STM32程序設(shè)計

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:451980 發(fā)表于 2019-5-19 10:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本方案采用的是MCU+AT指令的形式開發(fā),MCU是大家比較熟悉的意法半導(dǎo)體公司STM32F103C8T6,WiFi模塊使用的是安信可ESP-12F,本方案是一個Demo設(shè)計,比較簡單,僅實現(xiàn)了功能,算是一個拋磚引玉吧!

先上視頻演示: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最小系統(tǒng)+OLED顯示屏+穩(wěn)壓電路+按鍵電路組成,這里采用時鐘電路是希望模塊在斷網(wǎng)后還能獲取一個比較精準(zhǔn)的時間,并且電路設(shè)計上增加了儲能電容可以在斷電一個月后保持時間數(shù)據(jù)不丟失,當(dāng)然這里也可以用STM32里面的RTC時鐘;OLED顯示屏采用的是裸屏設(shè)計,使整體電路板一體化效果好些;其他電路都是參考開發(fā)板or硬件手冊上設(shè)計的;硬件設(shè)計軟件采用的是 Altium Designer (13.0),原理圖概略圖如下圖所示:




實物圖如下圖所示:(電路板是找廠家打樣的,元器件是純?nèi)斯な趾福?br />



軟件部分,由底層驅(qū)動+WiFi聯(lián)網(wǎng)+調(diào)用API接口并解析數(shù)據(jù)+OLED顯示組成;首先分析一波,這里面用到了MCU的USART、I2C*2、GPIO*2引腳資源,然后對應(yīng)去找相關(guān)類似的例程,既然已經(jīng)有輪子了,為何還要花時間去造輪子,當(dāng)然是直接改例程來的舒服。這里開發(fā)方式采用的是庫函數(shù)開發(fā),用的是STM32的標(biāo)準(zhǔn)庫,對應(yīng)找到了OLED顯示屏的驅(qū)動資料、PCF8563的驅(qū)動資料、WiFi模組的驅(qū)動資料、按鍵輸入的驅(qū)動資料;將它們整合到一個工程里面,然后更改里面的引腳配置等,就完成了整個設(shè)計的底層驅(qū)動。

WiFi聯(lián)網(wǎng),這里WiFi是設(shè)置成了STA模式(STA模式是啥,可自行問度娘),然后連接手機開的熱點(注意手機必須要能連接上公網(wǎng),即我們常用的互聯(lián)網(wǎng))。具體如何設(shè)置可以參考WiFi模塊的AT指令集,AT指令集在上面WiFi模塊資料里面有。手機開的WiFi熱點的賬號密碼需要事先知道,并寫入在程序里面,后續(xù)如果需要更改熱點的賬號密碼,就需要更改程序。

天氣和時間更新,即調(diào)用API接口并解析數(shù)據(jù),這里用到了兩個API接口,第一個是心知天氣的天氣實況數(shù)據(jù)獲取,因為是免費版所以只能獲取到天氣現(xiàn)象和氣溫兩項數(shù)據(jù);第二個是Nowapi的北京時間數(shù)據(jù)獲取。因為用到的兩個API接口是隸屬于兩個不同的服務(wù)器,所以程序上需要進行切換,連完這個服務(wù)器后需要斷開連另一個服務(wù)器,比較麻煩。后面我發(fā)現(xiàn)其實Nowapi里面就有天氣數(shù)據(jù)可以獲取,完全可以通過只連接這個服務(wù)器就實現(xiàn)天氣和時間數(shù)據(jù)的更新。實現(xiàn)方法參考下面的網(wǎng)址,寫比較詳細。

心知天氣:docs點seniverse點com/api/weather/now.html、服務(wù)器IP116.62.81.138(域名api.seniverse.com)、默認端口80

Nowapi:www點nowapi點com/api/life.time、服務(wù)器IP103.205.4.43(域名api.k780.com)、默認端口80

解析數(shù)據(jù)用的是比較簡單的方法,因為需要解析的數(shù)據(jù)量不大,所以并沒有移植cjson,直接用strtok函數(shù)硬解。

OLED顯示,OLED顯示用的是I2C接口,然后給的例程只有常用的標(biāo)點符號和26個英文字母的字庫,如果需要漢字還需要自己添加字庫,一般是用到什么漢字就添加什么漢字的字庫,然后用例程里面給的功能函數(shù)去實現(xiàn)顯示。

顯示屏資料:http://pan.baidu.com/s/1dFri9Vz

下圖是用到的所有.c文件(除庫函數(shù)之外)




bsp_usart1.c是用來串口調(diào)試使用,可以打印在電腦串口調(diào)試助手上顯示;bsp_SysTick.c是用來生成精準(zhǔn)的延時函數(shù),用于I2C通訊等對時序敏感的接口;bsp_esp8266.c里面是對WiFi模塊的一些初始化配置和WiFi的功能函數(shù);Common.c里面是一些輔助函數(shù);test.c里面是實現(xiàn)WiFi配網(wǎng)應(yīng)用和API接口調(diào)用及解析;oled.c里面顯示屏的初始化配置和顯示功能函數(shù);bsp_pcf8563.c里面是時鐘芯片的初始化配置和讀寫時間功能函數(shù);bsp_key.c里面是按鍵的初始化配置、按鍵掃描功能函數(shù)和靜態(tài)內(nèi)容顯示函數(shù);bsp_TiMbase.c里面是定時器函數(shù),這里為什么用到定時器,因為一般天氣和時間數(shù)據(jù)刷新的頻率不會太快,這里設(shè)定的是5分鐘更新一次,那么這里就需要用到定時器。

注意:api點k780點com/?app=life.time&appkey=41298&sign=eb689df06015c995b73ae1f60c133a77&format=json ,里面的appkey=41298和sign=eb689df06015c995b73ae1f60c133a77,最好更換成自己的appkey和sign(網(wǎng)址上注冊賬號)  "GET api點seniverse點com/v3/weather/now.json?key=SO0c3M39I7uTr9XjF&location=guangzhou&language=zh-Hans&unit=c\n",里面的key=SO0c3M39I7uTr9XjF和location=guangzhou,最好換成自己的Key和城市(網(wǎng)址上注冊賬號)

單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include "bsp_usart1.h"
  3. #include "bsp_SysTick.h"
  4. #include "bsp_esp8266.h"
  5. #include "test.h"
  6. #include "oled.h"
  7. #include "bsp_pcf8563.h"
  8. #include "bsp_key.h"
  9. #include "bsp_TiMbase.h"

  10. /**
  11.   * @brief  主函數(shù)
  12.   * @param  無
  13.   * @retval 無
  14.   */
  15. int main ( void )
  16. {

  17.         SysTick_Init();                                                                           //配置 SysTick 為 1ms 中斷一次
  18.         Delay_us(100000);                         //延時100ms等待電壓穩(wěn)定
  19.         /* 初始化 */
  20.        
  21.   USARTx_Config();                                                                          //初始化串口1
  22.         ESP8266_Init();                                                                            //初始化WiFi模塊使用的接口和外設(shè)
  23.         Pcf8563_Gpio_Init();                                                                             //時鐘芯片初始化
  24.        
  25.         Pcf8563_SetTime();                        //設(shè)置初始時間
  26.        
  27.         Key_GPIO_Config();                                                                        //按鍵初始化
  28.         OLED_Init();                                                                                                                        //初始化OLED  
  29.         OLED_Clear();                                                                                     //清屏

  30.        
  31.         BASIC_TIM_Init();

  32.         WIFI_Config_Show();
  33.        
  34.         printf ( "\r\nWecome!\r\n" );                    //打印測試?yán)烫崾拘畔?br />

  35.   ESP8266_StaTcpClient_UnvarnishTest();     //建立TCP/IP連接
  36.        
  37.   while ( 1 );
  38.        
  39.        
  40. }


  41. /*********************************************END OF FILE**********************/
復(fù)制代碼




全部資料51hei下載地址:
硬件-基于WiFi的網(wǎng)絡(luò)授時時鐘設(shè)計V1.0.7z (10.66 MB, 下載次數(shù): 292)
軟件-基于WiFi的網(wǎng)絡(luò)授時時鐘設(shè)計V1.0.7z (217.07 KB, 下載次數(shù): 300)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏27 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:601774 發(fā)表于 2019-9-11 18:25 | 只看該作者
很棒啊,最近也想弄一個時鐘,到實際弄的時候在請教下,收藏了
回復(fù)

使用道具 舉報

板凳
ID:601774 發(fā)表于 2019-9-11 18:27 | 只看該作者
RTC那個電池是用法拉電容嗎
回復(fù)

使用道具 舉報

地板
ID:601774 發(fā)表于 2019-9-11 18:33 | 只看該作者
WIFI能隨意獲取其他網(wǎng)頁的時間嗎,假如用在不是北京時間的地方能自動獲取時間嗎,比如拿去歐洲了,不是第八時區(qū)了,是否能自動校時
回復(fù)

使用道具 舉報

5#
ID:99570 發(fā)表于 2020-1-16 21:29 | 只看該作者
好東西,學(xué)習(xí)一下。買模塊弄一個試試。
回復(fù)

使用道具 舉報

6#
ID:230666 發(fā)表于 2020-1-20 13:34 | 只看該作者
下載來學(xué)習(xí)一下 OLED 屏幕驅(qū)動 我的老是亂碼
回復(fù)

使用道具 舉報

7#
ID:620291 發(fā)表于 2020-3-5 16:40 | 只看該作者
好東西,學(xué)習(xí)一下。買模塊弄一個試試
回復(fù)

使用道具 舉報

8#
ID:119642 發(fā)表于 2020-4-7 22:14 | 只看該作者
挺喜歡這個的。非常不錯
回復(fù)

使用道具 舉報

9#
ID:388929 發(fā)表于 2020-4-8 23:28 | 只看該作者
WIFI模塊好,看到你這成品,我也想搞一個來學(xué)一下,謝謝你的分享,謝謝,我先打個MARK,買回來再來看看
回復(fù)

使用道具 舉報

10#
ID:451980 發(fā)表于 2020-7-16 14:34 | 只看該作者
ygsasd 發(fā)表于 2019-9-11 18:27
RTC那個電池是用法拉電容嗎

對的, 實際就是大電容,它能儲存電能,可以提供保存1-2月時間數(shù)據(jù)不丟失的電能
回復(fù)

使用道具 舉報

11#
ID:451980 發(fā)表于 2020-7-16 14:35 | 只看該作者
ygsasd 發(fā)表于 2019-9-11 18:33
WIFI能隨意獲取其他網(wǎng)頁的時間嗎,假如用在不是北京時間的地方能自動獲取時間嗎,比如拿去歐洲了,不是第八 ...

這個時間是從服務(wù)器API接口拿到的,只要API接口支持國外時間輸出,那么就可以獲取到,可能需要改動下代碼
回復(fù)

使用道具 舉報

12#
ID:451980 發(fā)表于 2020-7-16 14:36 | 只看該作者
zrm0806 發(fā)表于 2020-1-20 13:34
下載來學(xué)習(xí)一下 OLED 屏幕驅(qū)動 我的老是亂碼

OLED屏幕可以先用例程驅(qū)動試試,不行的話看看是不是I2C沒加上拉電阻,或者是沒有焊接好
回復(fù)

使用道具 舉報

13#
ID:300127 發(fā)表于 2020-10-19 08:03 | 只看該作者
下載來學(xué)習(xí)一下,謝謝你的分享
回復(fù)

使用道具 舉報

14#
ID:930143 發(fā)表于 2021-5-31 18:05 | 只看該作者
除了C語言和python外還需要什么編程語言嗎?需要mqtt協(xié)議什么的嗎?
回復(fù)

使用道具 舉報

15#
ID:671688 發(fā)表于 2023-3-28 18:33 | 只看該作者
好東西,正好需要做網(wǎng)絡(luò)授時
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表