ESP32S3 带电机 — ESP32-S3 simulation

An interactive ESP32-S3 circuit simulation you can run free in your browser on Velxio, by lsct1111.

Components

Sketch code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <nvs_flash.h>
#include <esp_task_wdt.h>
#include <esp32-hal-timer.h>
#include <EspUsbDevice.h>          // 替代 USBHIDConsumerControl

// ==================== 引脚定义 ====================
#define PIN_BTN_START 10
#define PIN_BTN_FUNC  11
#define PIN_BTN_ADD   12
#define PIN_BTN_SUB   13
#define PIN_BTN_MEM   14
#define PIN_OLED_SDA  8
#define PIN_OLED_SCL  9
#define PIN_mosfet    35
#define OLED_ADDR     0x3C
#define SCREEN_W      128
#define SCREEN_H      64

#define KEY_LONG_US      800000UL
#define KEY_DEBOUNCE_US  20000UL
#define EVENT_LOCK_US    150000UL
#define ACCEL_PERIOD_US  100000UL

#define X_MIN_US     0UL
#define X_MAX_US     5000000UL
#define Y_MIN_US     10UL
#define Y_MAX_US     5000000UL
#define Z_MIN_US     0UL
#define Z_MAX_US     5000000UL
#define B_MIN        1
#define B_MAX        99
#define GROUP_CNT    5

// ==================== USB HID 音量减(EspUsbDevice) ====================
EspUsbDevice device;
EspUsbDeviceHidConsumerControl media(device);

#define HID_RELEASE_DELAY_US  5000ULL

bool     hidPressPending   = false;
uint64_t hidPressAt        = 0;
bool     hidReleasePending = false;
uint64_t hidReleaseAt      = 0;

// ==================== 数据结构 ====================
struct ParamGroup {
  uint32_t x_us;
  uint32_t y_us;
  uint32_t z_us;
  uint16_t b;
};

ParamGroup groups[GROUP_CNT];
uint8_t curGroup = 1;

enum EditRow {ROW_GROUP=0, ROW_X, ROW_Y, ROW_Z, ROW_B, ROW_MAX};
int8_t selRow = ROW_GROUP;

uint64_t addLastAccelTs = 0;
uint64_t subLastAccelTs = 0;
bool addAccelActive = false;
bool subAccelActive = false;

uint64_t savedShowUntil = 0;
uint64_t keyLastEvtTs[5] = {0,0,0,0,0};

// ==================== 时序状态(硬件定时器 ISR 共享) ====================
enum SeqState { SEQ_IDLE, SEQ_WAIT_PRE, SEQ_PULSE_ON, SEQ_PULSE_OFF };
volatile SeqState seqState = SEQ_IDLE;
volatile uint16_t seqPulseCnt = 0;
volatile ParamGroup seqParam;

hw_timer_t *seqTimer = NULL;

Adafruit_SSD1306 display(SCREEN_W, SCREEN_H, &Wire, -1);
bool gOledReady = false;

struct KeyState {
  uint8_t pin;
  bool lastRaw;
  uint64_t pressStart;
  bool longTriggered;
  const char* name;
};
KeyState keys[5] = {
  {PIN_BTN_START, HIGH, 0, false, "START"},
  {PIN_BTN_FUNC,  HIGH, 0, false, "FUNC"},
  {PIN_BTN_ADD,   HIGH, 0, false, "ADD"},
  {PIN_BTN_SUB,   HIGH, 0, false, "SUB"},
  {PIN_BTN_MEM,   HIGH, 0, false, "MEM"}
};
enum KeyIdx { K_START, K_FUNC, K_ADD, K_SUB, K_MEM };

// ==================== 硬件定时器中断服务程序 ====================
void IRAM_ATTR onSeqTimer()
{
  uint32_t nextUs = 0;

  switch (seqState) {
    case SEQ_WAIT_PRE:
      seqPulseCnt = 0;
      gpio_set_level((gpio_num_t)PIN_mosfet, 1);
      seqState = SEQ_PULSE_ON;
      nextUs = seqParam.y_us;
      break;

    case SEQ_PULSE_ON:
      gpio_set_level((gpio_num_t)PIN_mosfet, 0);
      seqState = SEQ_PULSE_OFF;
      nextUs = (seqParam.z_us > 0) ? seqParam.z_us : 1;
      break;

    case SEQ_PULSE_OFF:
      seqPulseCnt++;
      if (s