使用ESP32控制板(三):MicroPython的類比輸入、UART序列埠以及觸控開關

本文將介紹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控制板的類比輸入腳:

ADC實驗電路

在MicroPython中建立一個連接32腳ADC物件,此例命名為adc,並選擇性地設定輸入電壓範圍和取樣位元數(解析度),接著每次執行read()方法,即可讀取32腳的類比輸入值:

ADC實驗程式

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 GPS模組

底下讀取UART序列輸入資料的MicroPython程式改自ESP8266版,差別在於定義UART物件時,UART的編號是2,另外還要設定TX和RX接腳編號。

建立UART物件

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連接一條導線:

在支援電容觸控的腳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
Posts created 483

4 thoughts on “使用ESP32控制板(三):MicroPython的類比輸入、UART序列埠以及觸控開關

  1. 請問一下,是否有甚麼程式可以直接透過websocket去下達webrepl指令給ESP32呢?
    會有這個問題主要是因為我試過webrepl_cli.py這個程式,可以上傳main.py給遠端的ESP32,
    但是得要重啟電源才可以啟動main.py,我想,是不是可以透過傳送指令讓板子重新開機或是要求它執行main.py呢!

    1. 你可以把想要達成的功能寫成函式或模組,讓其他Python呼叫執行。

      thanks,
      jeffrey

  2. 老師好 我參考超圖解Python物聯網實作入門 : 使用ESP8266與MicroPython書中的範例接收neo6m的資料
    (將其轉為全度數表示那章節) 但在空曠地方誤差仍然會有十幾公尺左右(空曠且晴朗的地方) 請問除了gps模組的問題外(我查到的說明書是寫誤差2.5公尺) 可能還有什麼問題?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top