一、硬件介绍
1、主控开发板
使用的是XIAO ESP32S3开发板,集成ESP32S3 32位双核处理器芯片,最高运行频率240MHz,板载8MB PSRAM和8MB FLASH;
功能引脚示意图

2、Grove Creator Kit 器件
在本次开发中,使用到的 `Grove Creator Kit 套件` 中的器件如下:
Grove - Thumb Joystick(双轴摇杆)

Grove - Red LED (红色LED灯)
Grove - Blue LED (蓝色LED灯)
Grove - Green LED(绿色LED灯)

Multi Color Flash LED (多色闪烁LED)

二、功能实现
1、硬件搭建
将摇杆、LED灯等模块,分别通过Grove接口连接到开发板对应的引脚上;

实物搭建效果:

2、功能效果
当摇杆处于不同方位时(上 / 下 / 左 / 右)分别点亮不同颜色的LED(RED / GREEN / BLUE / COLOR),按下摇杆时,关闭所有的LED灯光;
同时串口输出当前摇杆所处的状态;
三、代码编写
主要相关代码
> 该摇杆模块的GROVE接口只使用X、Y轴,没有单独使用Z轴(按键);
> X、Y输出两个模拟值(350 ~ 1023),分别代表两个方向;
> 按下按键时,X / Y值为1023;
#define BLUE_LED D5
#define RED_LED D0
#define GREEN_LED D1
#define COLOR_LED D8
#define JOYSTICK_X A10
#define JOYSTICK_Y A9
// 按下比较数值
const int PRESS_THRESHOLD = 1010;
// 居中数值范围
const int CENTER_MIN = 700;
const int CENTER_MAX = 800;
const unsigned long DEBOUNCE_MS = 40;
bool lastPressState = false;
unsigned long pressDebounceTimer = 0;
// 上次数值 居中判断
int prevX = 0;
int prevY = 0;
bool isHoldLock = false;
void setup() {
Serial.begin(115200);
delay(100);
analogReadResolution(10); // 0~1023
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
pinMode(COLOR_LED, OUTPUT);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
digitalWrite(COLOR_LED, LOW);
}
void loop() {
int x = analogRead(JOYSTICK_X);
int y = analogRead(JOYSTICK_Y);
// Serial.print("X 和 Y 坐标:");
// Serial.print(x, DEC);
// Serial.print(",");
// Serial.println(y, DEC);
// Serial.println(" ");
bool xyMax = (x >= PRESS_THRESHOLD) && (y >= PRESS_THRESHOLD);
bool wasCenter = (prevX >= CENTER_MIN && prevX <= CENTER_MAX) && (prevY >= CENTER_MIN && prevY <= CENTER_MAX);
bool rawPress = xyMax && wasCenter;
bool validPress = false;
if(rawPress){
if(millis() - pressDebounceTimer > DEBOUNCE_MS){
validPress = true;
}
}else{
pressDebounceTimer = millis();
}
// 居中 按下有效
if(validPress && !lastPressState){
Serial.println("按键按下");
isHoldLock = true;
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
digitalWrite(COLOR_LED, LOW);
}
lastPressState = validPress;
// 松开摇杆按键
if(!xyMax){
isHoldLock = false;
}
// 方向判定
if(!validPress && !isHoldLock){
if(y < 400) { Serial.println("上"); digitalWrite(RED_LED, HIGH);}
else if (y > 900) { Serial.println("下"); digitalWrite(GREEN_LED, HIGH);}
else if(x > 900) { Serial.println("左"); digitalWrite(BLUE_LED, HIGH);}
else if(x < 400) { Serial.println("右"); digitalWrite(COLOR_LED, HIGH);}
}
prevX = x;
prevY = y;
delay(500);
}四、程序烧录
1、连接USB数据线至开发板;
2、选择端口号对应的开发板;
3、点击 `上传` 烧录程序到开发板上;

五、效果演示

我要赚赏金
