第1步:
這個想法是在兩個屏幕上顯示各種信息,具體取決于方框。表殼呈平行六面體形狀,《鋪路石,帶有一種皮帶,可作為支撐使其靜止。
加速度計檢測運動和方向并觸發顯示。
為了節省能源,我選擇了電子紙屏幕(參見下面的參考資料),即使它們不再供電,也能保持顯示。同樣對于ESP32,我選擇 Lolin32 模塊(以節儉而聞名),我必須學習如何管理深度睡眠,以及喚醒中斷由加速度計生成。
屏幕通過SPI連接,在找到正確的引腳將它們連接到ESP32之前我搜索了一下,知道我還需要一個用于加速度計的I2C,一個讀取DHT22的引腳和另外兩個用于電池的引腳電壓測量。 ESP32幾乎完全充電了!知道某些引腳只讀(我用過DHT傳感器),其他引腳不能與Wifi一起使用,它是一個找到正確的配置有點復雜。
盒子可以朝向4個方向,加上扁平。總而言之,只需2個屏幕即可顯示4 * 2 + 2 = 10種可能類型的信息。所以它允許你展示很多東西:
日期和當天的圣人
當前時間
今天的天氣預報
未來幾小時的天氣預報
未來幾天的天氣預報
電池充電水平
因為我還有空間,來自專業網站的隨機引用。
第2步:你需要什么?
ESP32:Lolin32模塊(功率極低,配有電池連接器,可以通過USB加電池充電)
2 epaper顯示:4.2英寸和2.9英寸。我選擇Good Display商店的模型。
DHT22傳感器
LiPo電池
用于電池電壓測量:2個10k電阻,1個100k電阻,1個100nF電容,1個MOSFET晶體管
焊錫和烙鐵,印刷電路板
使用3D打印機進行外殼
附圖顯示了PCB上所有元件的位置:我必須節省空間以適應外殼,不應該太大。
In為了獲取天氣數據,您還需要在天氣API上注冊并將您的密鑰放在‘Variables.h’文件中的正確位置(見下文)。
天氣網站:
apixu
accuweather
第3步:這個項目讓我思考和學習了很多。..。..
這個系統應該是低功耗的,所以你不需要每晚給電池充電。..為了節省能源,我選擇了電子紙即使它們不再通電也能保持顯示的屏幕。同樣對于ESP32,我選擇了Lolin32模塊(以其節儉而聞名),我必須學習如何管理深度睡眠,以及中斷喚醒呼叫通過加速度計。
盒子可以朝向4個方向,更平坦。總而言之,要顯示4 * 2 + 2 = 10種可能的信息類型。所以它允許你做很多事情:日期,當天的圣人,時間,今天的天氣預報,未來幾小時或幾天的天氣預報,電池充電水平以及專業網站的隨機報價。
在互聯網上尋找的東西很多,如你所知: WiFi是節能的敵人。..。..
所以我們必須管理連接,以便顯示最新信息,但不需要花太多時間連接。另一個相當復雜的問題:保持相當準確的時間。我不需要RTC,因為我可以在互聯網上找到時間,但ESP32的內部時鐘漂移了很多,特別是在睡眠期間。我必須找到一種方法來保持足夠準確,同時等待通過互聯網重置時鐘。我每小時在互聯網上重新同步它。
因此,在自治(互聯網連接的頻率)與所顯示信息的準確性之間存在權衡。
另一個需要解決的問題是內存。當ESP32處于深度睡眠狀態時,內存將丟失,除了所謂的RTC RAM。該內存寬4MB,其中只有2個可用于該程序。在這個內存中,我必須存儲在睡眠階段之后必須保持從一次執行到下一次執行的各種程序變量:天氣預報,時間和日期,圖標文件名,引號等。我必須學會處理它。
說到圖標,它們存儲在ESP32文件系統的 SPIFFS 中。關閉免費的Wunderground天氣API后,我不得不尋找其他免費天氣數據提供商。我選擇了兩個:一個用于當天的天氣,有12個小時的預測,另一個用于多天的預測。圖標不一樣,所以它給我帶來了兩個新問題:
選擇圖標集
將這些圖標與2個網站的預測代碼相匹配
此對應關系也存儲在RTC RAM中,因此不必每次都重新加載。
圖標的最后一個問題。 無法將所有內容存儲在SPIFFS中。這個空間太小,不適合我的所有文件。有必要進行圖像壓縮。我在 Python 中編寫了一個腳本,用于讀取我的圖標文件并將其壓縮為 RLE ,然后將壓縮文件存儲在SPIFFS中。在那里舉行。
但是電子紙顯示庫只采用BMP類型的文件,而不是壓縮圖像。所以我必須編寫一個額外的功能才能顯示這些壓縮文件中的圖標。
互聯網上讀取的數據通常是 json 格式:天氣數據,當天的圣人。我使用了(偉大的) arduinoJson 庫。但報價不是那樣的。我從一個專門的網站上拿走它們,所以我必須直接查看網頁的內容來閱讀它們。 我必須寫一個特定的代碼 t。每天午夜左右,程序進入該站點并讀取大約10個隨機引號,并將它們存儲在RTC RAM中。當外殼朝向大屏幕時,其中一個隨機顯示。
我告訴你顯示重音字符的問題(抱歉,但引號是法語)。..。
當小屏幕亮起時,《顯示strong》電池電壓,并使用圖紙更好地查看剩余電量。有必要制作一個電子組件來讀取電池電壓。由于測量不應該對電池放電,我使用了互聯網上的圖表,該圖表使用 MOSFET晶體管作為開關,以便僅在測量時消耗電流
為了能夠制作這個電路并將所有東西都安裝到盒子中,我想要盡可能小的,我必須制作一個PCB來連接系統的所有組件。 這是我的第一個PCB 。我很幸運,因為這一方面第一次運作良好。..
參見植入圖:“禁區”是保留用于連接USB線的區域。 Lolin32模塊允許您通過USB為電池充電:如果連接USB電纜,電池充電,模塊同時工作。
最后一點:字體。不同大小,不管是否大膽,都必須創建和存儲它們。一旦您在正確的目錄中安裝了字體文件,Adafruit GFX庫就可以很好地處理這個問題。為了創建文件,我使用了字體轉換器網站,非常方便!
請確保選擇:
預覽顯示:TFT 2.4“
圖書館版本:Adafruit GFX字體
所以總結:一個大項目,讓我學到了很多東西。
步驟4:使用電子紙顯示
這些屏幕的主要缺點在視頻中清晰可見:顯示的更新需要一到兩秒,并通過閃爍(兩個屏幕的正常和反轉版本的替代顯示)完成。這對于天氣信息是可以接受的,因為我不經常更新(每小時除了更改盒子的方向)。但不是時間。這就是為什么(并限制消費)我仍然使用HH:MM顯示(不是秒)。
所以我不得不尋找另一種更新顯示的方法。這些屏幕(其中一些)支持部分更新(應用于屏幕區域或整個屏幕。..。..)但對我來說不好,因為我的大屏幕(顯示時間)保持被替換像素的重影。例如,當從10:12到10:13時,‘2’在‘3’內部稍微可見,并且在‘4’,‘5’等之后變得更加明顯。我想要指出我的屏幕就是這種情況:我與電子紙顯示庫 GxEPD2 的作者討論了這一點,他告訴我他沒有用他自己的屏幕觀察這種現象。我們試圖改變參數而沒有成功狩獵幽靈。
所以我們必須找到另一個解決方案:我建議做一個部分雙重刷新,這解決了問題(至少這對我來說是令人滿意的)。時間過去沒有屏幕閃爍,沒有鬼魂。但是,轉換不是立即的:更改時間需要一秒多一點。
步驟5:實現
為了確保方向改變時內部沒有任何東西移動,不同的組件(顯示器,電子模塊,PCB,電池)被膠合用膠槍。為了在PCB下面布線,我將它安裝在用墊片制成的支腿上,電池也是如此。
很快我將安裝一個外部USB麥克風連接器,所以我不必打開機箱給電池充電。
也許我也有興趣通過OTA進行更新來完善它。..。..
第6步:代碼和文件
提供了三個存檔文件:
Weather station.zip:使用Arduino IDE上傳的Arduino代碼
Boite ecran.zip:案例的CAD和3D打印機文件
data.zip:要在ESP32的SPIFFS中上傳的文件。
如果你不知道如何將文件上傳到ESP32的SPIFFS,只需閱讀本教程,它提供了一個非常有用的插件以及如何在Arduino IDE中使用它。
深度睡眠編程與Arduino的標準編程完全不同。對于ESP32,這意味著ESP32喚醒并執行設置,然后進入睡眠狀態。所以,循環函數為空,永遠不會執行。
某些初始化階段必須在第一次執行時只運行一次(例如獲取時間,天氣數據,引號等),所以ESP32需要知道當前的喚醒是否是第一個:為此,解決方案是將變量存儲在 RTC RAM 中(即使在深度睡眠階段),每次喚醒時都會增加。如果它等于1,則它是第一次執行,ESP32運行初始化階段,否則跳過此階段。
要喚醒ESP32,有幾種可能性:
定時器喚醒:代碼計算睡眠前深度睡眠的持續時間。這用于更新時間(每1,2,3或5分鐘)或天氣數據(每3或4小時)和當天的圣人(每24小時)。
中斷喚醒:加速度計發送一個用于喚醒ESP32的信號。這用于檢測方向變化并更新顯示屏
觸摸傳感器喚醒:ESP32配備了幾個用作觸摸傳感器的引腳,但它們不能用于定時器喚醒,所以我沒有‘使用它。
在代碼的其他地方有其他編程技巧,以保持時間準確,同時節省能源(即每分鐘不連接NTP服務器) ),刪除Adafruit GFX庫不支持的重音,以避免在沒有必要時更新顯示,設置加速度計參數尤其是中斷喚醒,準確計算定時器喚醒時的睡眠時間 - 如果沒有連接到IDE,請避免使用串行控制臺(為了節省能源),在不需要時斷開wifi等等。..。..代碼中充滿了評論,有助于理解函數。
-
氣象站
+關注
關注
1文章
753瀏覽量
15692
發布評論請先 登錄
相關推薦
評論