跳到主要内容

第 04 节 测试 Sensor AD 接口

在现实的自然界中大部分的物理量都是模拟信号,例如温度,光照,电压,电流,声音,压力,气体浓度等,这些都是连续变化的,但是 MCU 是数字逻辑,只能读 0 和 1 的组合,所以此时 ADC(Analog-to-Digital Converter)就是模拟世界 通向 数字世界的桥梁。

在 ESP32‑S3 上,总共支持 20 个测量通道:ADC 通道 1:GPIO1 - GPIO10;ADC 通道 2:GPIO11 - GPIO20。具体定义可查看官方的 数据手册。关于 ESP32-S3 在 Arduino IDE 上的 ADC 驱动教程,可学习我们的 ESP32 入门教程 ADC 模拟输入

在本产品中,我们将 IO6 引出作为 ADC 引脚,集成了一个 PH2.0 3pin Sensor AD 排座,方便客户连接带模拟输出的传感器。

ESP32-S3-Touch-LCD-7 AD demo 1

为了让用户更快熟悉 AD 接口的应用,我们提供了一个简单的模拟信号读取代码,还提供了一个连接 MQ-7 Gas Sensor 气体传感器进行数据读取和转换的例子,方便新手用户了解如何在基础代码的进行修改,驱动自己的 ADC 设备。

元件清单

  • ESP32-S3-Touch-LCD-7 x1
  • USB 线 Type-A 公口 转 Type-C 公口 x1
  • MQ-7 Gas Sensor 气体传感器 x1
  • HY2.0 3P 转杜邦公头 x1
ESP32-S3-Touch-LCD-7 AD demo 10

基础代码

请先从以下地址下载例程包:ESP32-S3-Touch-LCD-7 示例程序 (如果先前已经下载,直接打开对应文件夹即可) 将例程压缩包解压之后,打开对应的 \Arduino\examples\04_Sensor_AD 文件夹。

ESP32-S3-Touch-LCD-7 AD demo 4

双击打开 04_Sensor_AD.ino

ESP32-S3-Touch-LCD-7 AD demo 5

这里我们提供了一个简单的模拟信号读取代码,用户可以在这个代码的基础上进行修改接入自己的模拟信号传感器。下面我们会进行简单的讲解分析。

    #include <Arduino.h>
#define PIN_ADC2_CH2 6 //Define the pin macro

引入 Arduino 头文件,并给 GPIO6 起一个名字叫 PIN_ADC2_CH2,让代码更易读。

    void setup() {
Serial.begin(115200); //The serial port is initially configured
analogReadResolution(12); //Set ADC resolution to 12 bits (0-4096)
}

setup() 初始化阶段,打开串口通讯设置波特率为 115200,并设置 ADC 的读取分辨率为 12 位数据(从 0 到 4095)。12-bit 意味着有 4096 个刻度,分辨率越高,精度越细。低分辨率会让数值跳动更明显。ESP32 默认就是 12-bit,但写上更规范。

接下来是 loop() 主循环,ESP32 会一直不停地读取 ADC 并打印结果

    int analogOriginalValue = 0;
int analogVoltsValue = 0;

定义两个变量,一个用来存 ADC 原始值(0~4095),一个用来存 ADC 转换后的电压值(单位 mV)。

    analogOriginalValue = analogRead(PIN_ADC2_CH2);

读取 GPIO6 上的模拟电压,返回 0~4095 的数字。这是纯数字,没有单位。

    analogVoltsValue = analogReadMilliVolts(PIN_ADC2_CH2);

直接返回电压值,不用手动计算,单位是毫伏(mV)。analogReadMilliVolts() 是 ESP32 Arduino 框架中特有的函数,不是标准 Arduino 函数,它会自动把 ADC 原始值转换为能直接读懂的电压值,不需要自己数学计算。

    Serial.printf("ADC analog value = %d\n",analogOriginalValue);
Serial.printf("ADC millivolts value = %d mV\n",analogVoltsValue);

把读取到的原始值和电压值输出到串口监视器。

    delay(100);

每次读取后会延时 100ms,这样可以减少串口刷屏,稳定 ADC 输出,更易观察数据变化。

使用基础代码读取传感器数据

接下来我们将修改上面给出的基础代码,用于读取 MQ-7 Gas Sensor 气体传感器的模拟信号,并打印读取和转换后的结果。

1. MQ-7 Gas Sensor 气体传感器产品介绍

这是一款由微雪推出的主要检测一氧化碳气体的传感器。这类传感器内部有一个用金属氧化物制成的气敏元件。当它接触到特定气体时,其电导率会发生变化。传感器将这个电导率的变化转换成了两种信号输出供您选择:模拟量输出数字量输出

引脚功能详解:

  • VCC: 电源正极。接 2.5V ~ 5.0V 的直流电压。为整个传感器模块供电。
  • GND: 电源地。接电源的负极,与您的 MCU 共地。
  • AOUT: 模拟量输出。这个引脚会输出一个连续变化的电压值。
  • DOUT: 数字量输出。这个引脚只会输出两种状态:高电平 或 低电平。
ESP32-S3-Touch-LCD-7 AD demo 2

2. 硬件连接

在本次的测试当中,我们仅需要使用到 AOUT 引脚。如图所示将传感器接入到 ESP32-S3-Touch-LCD-7 的 Sensor AD 接口:GND 对 GND,VCC 对 3V3,AOUT 对 AD;并用 Type A 公口 转 Type C 的 USB 线将 ESP32 的 USB 也接到电脑的 USB,用于下载程序和查看串口调试信息。

完成全部连接如下图:

ESP32-S3-Touch-LCD-7 AD demo 3

3. 修改代码

将代码改写如下:

    #include <Arduino.h>
#define gas_ain 6
int ad_value = 0;
int ad_voltsvalue = 0;
void setup()
{
pinMode(gas_ain,INPUT);
Serial.begin(115200);
analogReadResolution(12);
}
void loop()
{
ad_value=analogRead(gas_ain);
ad_voltsvalue = analogReadMilliVolts(gas_ain);
Serial.printf("gas analog value = %d\n",ad_value);
Serial.printf("gas millivolts value = %d mV\n",ad_voltsvalue);

delay(1000);
}

传感器的 AOUT 引脚输出到 GPIO 6,因此设定 #define gas_ain 6,并在 void setup() 将这个引脚设定成输入模式。

注意

在使用前应预热一分钟(为了给传感器内部的敏感材料加热,从而正常工作),可在 setup() 函数当中加入:

    Serial.println("\n=== 气体传感器启动 ===");
Serial.println("传感器预热中。.. 请等待 60 秒");

// 预热等待
for(int i = 60; i > 0; i--) {
Serial.printf("预热倒计时:%d 秒、n", i);
delay(1000);
}

4. 代码上传

前面我们已经连接好了下载程序的 USB 口,在打开程序后,右上角选择好串口和开发板型号 Waveshare ESP32-S3-Touch-LCD-7:

ESP32-S3-Touch-LCD-7 AD demo 6

然后点击箭头按钮进行程序上传,等待上传完成即可。

ESP32-S3-Touch-LCD-7 AD demo 7

5. 运行结果

程序下载成功后,打开工具菜单栏当中的串口监视器,设置波特率为 115200,即可看到程序已经开始运行了,正在预热传感器:

ESP32-S3-Touch-LCD-7 AD demo 8

向传感器哈一口气,即可看到串口输出值发生变化,说明传感器已经在正常运作。

ESP32-S3-Touch-LCD-7 AD demo 9