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)。

LDR Connection with ESP32

程式碼演練

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上模擬感測器的的資料。

參考文獻

廣告