如果光輸出可以直接在設備上進行交互控制,那就太好了。現(xiàn)在我們將構建并編程一個設備。
幾個星期前,當我去一家餐館的時候,這種臺燈的變體真的弄傷了我的手指。這東西是要通過觸摸來控制的,但要用一種神秘的方式。有足夠的理由進一步研究使用ESP32。當然,使用Micropython是成功的。這是該系列下一集的結果
帶有觸摸控制的臺燈
有了手機應用程序,你自然有很多選擇來控制臺燈。但是問題已經(jīng)從決定開始了——無線局域網(wǎng)通過路由器還是通過控制器自己的接入點。這必須在課程中考慮到,或者在開始時就已經(jīng)有了。
如果光輸出可以直接在設備上進行交互控制,那就太好了。現(xiàn)在我們將構建并編程一個設備。首選控制器是ESP32,因為它有觸摸板輸入。進一步考慮使用ESP8266或樹莓派Pico,然后產(chǎn)生了觸摸問題的進一步解決方案。我們將在下一集中討論這些問題。今天我們繼續(xù)討論ESP32。我將展示如何將數(shù)據(jù)永久存儲在NVS區(qū)域中,以及如何實現(xiàn)進程并行執(zhí)行。至少第一個功能只提供ESP32。
對于使用的控制器板ESP32 Dev Kit C V4,需要兩個面包板來開發(fā)電路,它們通過電流軌放在一起。這是為跳線獲得足夠自由接觸點的唯一方法。
圖1:ESP32的設置
作為觸摸板,我使用了電路板和波峰的剩余部分。小鋁孩子將服務于生產(chǎn)系統(tǒng)。
我使用RGB LED來顯示運行狀態(tài)。戒指上led的顏色可以單獨設置和下調(diào)。RGB LED顯示顏色。總共有五種情況:紅、綠、藍、白、中。
預電阻的尺寸是這樣的,一起發(fā)出白光。藍色的,尤其是綠色的LED比紅色的要亮得多。因此,電阻值的差異很大。如果你想要一個更輕的顯示,就取更小的歐姆值。
圖2中的電路圖顯示了所有部件是如何組合在一起的。
圖2:帶有ESP32和觸摸板的電路
作為能源供應,我選擇了18650型的鋰離子電池,加上一個帶有加載部分和5V輸出的電池所有者。我在USB A插座的連接旋轉上焊接了我的電路的供應線。這樣我就不用USB插頭了,仍然可以使用板上的機械開關。它將指向房屋朝向地面,以及在圖2中板子上端的加載插座。
因為燈里放面包板的空間太小了,我設計了一個電路板,上面可以容納幾個單獨的零件。您可以按照下載PDF文件的方式進行布局。
圖3:傳感器燈-布局
我在實驗設置中使用了RGB LED模塊。對于燈本身,我發(fā)現(xiàn)該系列的一個led更理想,因為它更容易組裝在蓋子上。LED只是用雙組分粘合劑粘在框架上。
圖4:帶有公共陰極的RGB LED
燈具部件
房屋框架和蓋子由木材制成。框架由15毫米的楓木板組成,45毫米× 150毫米。作為蓋子,我拿了一個5毫米厚的板,其中一個木制圓柱體粘在中間的黃銅管的中心。
圖5:燈具部件
圖6:粘接前的框架條
圖7:安裝在外殼框架和燈座在蓋子
圖8:傳感器按鍵和信號LED
燈頭坐落在一個230毫米長的黃銅管與6mm ?。
圖9:燈頭內(nèi)的LED環(huán)
Micropython -語言-模塊和程序
要安裝托尼,你會在這里找到一個詳細的說明(英文版)。還有一個關于ESP芯片上的Micropython固件(截至2022年6月18日)如何被燒毀的描述。
Micropython是一種解釋器語言。Arduino IDE與Arduino IDE的主要區(qū)別在于,你只需要在ESP32上閃爍Micropython固件一次,以便控制器理解Micropython指令。您可以使用Thonny,μpycraft或ESPTOOL.PY。對于安東尼,我在這里描述了這個過程。
一旦固件閃過,你就可以很容易地在對話框中與控制器對話,測試單個命令并立即看到答案,而無需事先編譯和傳輸整個程序。這正是Arduino IDE困擾我的地方。如果您可以檢查語法和硬件的簡單測試,以便在編寫程序之前通過命令行嘗試和改進函數(shù)和整個程序部分,則可以節(jié)省大量時間。出于這個目的,我總是喜歡創(chuàng)建小型測試程序。作為一種宏,它們總結了重復出現(xiàn)的命令。然后從這些程序片段開發(fā)整個應用程序。
自動啟動
如果程序要通過打開控制器自動啟動,請將程序文本復制到新創(chuàng)建的空白磁貼中。將該文件保存在WorkSpace中的Main.py中,并將其上傳到ESP芯片。該程序將在下次復位或開機時自動啟動。
測試程序
tony - ide中當前編輯器窗口中的程序通過F5按鈕手動啟動。這可以比鼠標點擊開始按鈕或通過菜單運行更快地完成。只有程序中使用的模塊必須在ESP32的flash中。
在兩者之間,Arduino id ?
如果您以后將控制器與Arduino IDE一起使用,只需以通常的方式刷新程序。然而,ESP32/ESP8266隨后忘記了它曾經(jīng)說過Micropython。相反,任何包含Arduino IDE或AT-Firmware或Lua或…可以很容易地提供micropython固件。這個過程總是像這里描述的那樣。
新像素環(huán)
類型WS2812新像素led包含三個單獨的led,釋放紅色,綠色或藍色光。它們由控制器尋址,控制器通過一種時鐘為800kHz的總線系統(tǒng)接收指令。
在I2C總線或SPI總線上,來自控制器(例如ESP32)的信號以相同的方式到達總線上的所有從機,每個人都能看到一切。它與WS2812模塊不同。每個構建塊都有一個數(shù)據(jù)輸入和數(shù)據(jù)輸出。通過連接I2C總線或SPI總線,幾個構建模塊可以級聯(lián),來自控制器的信號,例如ESP32,以相同的方式到達總線上的所有從機,每個人都能看到一切。它與WS2812模塊不同。每個構建塊都有一個數(shù)據(jù)輸入和數(shù)據(jù)輸出。幾個構建塊可以級聯(lián)在I2C總線或SPI總線上,來自控制器的信號,例如ESP32,以相同的方式到達總線上的所有從機,每個人都看到一切。它與WS2812模塊不同。每個構建塊都有一個數(shù)據(jù)輸入和數(shù)據(jù)輸出。幾個構建塊可以為單個顏色級聯(lián)。我們以一個列表的形式給出顏色代碼,每個WS2812有三個字節(jié)。
讓我們從一個嘗試開始。我們使用圖2的結構。首先導入Class Pin和Neopixel。我創(chuàng)建了一個GPIO引腳對象作為結果,從而實例化了一個具有八個組件的新像素對象。
neopixel實例neo包含一個Bytearar和write()方法,通過該方法Bytearar的內(nèi)容被傳輸?shù)絥eopixel環(huán)。
使用neoI處理數(shù)組的前三個元素,并傳遞紅色,綠色和藍色,0xe0, 0x07和0x3c的值。在內(nèi)部,這使得私有函數(shù)setitem()。這些值以改變后的順序輸入緩沖區(qū)。正如我們將看到的曲線,這是我在邏輯分析儀的幫助下記錄的。這些值是在緩沖區(qū)中發(fā)送的。一個0對應于一個近似的窄脈沖。500NS寬度后面跟著a)。這些值以改變后的順序輸入緩沖區(qū)。正如我們將看到的曲線,這是我在邏輯分析儀的幫助下記錄的。這些值是在緩沖區(qū)中發(fā)送的。一個0對應于一個近似的窄脈沖。500NS寬度后面跟著a)。這些值以改變后的順序輸入緩沖區(qū)。正如我們將看到的曲線,這是我在邏輯分析儀的幫助下記錄的。這些值是在緩沖區(qū)中發(fā)送的。一個0對應于一個近似的窄脈沖。500NS的寬度按交換順序發(fā)送。這與數(shù)據(jù)表中的信息相對應,也可以通過以下方式進行驗證。
圖10:RGB = 0xe0, 0x07, 0x3c, 0xF0, 0xF0, 0xF0的脈沖序列
在第一個WS2812B的輸出中,丟失了三個字節(jié)0xe0、0x07和0x3c,這已經(jīng)吞噬了這個構建塊。相反,代碼0xF0, 0xF0, 0xF0出現(xiàn)時間延遲,即第二個組件的代碼。邏輯分析儀通道1的輸入連接到第一個LED入口的測量,通道2連接到它的輸出。
現(xiàn)在我們知道WS2812B上的袋鼠是如何運行的,并且可以轉向燈的程序。
這個項目
我們想用三個傳感器板來控制新led。通過GPIO33的觸摸板進行顏色選擇。有五個通道:開/關、紅、綠、藍和明/暗。強度增加到GPIO32,降低到GPIO27。這三個活動的操作在后臺以三個函數(shù)并行運行。這是通過asyncio模塊實現(xiàn)的。
起初,我試圖做模塊為_thread使用。這在兩個過程中工作得很好,但拒絕為第三方服務。我找不出原因是什么。所以我們使用asyncio。
我們先從進口業(yè)務說起。該模塊支持我們使用觸摸板的方法。我們需要LED輸出的引腳。在Neopixel上我們管理LED環(huán)的WS2812B。別名NP允許我們使用更短的拼寫。這些方法用于模塊時間的小小睡sleep和Sleep_ms。在C-Python中,我們也錯過了這個模塊的別名。類NVS只對ESP32可用,ESP32可以從我們導入類的地方看到。NVS是非易失性存儲的縮寫。這允許我們在系統(tǒng)中永久存儲數(shù)據(jù)。我們用它來取下我們最喜歡的顏色組合,然后在冷啟動時再次自動加載。(下載:timeout.py touch.py touchlamp .py)
NVS區(qū)域被劃分為名稱空間(name spaces),其中有符號32位數(shù)字和所謂的二進制blob,所以字節(jié)對象所以字節(jié)字符串。我們的分區(qū)名為config。
這里我們設置觸摸板對象。第一個參數(shù)是GPIO引腳號。因此GPIO33代表Touch8, GPIO32代表Touch9, GPIO27代表Touch7。第二個參數(shù)是觸摸板被歸類為觸摸的限制。當觸摸時,讀取值和方法掉落,觸摸()傳遞1,否則傳遞0。
為了設置限制值,我們直接要求TP對象的相應收據(jù),而不需要觸摸。
然后是觸摸。
我們將LED環(huán)的信號線連接到GPIO13上。戒指有8個led,同樣你也可以使用一個有12個led的戒指。當然,它也會更快地耗盡電池。使用8系列環(huán),電流消耗在40mA到250ma之間。當使用2200毫安時,根據(jù)亮度設置的不同,負載足夠使用大約8小時。
我已經(jīng)列出了上面5個通道的含義。顏色的顏色作為代碼列表“All LEDs out”=[0.0.0]。
接下來是NVS區(qū)域中保存和讀取顏色代碼的例程定義。顏色名稱用作鍵,值來自列表元素。重要:只有使用commit()命令才能傳輸?shù)絻?nèi)存。
閱讀更容易。我們以列表的形式返回顏色值。如果省略方括號,將得到一個返回對象Tupel。我們不需要這樣做,因為我們想要改變程序中的元素值,而這在tupel中是不可能的。
在開始時,名稱空間config仍然為空。因此,讀訪問拋出一個Try Except攔截的異常。我們不讀取顏色代碼,而是在內(nèi)存中編寫上面定義的代碼。在下一個開始,鍵紅,綠和藍存在。
我們繼續(xù)定義其他變量和對象。如果我們在操作過程中切換led變暗,則實現(xiàn)是當前顏色代碼的短暫中間存儲器。那我們就帶走真的。
然后我們定義RGB LED的輸出。我們把物體放在tupel led中。因為對象引用沒有改變,所以可以安全地使用tupel。對于形狀,也可以采用tupel。這些元件依次是燃料,并決定如何將電纜切換到信號LED。channel中是四個通道的名稱,這是我們在Replica中輸出所需要的。
函數(shù)lum()用顏色代碼填充新像素緩沖區(qū),并通過GPIO13輸出將緩沖區(qū)內(nèi)容發(fā)送到環(huán)。
現(xiàn)在開始使用asyncio模塊。因此,我們定義了三個用于觸摸控制的函數(shù)。使用TP1時,如果我們切換通道,將當前顏色保存為Nvs。config并將戒指調(diào)暗。我們用觸摸觸控板的周期來解碼每種情況下應該發(fā)生的情況。
在異步系統(tǒng)中表示進程的函數(shù)必須以asyncdef方式啟動。該過程在函數(shù)離開后立即結束。我們不希望那樣,所以這個過程就像一個無限循環(huán)一樣運行。對象的channel和color經(jīng)歷我們必須在其他地方使用的潛在變化,所以我們在啟動函數(shù)時將它們聲明為全局。
我們用asyncio-Variant的asyncio.sleep_ms()代替正常的超時的Sleep_ms()。用線條
我們向系統(tǒng)發(fā)出信號,告知該進程可以在此時中斷,以便操作其他進程。
只要pad TP1沒有被觸碰,那么這個循環(huán)就會空著運行。如果確定了觸摸,則傳遞觸摸()1,并使用getduration()確定持續(xù)時間(以毫秒為單位)。
一個短的水龍頭帶來的周期遠低于100。
如果保持時間小于500ms,我們計數(shù)通道并將信號RGB切換到相應的顏色。通過模5除數(shù)的形成,我們將其取值范圍限制在0…4,從而接收到一個環(huán)形計數(shù)器。
如果保持時間在半秒到兩秒之間,我們觸發(fā)當前顏色的存儲。
LED環(huán)變暗超過兩秒。
函數(shù)showchannel()操作信號LED的輸出。通道號被移交并測試是否符合有效區(qū)域。如果不是這種情況,則拋出異常。led (i)一個接一個地表示紅色,綠色和藍色的三個輸出。在num上訪問相應的模式,并在模式的元組中尋址值。
showchannel(3)調(diào)用通道3(藍色)的模式(0.0.1),并設置Ledr = 0, LedG = 0和LEDB = 1。
具有Async Def的函數(shù)被啟動時,行為是協(xié)作的,它們允許多個進程彼此并行執(zhí)行,因此被稱為協(xié)程。使用協(xié)同程序increate(),我們計算所設置通道的顏色值。顏色、實現(xiàn)和注釋的變化必須在流程之外可見,即全局可見。該進程被永久地保存在while循環(huán)中,并且可以被中斷。
通道1到3,一個離散的顏色被控制。如果我們控制顏色值增加時的附加值。在第10次運行時,為了避免不必要的副作用,第5次運行時,我們將顏色值限制為最大255。列表中對應的元素顏色為。1中的通道數(shù)減少1個PTR。
在通道4中,所有分量的顏色增加相同的值3。在[255,255,255]處結束。當向后移動時,只有白光的強度降低。原來設定的顏色不再達到。目前這不是很好,但應該在sensorlampy2.0的另一集中進行優(yōu)化。
信號LED在通道0處變暗。在減少選項卡中,當前的顏色代碼為realciintermediated,代碼為[0.0.0]。這里,在increate()中,顏色代碼被恢復并發(fā)送到環(huán)。旗子說:讓我們把它放回去。
函數(shù)遞減()如果我們做類似的工作,不是加,而是用顏色值做減法。
主程序也是作為協(xié)程編寫的。首先,我們創(chuàng)建一個事件循環(huán)。它接管了對任務過程的控制。作為參數(shù),我們傳遞函數(shù)并解釋事件循環(huán)應該是一個永久的運行器。
我們打開燈并啟動Main()函數(shù)。在那之后,一切都自行進行。在那之后,一切都是通過觸摸觸控板完成的。
本文編譯自hackster.io