双轴太阳能自动跟随模型 项目总结报告
参赛方向:方向四:绿色能源 太阳能能量采集
主控:ESP32-S3
执行机构:2 个 MG995 舵机(旋转 + 俯仰)
检测:4 路光敏电阻
显示:2.0 寸 OLED 屏
一、项目介绍与创意介绍
1.1 项目介绍
本项目为双轴太阳能自动跟随模型,基于 ESP32-S3 单片机实现光源智能追踪。系统通过4 个光敏电阻检测光照强度差异,自动控制旋转、俯仰双路 MG995 舵机运动,使太阳能板始终对准最亮光源,提高光照接收效率。系统配备 2.0 寸 OLED 屏幕实时显示光敏电阻数值与运行状态,整体结构简洁、控制稳定、响应迅速,是新能源自动追踪领域的典型教学与演示模型。
1.2 创意与创新点
- 双轴自动追踪:水平旋转 + 垂直俯仰,实现全方位光源跟随,追踪精度高。
- 四象限光敏检测:采用 4 路光敏电阻组成光照检测阵列,判断光源方向更准确。
- 自适应差值算法:通过光敏电阻差值判断运动方向,无需复杂标定,响应快、抗干扰强。
- 屏幕实时显示:2.0 寸屏实时显示四路 ADC 数据,便于观察与调试。
- 舵机角度保护:软件自带角度限制逻辑,防止舵机堵转、结构卡死。
二、项目硬件整体介绍
- 主控单元:ESP32-S3 单片机,负责 ADC 采集、舵机控制、屏幕显示、算法运算。
- 执行单元:2 个 MG995 金属舵机,分别控制水平旋转、垂直俯仰。
- 检测单元:4 个光敏电阻,构成四方向光照检测模块。
- 显示单元:2.0 寸 OLED 显示屏,实时显示 ADC 数值。
- 供电单元:5V 外接电源,为 ESP32-S3 与舵机提供稳定供电。

三、整体方案框图与项目设计思路
3.1 方案框图

3.2 设计思路
系统通过 4 个光敏电阻获取左、右、上、下四个方向的光照强度,ESP32-S3 读取 ADC 值后计算差值,判断光源偏移方向。
- 左右光敏差值 → 控制水平旋转舵机
- 上下光敏差值 → 控制垂直俯仰舵机
程序设置死区阈值,避免微小抖动造成舵机频繁动作,保证跟随平稳可靠。
四、原理图与 PCB 说明
本项目采用模块化搭建结构,无专属 PCB 电路板,通过杜邦线完成各模块连接。
光敏电阻模块直接接入 ESP32-S3 的 ADC 接口,2 个 MG995 舵机接入 PWM 控制口,OLED 屏通过 spi 通信。所有接线规范、布局清晰,信号与电源分离,有效减少干扰,满足项目功能实现与竞赛展示要求。

五、软件流程图与关键代码说明
5.1 软件流程图

5.2 关键代码说明
1)系统初始化 my_app_main_init ()
完成 OLED 屏幕、ADC 采集、双路 MG995 舵机、按键与定时器的初始化,是系统正常运行的基础。
void my_app_main_init(void)
{
OLED_init();
if (adc_init() != 0)
{
printf("ADC initialization failed!\n");
return;
}
mg995_init_all();
key_gpio_init();
key_timer_init();
}
2)ADC 光敏采集模块
通过 ESP32-S3 的 ADC1 读取 4 路光敏电阻模拟量,分别存入raw_adc0、raw_adc1、raw_adc2、raw_adc3,为方向判断提供数据。
// 读取原始值
int adc_read_raw(int gpio_num, int *raw_value) {
if (adc_handle == NULL) {
printf("ADC not initialized, call adc_init first\n");
return -1;
}
adc_channel_t ch;
if (!get_adc_channel(gpio_num, &ch)) {
printf("Invalid GPIO %d (supported: 16,17,18,19)\n", gpio_num);
return -1;
}
int raw = 0;
esp_err_t ret = adc_oneshot_read(adc_handle, ch, &raw);
if (ret != ESP_OK) {
printf("ADC read failed on GPIO%d: %s\n", gpio_num, esp_err_to_name(ret));
return -1;
}
*raw_value = raw;
return 0;
}
// ===================== 修改:读取 16/17/18/19 引脚 =====================
void adc_print_all(void) {
int raw = 0;
adc_read_raw(16, &raw);
printf("GPIO16: raw = %4d\n", raw);
raw_adc0=raw;
adc_read_raw(17, &raw);
printf("GPIO17: raw = %4d\n", raw);
raw_adc1=raw;
adc_read_raw(18, &raw);
printf("GPIO18: raw = %4d\n", raw);
raw_adc2=raw;
adc_read_raw(19, &raw);
printf("GPIO19: raw = %4d\n", raw);
raw_adc3=raw;
}
3)核心跟随算法 my_adc_num ()
- 读取 4 路光敏 ADC 值
- 计算左右差值控制旋转舵机
- 计算上下差值控制俯仰舵机
- 设置死区(100/200),防止抖动
- 角度通过
/20平滑处理,运动柔和不抖动 - 调用
mg995_single输出 PWM 控制舵机角度
void my_adc_num(void)
{
static uint16_t motor_A1=600;
static uint16_t motor_A2=600;
int16_t nums=0;
adc_print_all();
sprintf(shuzhu,"%d,%d ",raw_adc0,raw_adc1);
OLED_ShowString(1,60,shuzhu,BLUE,WHITE);
sprintf(shuzhu,"%d,%d ",raw_adc2,raw_adc3);
OLED_ShowString(1,90,shuzhu,BLUE,WHITE);
nums=raw_adc1-raw_adc0;
if(nums>100||nums<-100)
{
motor_A1-=nums/20;
mg995_single(3,motor_A1);
}
nums=raw_adc3-raw_adc2;
if(nums>200||nums<-200)
{
motor_A2+=nums/20;
mg995_single(2,motor_A2);
}
}
4)屏幕显示
OLED 实时显示四路光敏电阻数值,方便观察光源位置与系统运行状态。
六、项目功能展示与说明
- 双轴自动跟随:水平 180° 旋转、垂直俯仰,精准追踪光源位置。
- 四光敏检测:4 路光敏电阻实现高精度方向判断。
- 自适应算法:根据光照强度差自动调整姿态。
- 防抖设计:设置死区与平滑系数,运动稳定不抖。
- 实时屏幕显示:直观展示四路光敏 ADC 数值。
- 结构保护:软件角度限制,避免机械卡死。



七、设计过程遇到的难题与解决方法
- 问题:光敏电阻受环境光干扰,跟随抖动
解决:设置差值死区,只有光照差超过阈值才动作,大幅提升稳定性。 - 问题:舵机运动过快、动作生硬
解决:将控制量除以 20 进行平滑处理,运动柔和、定位精准。 - 问题:光敏电阻一致性差
解决:采用差值算法,不依赖绝对数值,只判断相对强弱,提高兼容性。 - 问题:屏幕刷屏过快导致闪烁
解决:搭配 10ms 系统延时,保证刷新稳定。
八、竞赛心得体会与建议
通过本次双轴太阳能自动跟随项目,我熟练掌握了 ESP32-S3 的 ADC 采集、舵机 PWM 控制、屏幕显示与闭环控制算法。项目从硬件搭建到软件编程,完整实现了自动追踪、闭环控制、实时显示三大核心功能,让我对工业控制与新能源追踪系统有了更深入的理解。
本项目结构简单、控制逻辑清晰、实用性强,非常适合作为自动化控制类竞赛作品。未来可增加 WiFi 数据上传、太阳能电压采集、大风保护等功能,进一步提升项目完整性。