本文將介紹ESP32控制板和ESP8266在MicroPython程式功能的三個不同之處:類比輸入、UART序列埠以及觸控開關。
ADC(類比數位轉換器)類別
ESP8266只有一個類比輸入腳,輸入電壓介於0V~1V、8位元取樣,量化值介於0~1023。ESP32的類比輸入轉換器(analog to digital converter,簡稱ADC)可用於32~39腳,輸入電壓介於0V~3.6V、12位元取樣,量化值介於0~4095。
ESP32的ADC預設將類比輸入電壓上限當作1.0V,高於1.0V的電壓值都是4095。ADC類比輸入電壓範圍和取樣位元,可分別透過ADC類別的atten()和width()方法調整。
atten(衰減值)方法:atten代表“attenuation”(直譯為「衰減量」),用於調整輸入電壓範圍,可能的衰減值為:
- ADC.ATTN_0DB:0dB衰減,輸入電壓上限1.00V,此為預設值。
- ADC.ATTN_2_5DB:2.5dB衰減,輸入電壓上限1.34V。
- ADC.ATTN_6DB:6dB 衰減,輸入電壓上限2.00V。
- ADC.ATTN_11DB:11dB 衰減,輸入電壓上限3.6V。
width(位元值)方法:設定ADC的取樣位元數,可能的位元值:
- ADC.WIDTH_9BIT:9位元 (29,0~511)
- ADC.WIDTH_10BIT:10位元(210,0~1023)
- ADC.WIDTH_11BIT:11位元(211,0~2047)
- ADC.WIDTH_12BIT:12位元(212,0~4095)
在相同取樣位元的情況下,輸入電壓範圍越小,精確度。例如,1V分割成4096份,對比3.6V分割成4096份,1V的分割比較細緻。
ESP32控制板的ADC實驗
底下用一個10KΩ可變電阻測試ESP32控制板的類比輸入腳:
在MicroPython中建立一個連接32腳ADC物件,此例命名為adc,並選擇性地設定輸入電壓範圍和取樣位元數(解析度),接著每次執行read()方法,即可讀取32腳的類比輸入值:
from machine import Pin, ADC adc = ADC(Pin(32)) adc.atten(ADC.ATTN_11DB) adc.width(ADC.WIDTH_12BIT) adc.read()
UART連接GPS模組
ESP8266只有1.5個博士學位UART序列埠,所以《超圖解Python物聯網實作入門:使用ESP8266與MicroPython》第七章的GPS模組連接實驗,需要搭配WebREPL操作。ESP32也可以透過WebREPL操作,設定方式和ESP8266板相同。
LOLIN32控制板有兩個UART硬體介面,把GPS模組接在第2個UART序列埠的示範如下:
底下讀取UART序列輸入資料的MicroPython程式改自ESP8266版,差別在於定義UART物件時,UART的編號是2,另外還要設定TX和RX接腳編號。
from machine import UART com = UART(2, 9600, tx=17, rx=16) com.init(9600, bits=8, parity=None, stop=1) while True: data = com.readline() if data: print(data)
直接在PuTTY或screen終端機輸入上面的程式碼,即可在終端機顯示GPS資料。
電容式觸控開關實驗
ESP32模組的這10的接腳具有電容式觸控感應功能:0, 2, 4, 12, 13, 14, 15, 27, 32和33。
在支援電容觸控的腳15連接一條導線:
透過machine模組裡的TouchPad類別建立一個觸控物件,此例稱為t,再執行read()方法讀取觸控接腳的輸入值。
實際的觸控感測值會隨周遭環境以及電路的裝設方式(如:觸控的面積)而變。若嘗試在不支援電容觸控輸入的接腳建立TouchPad物件,將引發如下的ValueError錯誤:
根據實驗取得的觸控輸入值,在未碰觸引腳時,觸控值始終大於500;碰觸引腳時感測到的觸控值則通常介於150~350。因此,《超圖解Python物聯網實作入門:使用ESP8266與MicroPython》第四章的LED觸控程式,可以改寫成:
from machine import TouchPad, Pin import time led = Pin(5, Pin.OUT) # LOLIN32板內建的LED接腳 t = TouchPad(Pin(15)) while True: if t.read() < 500: time.sleep_ms(20) led.value(not led.value()) # 點亮或關閉LED while t.read() < 500: pass
請問一下,是否有甚麼程式可以直接透過websocket去下達webrepl指令給ESP32呢?
會有這個問題主要是因為我試過webrepl_cli.py這個程式,可以上傳main.py給遠端的ESP32,
但是得要重啟電源才可以啟動main.py,我想,是不是可以透過傳送指令讓板子重新開機或是要求它執行main.py呢!
你可以把想要達成的功能寫成函式或模組,讓其他Python呼叫執行。
thanks,
jeffrey
老師好 我參考超圖解Python物聯網實作入門 : 使用ESP8266與MicroPython書中的範例接收neo6m的資料
(將其轉為全度數表示那章節) 但在空曠地方誤差仍然會有十幾公尺左右(空曠且晴朗的地方) 請問除了gps模組的問題外(我查到的說明書是寫誤差2.5公尺) 可能還有什麼問題?
拍謝,不知,我測試的模組如規格書標示的精確。