esp32-s3 gpio控制

一、GPIO的输出控制
1、点亮led
①、连接LED控制电路(Wokwi上仿真https://wokwi.com/)
image
②、定义GPIO引脚及配置输出模式
#define LED_PIN 19

void setup(){
	pinMode(LED_PIN, OUTPUT);
	digitalWrite(LED_PIN, HIGH); //高电平熄灭
	
	Serial.begin(115200);
	Serial.println("Hi, ESP32-S3!");
}
③、循环控制
void loop(){
	digitalWrite(LED_PIN, LOW);
	delay(500);
	digitalWrite(LED_PIN, HIGH);
	delay(500);
}

二、GPIO的输入控制
1、按键、模拟输入
①、连接摇杆的SEL按键、模拟输入电路图
image
②、定义GPIO引脚及输入配置
#define VERT_PIN 14
#define HORZ_PIN 13
#define SEL_PIN 12

void setup(){
	pinMode(VERT_PIN, INPUT);
	pinMode(HORZ_PIN, INPUT);
	pinMode(SEL_PIN, INPUT_PULLUP);
}

③、循环读取
void loop(){
	unsigned int horz_val = 0;
	unsigned int vert_val = 0;
	static unsigned char sel_val = 1;

	horz_val = analogRead(HORZ_PIN); //模拟信号读取
	vert_val = analogRead(VERT_PIN);
	sel_val = digitalRead(SEL_PIN); //数字信号读取

	Serial.print("Horz_val:");
	Serial.println(horz_val);
	Serial.print("Vert_val:");
	Serial.println(vert_val);

	Serial.printf("sel_val:%d\r\n", sel_val);
}
2、执行结果(https://wokwi.com/projects/436691055899307009)
![image](https://img2024.cnblogs.com/blog/1187700/202507/1187700-20250717114009668-1523937726.png)

三、PWM控制舵机
1、连接舵机
image
2、定义PWM输出IO
#define H_SERVO_PIN 20
#define V_SERVO_PIN 21
#define MAX_WIDTH 2500
#define MIN_WIDTH 500
3、初始化定时器及端口

	ESP32PWM::allocateTimer(0);  // 分配硬件定时器
	h_servo.setPeriodHertz(50);   // 设定 50Hz 标准舵机频率
	h_servo.attach(H_SERVO_PIN, MIN_WIDTH, MAX_WIDTH);
	ESP32PWM::allocateTimer(1);  // 分配硬件定时器
	v_servo.setPeriodHertz(50);   // 设定 50Hz 标准舵机频率
	v_servo.attach(V_SERVO_PIN, MIN_WIDTH, MAX_WIDTH);
	for(i=0; i<=180; i+=10){
	h_pos_val = i;
	v_pos_val = i;
	h_servo.write(h_pos_val);
	v_servo.write(v_pos_val);
	delay(50);
	}
	h_pos_val = 90;
	v_pos_val = 90;
	h_servo.write(h_pos_val);
	v_servo.write(v_pos_val);

4、关联摇杆按键控制舵机

if(horz_val >= 4095){
  h_pos_val = 5;
  h_servo.write(h_pos_val);
}
else if(horz_val <= 0){
  h_pos_val = 175;
  h_servo.write(h_pos_val);
}
else if(vert_val >= 4095){
   v_pos_val = 5;
   v_servo.write(v_pos_val);
}
else if(vert_val <= 0){
   v_pos_val = 175;
   v_servo.write(v_pos_val);
}
else if(sel_val == 0){
   h_pos_val = 90;
   h_servo.write(h_pos_val); 
   v_pos_val = 90;
   v_servo.write(v_pos_val);
}

5、执行结果
image

posted @ 2025-07-17 11:41  zbl1118  阅读(148)  评论(0)    收藏  举报