📌专栏:ESP32单片机零基础实战
✨适用人群:单片机新手、初中生科创、Arduino入门、ESP32S3开发者
🔥解决痛点:全网大部分教程为老旧ESP32内核代码,新版3.0+内核报错ledcSetup未定义,本文提供零报错、适配最新内核两套代码,通俗易懂,零基础可复刻


一、实验简介
1.1 实验功能
本次实验结合ADC模拟采集与PWM脉冲调光两大单片机核心功能:旋转电位器采集电压变化,实时改变LED输出亮度,实现无级调光,仿真台灯调光效果。
1.2 核心知识点

  • analogRead():ADC模拟读取,采集电位器电压,返回0~4095数值
  • analogWrite():PWM模拟输出,输出调光信号,控制LED亮度,范围0~255
  • map()映射函数:转换数值区间,匹配ADC和PWM数值范围
  • ESP32S3硬件原理:数字引脚只有高低电平,依靠PWM快速频闪实现亮度调节
    1.3 实验器材
  • ESP32S3开发板 ×1
  • 直插LED灯 ×1
  • 10k电位器 ×1
  • 220Ω限流电阻 ×1
  • 杜邦线、面包板若干

二、硬件接线(重点!接线错误百分百不亮)
2.1 LED接线

  • ESP32S3 GPIO14 → 220Ω电阻 → LED长脚(正极)
  • LED短脚(负极)→ 开发板 GND
    注意:必须串联220Ω电阻!不加电阻会烧毁ESP32引脚;LED正负极接反完全不发光
    2.2 电位器接线(三线接法)
  • 电位器左侧引脚 → 3.3V(禁止接5V,烧毁ADC外设)
  • 电位器中间引脚 → GPIO36(专用ADC模拟引脚)
  • 电位器右侧引脚 → GND
    在这里插入图片描述

三、原理通俗讲解(初中生易懂)

  1. 电位器:相当于可变电阻,旋转旋钮改变电压,输出0~3.3V模拟电压;
  2. ADC采集(analogRead):单片机读取模拟电压,转换成数字0~4095,电压越高数值越大;
  3. 数值映射(map):ADC最大值4095,PWM亮度最大值255,需要换算区间,不然亮度无法控制;
  4. PWM调光(analogWrite):高速开关LED,亮灭速度快到人眼无法分辨,占空比越大,灯光越亮。
    核心公式:亮度 = map(电压值,0,4095,0,255)

四、适配新版内核代码(零报错推荐)
当前Arduino ESP32内核≥3.0,官方删除老旧 ledcSetup、ledcAttachPin,旧代码直接编译报错!推荐使用极简analogWrite写法,无需配置通道,新手首选。
4.1 完整版调光代码(可串口打印调试)

// 实验:电位器控制LED亮度|ESP32S3新版内核适配
// 适配Arduino ESP32 3.0+版本,解决ledcSetup未定义报错
const int ledPin = 14;    // LED PWM输出引脚
const int adcPin = 36;    // 电位器ADC采集引脚

int adcValue;             // 存储电位器原始采样值 0~4095
int ledBright;            // 映射后LED亮度值 0~255

void setup() {
  Serial.begin(115200);  // 开启串口,打印调试数据
}

void loop() {
  // 1、读取电位器模拟电压
  adcValue = analogRead(adcPin);
  
  // 2、数值区间映射
  ledBright = map(adcValue, 0, 4095, 0, 255);
  
  // 3、PWM输出,调节LED亮度
  analogWrite(ledPin, ledBright);

  // 4、串口打印,直观观察数据
  Serial.print("ADC采样值:");
  Serial.print(adcValue);
  Serial.print(" | LED亮度:");
  Serial.println(ledBright);

  delay(50); // 稳定采样,防止亮度跳动
}

4.2 编译运行配置

  • 开发板选择:ESP32S3 Dev Module
  • 波特率设置:115200
  • 上传代码,旋转电位器即可实时调节灯光明暗

五、新旧版本代码对比(报错根源解析)
5.1 废弃旧代码(高版本报错,全网老旧教程版本)
以下代码会报 ‘ledcSetup’ was not declared in this scope,新版内核直接废弃,不建议使用:

// 老旧废弃代码!!3.0+内核编译报错
ledcSetup(pwmChannel, pwmFreq, pwmRes);
ledcAttachPin(ledPin, pwmChannel);

5.2 两种新版合法写法

  • 写法1(新手推荐):analogWrite,零配置、代码极简
  • 写法2(进阶工程):ledcAttach,自定义PWM频率,适配电机、RGB灯光

六、常见故障排查(90%踩坑汇总)
6.1 LED完全不亮

  • ❌ LED正负极接反,调换引脚接线
  • ❌ 省略220Ω限流电阻,电路工作异常
  • ❌ 选错开发板,未选择ESP32S3 Dev Module
    6.2 旋转电位器,亮度无变化
  • ❌ 电位器接5V电压,烧毁ADC采集引脚
  • ❌ 电位器GND虚接,缺少回路
  • ✅ 排查技巧:打开串口监视器,查看ADC数值是否变化
    6.3 串口数值跳动剧烈
    增大代码中delay()延时,或者外接104滤波电容,稳定模拟电压

七、知识点总结

  1. analogRead():读取模拟量,专门采集电位器、光敏传感器,范围0~4095
  2. analogWrite():输出PWM模拟量,调光、调速专用,范围0~255
  3. map函数:单片机必备函数,解决两个模块数值范围不匹配问题
  4. ESP32新版内核废弃ledc旧API,新手优先使用analogWrite,规避编译报错

八、拓展实验

  • 实验1:修改代码,实现亮度反转,电位器数值越大灯光越暗
  • 实验2:更换光敏传感器,实现光线自动控灯
  • 实验3:三路电位器,分别控制RGB彩灯三通道亮度

附录:CSDN发布标签
ESP32、ESP32S3、Arduino单片机、科创实验、单片机入门、PWM调光、ADC采集、初中生科创

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐