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