这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » Grove Creator Kit开发指南【Joystick‑LED交互控制系统

共1条 1/1 1 跳转至

Grove Creator Kit开发指南【Joystick‑LED交互控制系统】

菜鸟
2026-08-24 21:10:20     打赏


一、硬件介绍

1、主控开发板

使用的是XIAO ESP32S3开发板,集成ESP32S3 32位双核处理器芯片,最高运行频率240MHz,板载8MB PSRAM和8MB FLASH;1787576271514383.png





功能引脚示意图

1787576305327340.png


2、Grove Creator Kit 器件

在本次开发中,使用到的 `Grove Creator Kit 套件` 中的器件如下:


Grove - Thumb Joystick(双轴摇杆)

image-20260818180952274.png


Grove - Red LED (红色LED灯)

Grove - Blue LED (蓝色LED灯)

Grove - Green LED(绿色LED灯)

image-20260818180812373.png


Multi Color Flash LED (多色闪烁LED)

image-20260818182355199.png



二、功能实现

1、硬件搭建

将摇杆、LED灯等模块,分别通过Grove接口连接到开发板对应的引脚上;

image.png


实物搭建效果:

image-20260819215111086.png


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、点击 `上传` 烧录程序到开发板上;

image-20260818173949849.png




五、效果演示



1.gif






共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]