摘要:在搜索了一些資料后我把我的工作分成了兩個部分第一個部分就是時間的獲取第二個部分是燈光的控制。模塊聯網的方式是通過其與分別與串口的端和端相連通過串口通信發送指令來控制實現聯網。通過了解我發現可以通過芯片內部的時鐘來實現時間的自走功能。
話不多說,先來看看最后實現的效果(從左到右分別為時、分、秒,當時設計的時候忘了設計中間的冒號了
-_-):
畫了PCB,請朋友幫忙畫了solidworks打印出來框架,然后買螺絲進行拼裝。
某天逛某寶的時候突然發現了擬輝光鐘,當時就覺得挺好看的,但一看價格就直接勸退了(這里放了兩張價格)
于是我產生了自己動手做的想法。現在網上搜了一下擬輝光鐘的工作原理:
擬輝光鐘是利用光線在亞克力板上的劃痕處產生光線折射,使得劃痕處的光線較亮,配置以隨時間而變的燈光,達到類似于輝光鐘的效果。
在搜索了一些資料后,我把我的工作分成了兩個部分,第一個部分就是時間的獲取,第二個部分是燈光的控制。下面主要就這兩個大的模塊介紹下具體怎么實現的。
我之前的項目中一直在用STM32,比較熟悉,所以這次依然使用了STM32作為主控板。獲取時間的大體思路是利用ESP8266WIFI模塊能夠連網的功能,在上電后能夠通過MCU控制ESP8266連接到網絡并發送相應的API請求,獲得當前時間,之后把當前時間賦值到RTC時鐘,實現自走的功能。
首先先簡要介紹一下ESP8266模塊,在安可信官網上有此模塊的詳細介紹,這里放一個鏈接:
安可信,在它用戶文檔里對該模塊的介紹是這樣的:
ESP8266是一款超低功耗的UART-WiFi 透傳模塊,擁有業內極富競爭力的封裝尺寸和超低能耗技術,專為移動設備和物聯網應用設計,可將用戶的物理設備連接到Wi-Fi 無線網絡上,進行互聯網或局域網通信,實現聯網功能。
此模塊擁有獨立控制能力,可以作為主控芯片使用,也可以作為其他控制器的聯網芯片,使主控制器擁有聯網功能。
模塊聯網的方式是通過其RXD與TXD分別與串口的TX端和RX端相連,通過串口通信發送AT指令來控制ESP8266實現聯網。有關模塊的STA、AP、STA+AP模式還有AT指令集可以參考以下鏈接:
ESP8266 AT指令集:https://blog.csdn.net/qq_45104817/article/details/105834987
模塊教程:https://blog.csdn.net/mbs520/article/details/109572070
在本項目通過使用STM32上的USART6給8266發送以下的AT指令實現了聯網功能:
1.設置工作模式:
AT+CWMODE=1 //設置模式,1為STA模式(從機)
2.重啟: 重啟可以保證模式能夠轉換成功
AT+RST
3.聯網:(在這里遇到了一個小問題,就是我在學校連校園網的話需要通過用戶認證,但單純的用這個指令不能聯網成功。網上說可以通過串口發送響應的完成認證的請求頭,但后來我通過筆記本連網后再開熱點解決了):
AT+CWJAP="name","password" //name為你想連的WIFI名稱,password為你的WIFI密碼
4.設置連接方式 只有將連接方式設置為單路連接才能啟用TCP/IP
AT+CIPMUX=0
TCP/IP是一種網絡通信協議,可以理解為設備連接到目標網絡后,通過這個特有的雙方都理解的語言才可以實現數據通信,詳細的介紹可以參考:https://zhuanlan.zhihu.com/p/33889997
5.連接到目標站點 第4步設置了單路連接,現在就可以啟用TCP連接到API站點獲取數據了!
AT+CIPSTART="TCP","quan.suning.com",80 //協議形式;站點IP或網址;端口號(指定一個沒有被占用的即可)
這里quan.suning.com即為我們要用的API,連接到該網絡后,可以通過發送標準形式的請求頭來獲取當前時間。
6.開啟透傳 開啟透傳模式,為傳送報頭做準備
AT+CIPMODE=1
7.發送報頭,接收數據
res=esp8266_send_data("GET http://quan.suning.com/getSysTime.do HTTP/1.1/r/nHost: quan.suning.com/r/n/r/n",50);
返回來的數據如下:
receive:HTTP/1.1 200 OKDate: Sat, 16 Oct 2021 10:31:07 GMTContent-Type: text/html;charset=UTF-8Content-Length: 62Connection: keep-aliveServer: styxSet-Cookie: tradeLdc=NJGX_YG;Expires=Sat, 16-Oct-21 22:31:07 GMTStrict-Transport-Security: max-age=300Cache-Control: no-cache,no-store,max-age=0,s-maxage=0Access-Control-Allow-Credentials: trueX-Ser: BC98_dx-lt-yd-jiangsu-zhenjiang-3-cache-16, BC204_lt-shanxi-taiyuan-6-cache-4X-Cache: MISS from BC204_lt-shanxi-taiyuan-6-cache-4(baishan){"sysTime2":"2021-10-16 18:31:07","sysTime1":"20211016183107"}
我們的主要目的是獲取當前時間,所以返回來的數據中大部分是沒有用的,通過觀察發現我們只需要提取出“sysTime2”后面跟的時間即可,所以我們需要一些算法來把時間提取出來。我的思路就是先通過字符串查找函數strstr找到"sysTime2"所在位置的指針,再根據時、分、秒相對于指針的偏移量依次把數據提取出來,這里我把我的代碼放在下面,當然大家也可以設置更加高效的算法:
#define HOURS_ADD_DRES 22 //小時相對于data_pt指針的偏移量是22char *data_pt=NULL; while(!data_pt){ res=esp8266_send_data("GET http://quan.suning.com/getSysTime.do HTTP/1.1/r/nHost: quan.suning.com/r/n/r/n",50); data_pt = strstr((const char *) res,(const char *)"sysTime2");//在返回數據中找sysTime2 } printf("GET TIME SUCCESS!/r/n");//如果找到了,data_pt非空,退出循環,獲取時間成功 int k=0; char time[10]; char *hour_string;//存放時間的字符串 int hour,second,minute=0; hour_string = data_pt + HOURS_ADD_DRES; //hour_string指針指向時-分-秒時間的小時位第一位,精準鎖定 for(i=0;i<=7;i++)//把各位的數據提取出來 { time[k]=*hour_string; hour_string++;k++; } time[8]='/0'; hour=(time[0]-48)*10+(time[1]-48); minute=(time[3]-48)*10+(time[4]-48); second=(time[6]-48)*10+(time[7]-48);//ASCII碼轉換成數字,方便后續 printf("time:%s",time);//把當前獲取到的時間打印到串口
可以看到串口輸出了正確的值,獲取時間成功了!
在這之前我們已經通過ESP8266聯網實現了當前時間的獲取,但如此這樣一直獲取時間顯然是不現實的,一方面每次發送請求有一定的失敗概率,如果獲取時間失敗那么時間的顯示就會不連續。另一方面網站面臨多次重復的請求會對你的IP地址進行屏蔽來防止惡意攻擊。此外如此頻繁的請求也會消耗太多的資源放在請求上,導致程序的效率不高。通過了解我發現可以通過芯片內部的RTC時鐘來實現時間的自走功能。
有關RTC時鐘的具體實現與詳解可以參考這篇:RCT詳解
通過配置RTC,將ESP8266模塊獲取的時間寫入RTC,之后可以利用RTC的秒中斷或者根據RTC的計數器變動來刷新當前時間值,在燈光上進行不同的顯示。
RTC_Set_Time(hour,minute,second,1);
此代碼實現了隨著時間的變化刷新顯示,同時,也可以采用秒中斷的方法(后者更加精確)
RTC_TimeTypeDef RTC_TimeTypeInitStructure; RTC_GetTime(RTC_Format_BIN,&RTC_TimeTypeInitStructure); flags0=RTC_TimeTypeInitStructure.RTC_Seconds%10; flags1=RTC_TimeTypeInitStructure.RTC_Seconds/10; flagm0=RTC_TimeTypeInitStructure.RTC_Minutes%10; flagm1=RTC_TimeTypeInitStructure.RTC_Minutes/10; flagh0=RTC_TimeTypeInitStructure.RTC_Hours%10; flagh1=RTC_TimeTypeInitStructure.RTC_Hours/10; if(flags0!=befores0){ ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Seconds%10,5,1); befores0=flags0;} if(flags1!=befores1){ ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Seconds/10,4,0); befores1=flags1;} if(flagm0!=beforem0){ ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Minutes%10,3,1); beforem0=flagm0;} if(flagm1!=beforem1){ ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Minutes/10,2,0); beforem1=flagm1;} if(flagh0!=beforeh0){ ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Hours%10,1,1); beforeh0=flagh0;} if(flagh1!=beforeh1){ ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Hours/10,0,0); beforeh1=flagh1;}
在下一篇文章中會具體介紹燈光控制模塊!謝謝大家的支持!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/125319.html
摘要:帶中文字庫的是一種具有位位并行線或線串行多種接口方式,內部含有國標一級二級簡體中文字庫的點陣圖形液晶顯示模塊其顯示分辨率為。貼片按鍵模塊支持標準的協議,完整的協議棧。以最低成本提供最大實用性,為功能嵌入其他系統提供無限可能。 項目簡介 開發環境: Keil5.14,CubeMX6.0.1,主...
摘要:基于的與通信連接,實現溫濕度數據互傳,控制第一步,在實現將傳感器數據采集之后,并且完成配網步驟,可以正常通過模塊正常將數據發送到云平臺之后進行以下閱讀,上述內容可以跳轉到以下鏈接進行查看具體操作。 ...
摘要:開發方式是樂鑫為開發者提供的物聯應開發平臺,包括基礎平臺以及上層應開發示例,如智能燈智能開關等。指令開發方式作為芯片,指令開發也是必不可少的。開發方式即,意為運行在單片機上的。 ...
摘要:添加設備名和鑒權信息。記錄如下數據二引腳連接和接電源接地和連接至配置的串口三代碼編寫串口配置單片機需配置兩個串口,串口打印至串口助手,顯示連接狀態。串口用來發送信息至串口配置代碼如下系列配置和系列配置不同點在于口上拉和推挽配置略有不同。 ...
摘要:使用實現連網實現巴法云物聯網使用硬件程序思路基于正點原子的測試程序在巴法云物聯網創建的主題初始化代碼比較簡陋主函數代碼如果想用串口助手調試,接線方法如下使用硬件我這里使用的是正點原子家的開發板精英版和模塊。 ...
閱讀 730·2023-04-25 19:43
閱讀 3974·2021-11-30 14:52
閱讀 3801·2021-11-30 14:52
閱讀 3865·2021-11-29 11:00
閱讀 3796·2021-11-29 11:00
閱讀 3894·2021-11-29 11:00
閱讀 3571·2021-11-29 11:00
閱讀 6154·2021-11-29 11:00