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上模拟传感器的的数据。

参考文献

广告