
- ESP32物聯網教程
- 首頁
- 物聯網概述
- ESP32簡介
- 在Arduino IDE中安裝ESP32板
- 設定RTOS以實現雙核和多執行緒操作
- ESP32與MPU6050的介面
- ESP32與模擬感測器的介面
- ESP32首選項
- ESP32 SPIFFS儲存(晶片自帶的迷你SD卡)
- ESP32與OLED顯示屏的介面
- ESP32上的WiFi
- 使用HTTP透過WiFi傳輸資料
- 使用HTTPS透過WiFi傳輸資料
- 使用MQTT透過WiFi傳輸資料
- 透過藍牙傳輸資料
- 使用NTP客戶端獲取當前時間
- 執行ESP32韌體的(OTA)更新
- ESP32的應用
- 開發人員的後續步驟
- ESP32物聯網有用資源
- 快速指南
- 有用資源
- 討論
ESP32與模擬感測器的介面
您需要與ESP32介面的另一類重要的感測器是模擬感測器。模擬感測器有很多型別,LDR(光敏電阻)、電流和電壓感測器是常見的例子。現在,如果您熟悉任何Arduino板(如Arduino Uno)上analogRead的工作原理,那麼本章對您來說將是小菜一碟,因為ESP32使用相同的函式。您只需要注意一些細微差別,這些細微差別將在本章中介紹。
關於模數轉換(ADC)過程的簡要說明
每個支援ADC的微控制器都將具有定義的解析度和參考電壓。參考電壓通常是電源電壓。提供給ADC引腳的模擬電壓應小於或等於參考電壓。解析度表示用於表示數字值的位的數量。因此,如果解析度為8位,則該值將由8位表示,並且可能的最大值為255。此最大值對應於參考電壓的值。其他電壓的值通常透過縮放得出。
因此,如果參考電壓為5V且使用8位ADC,則5V對應於讀數255,1V對應於讀數(255/5*1)= 51,2V對應於讀數(255/5*2)= 102,依此類推。如果我們使用12位ADC,則5V將對應於讀數4095,1V將對應於讀數(4095/5*1)= 819,依此類推。
反向計算可以類似地執行。如果您在參考電壓為3.3V的12位ADC上獲得1000的值,則它大約對應於(1000/4095*3.3)= 0.8V的值。如果您在參考電壓為5V的10位ADC上獲得825的讀數,則它大約對應於(825/1023*5)= 4.03V的值。
透過以上解釋,可以清楚地看出,ADC使用的參考電壓和位數都決定了可以檢測到的最小電壓變化。如果參考電壓為5V且解析度為12位,則您有4095個值來表示0-5V的電壓範圍。因此,可以檢測到的最小變化為5V/4095 = 1.2mV。類似地,對於5V和8位參考電壓,您只有255個值來表示0-5V的範圍。因此,可以檢測到的最小變化為5V/255 = 19.6mV,或大約是12位解析度檢測到的最小變化的16倍。
將ADC感測器與ESP32連線
考慮到感測器的普及性和可用性,我們將使用LDR進行演示。我們基本上將LDR與一個常規電阻串聯,並將連線這兩個電阻的點的電壓饋送到ESP32的ADC引腳。哪個引腳?好吧,有很多。ESP32擁有18個ADC引腳(通道1上有8個,通道2上有10個)。但是,通道2引腳不能與WiFi一起使用。並且某些電路板上的通道1的一些引腳沒有暴露出來。因此,我通常堅持使用以下6個ADC引腳——32、33、34、35、36、39。在下圖中,一個電阻為90K的LDR連線到一個電阻為150K的電阻。LDR的自由端連線到ESP32的3.3V引腳,電阻的自由端連線到GND。LDR和電阻的公共端饋送到ESP32的ADC引腳36(VN)。

程式碼演練
GitHub連結 - https://github.com/
這裡的程式碼很簡單。不需要包含庫。我們只需將LDR引腳定義為常量,在setup()中初始化序列埠,並設定ADC的解析度。這裡我們將解析度設定為10位(意味著最大值為1023)。預設情況下,解析度為12位,對於ESP32,最小可能解析度為9位。
const int LDR_PIN = 36; void setup() { // put your setup code here, to run once: Serial.begin(115200); analogReadResolution(10); //default is 12. Can be set between 9-12. }
在迴圈中,我們只需從LDR引腳讀取值並將其列印到序列埠監視器。此外,我們將其轉換為電壓並列印相應的電壓。
void loop() { // put your main code here, to run repeatedly: // LDR Resistance: 90k ohms // Resistance in series: 150k ohms // Pinouts: // Vcc −> 3.3 (CONNECTED TO LDR FREE END) // Gnd −> Gnd (CONNECTED TO RESISTOR FREE END) // Analog Read −> Vp (36) − Intermediate between LDR and resistance. int LDR_Reading = analogRead(LDR_PIN); float LDR_Voltage = ((float)LDR_Reading*3.3/1023); Serial.print("Reading: ");Serial.print(LDR_Reading); Serial.print("\t");Serial.print("Voltage: ");Serial.println(LDR_Voltage); }
我們使用1023作為除數,因為我們將ADC解析度設定為10位。如果您將ADC值更改為N,則需要將除數更改為(2^N −1)。現在將您的手放在LDR上
我們使用1023作為除數,因為我們將ADC解析度設定為10位。如果您將ADC值更改為N,則需要將除數更改為(2^N −1)。現在將您的手放在LDR上,檢視對電壓的影響,然後用電筒照射LDR,檢視序列埠監視器上電壓的劇烈變化。就是這樣。您已成功捕獲ESP32上模擬感測器的的資料。