/* 自定義代碼塊樣式 */

2026年2月9日 星期一

在ESP32S3使用 Adafruit_TinyUSB 建立 HID 裝置進行讀寫

Adafruit_USBD_HID usb_hid;

#define USB_VID 0xCafe
#define USB_PID 0x4011
#define USB_MANUFACTURER "ESP32S3"
#define USB_PRODUCT "ESP32 HID"

#define HID_REPORT_SIZE 64

static const uint8_t hid_report_descriptor[] = {
  0x06, 0x00, 0xFF,        // Usage Page (Vendor)
  0x09, 0x01,              // Usage
  0xA1, 0x01,              // Collection (Application)

  0x09, 0x02,
  0x15, 0x00,
  0x26, 0xFF, 0x00,
  0x75, 0x08,
  0x95, HID_REPORT_SIZE,
  0x81, 0x02,              // Input

  0x09, 0x03,
  0x15, 0x00,
  0x26, 0xFF, 0x00,
  0x75, 0x08,
  0x95, HID_REPORT_SIZE,
  0x91, 0x02,              // Output

  0xC0
};

uint8_t hid_rx_buffer[HID_REPORT_SIZE];
uint8_t hid_tx_buffer[HID_REPORT_SIZE];

// PC → ESP32
void hid_set_report_cb(uint8_t report_id,
                       hid_report_type_t report_type,
                       uint8_t const* buffer,
                       uint16_t bufsize)
{
 
  memcpy(hid_rx_buffer, buffer, bufsize);

  Serial.print("RX: ");
  Serial.print(bufsize);
  Serial.print("  ");
  
  for(int ii=0;ii
在setup 中的設定
  // 初始化 HID
  TinyUSBDevice.setID(USB_VID, USB_PID);
  TinyUSBDevice.setManufacturerDescriptor("MattLab");
  TinyUSBDevice.setProductDescriptor("ESP32S3 MSC+HID");

  // ---------- HID ----------
  usb_hid.setReportDescriptor(hid_report_descriptor, sizeof(hid_report_descriptor));
  usb_hid.setPollInterval(2);
  usb_hid.setReportCallback(NULL, hid_set_report_cb);
  usb_hid.begin();
ESP32 → PC 將資料存放於 hid_tx_buffer 陣列中再送出
memset(hid_tx_buffer, 0, HID_REPORT_SIZE);
usb_hid.sendReport(0, hid_tx_buffer, HID_REPORT_SIZE);

2026年2月7日 星期六

ESP32-S3 使用 Adafruit SDFAT 控制 SD card

 

移除 SDFAT 相關的程式庫

安裝 Adafruit SdFat 版本的程式庫

Adafruit SdFat - Adafruit Fork of SdFat

完整code
#include 
#include 
#include 

#define SD_MISO 37
#define SD_MOSI 35
#define SD_SCK  36
#define SD_CS   38

#define SD_FAT_TYPE 1

SPIClass spiSD(FSPI);
SdFat32 SD;

void setup() {
  Serial.begin(115200);

  delay(2000);

  pinMode(SD_CS, OUTPUT);
  digitalWrite(SD_CS, HIGH);

  spiSD.begin(SD_SCK, SD_MISO, SD_MOSI, SD_CS);

  SdSpiConfig spiConfig(
    SD_CS,
    SHARED_SPI,
    SD_SCK_MHZ(10),
    &spiSD
  );

  if (!SD.begin(spiConfig)) {
    Serial.println("SD init failed");
    while(1);
  }

  Serial.println("SD init OK");

  printCardInfo();
  listFiles();
}

void loop(){}


void printCardInfo() {
  uint32_t sizeMB = SD.card()->sectorCount() / 2048;
  Serial.print("Card size: ");
  Serial.print(sizeMB);
  Serial.println(" MB");
}


void listFiles() {
  char filename[255];
  Serial.println("\n📂 Files:");

  File32 root = SD.open("/");
  File32 file = root.openNextFile();

  while (file) {
    if (file.getName(filename, sizeof(filename))) {
      Serial.print(filename); // Successfully got the name
      Serial.print("  ");
      Serial.println(file.size());
      file = root.openNextFile();
    }
  }
}

輸出結果


2026年2月5日 星期四

SquareLine 在TextArea輸入時顯示鍵盤,未使用時隱藏鍵盤的設定

 1.選取 KEYBOARD WIDGE,並在Flags 中將 Hidden 打勾



2. 當按下鍵盤的確認鍵()就設定隱藏鍵盤

    增加 TextArea 的 EVENT,Action為MODIFY FLAG,Trigger 為READY


3. 當點選別的物件時隱藏鍵盤

    增加 TextArea 的 EVENT,Action為MODIFY FLAG,Trigger 為DEFOCUSED





SquareLine 一個鍵盤對應多個文字框 TextArea的設定方式

1. 配置版面範例,有兩個 TextArea 輸入欄位及一個Keyboard



2. 點擊TextArea,並在右下方EVENTS按下 ADD EVENT


3. Trigger 選擇 FOCUSED,Action 選擇 KEYBOARD SET TARGET 後按下 ADD 


4. Keyboard 選擇KEYBOARD WIDGE 的名稱,TextArea 選擇當下的TextArea名稱

5. 對所有文字框都重複以上步驟即可完成一個Keyboard對應多個TextArea的設定


2026年2月4日 星期三

Arduino GFX 增加 QSPI Read 功能

1. 在 Arduino_DataBus.h 中增加 virtual void read 宣告
  class Arduino_DataBus
    {
      public:
        Arduino_DataBus();
          virtual void read(uint8_t cmd, uint8_t addr, uint8_t *data, uint8_t len) = 0;
2. 在 Arduino_ESP32SPI.h 中增加 void read 宣告
  class Arduino_ESP32SPI : public Arduino_DataBus
    {
      public:
        void read(uint8_t cmd, uint8_t addr, uint8_t *data, uint8_t len);
3. 在 Arduino_ESP32QSPI.h 中增加 void read 宣告
  class Arduino_ESP32QSPI : public Arduino_DataBus
    {
      public:
        void read(uint8_t cmd, uint8_t addr, uint8_t *data, uint8_t len) override;;
4. 在 Arduino_ESP32QSPI.c 中增加 void Arduino_ESP32QSPI::read 作法
  void Arduino_ESP32QSPI::read(uint8_t cmd, uint8_t addr, uint8_t *data, uint8_t len)
{
  CS_LOW();
  
  spi_transaction_ext_t trans = {};
  trans.base.flags = SPI_TRANS_VARIABLE_CMD | SPI_TRANS_VARIABLE_ADDR | SPI_TRANS_MODE_QIO;
  trans.base.cmd = cmd;
  trans.base.addr = addr;
  trans.base.rxlength = len * 8; 
  trans.base.rx_buffer = data;

  trans.command_bits = 8;
  trans.address_bits = 8;  
  trans.dummy_bits = 8;
  
  spi_device_polling_transmit(_handle, (spi_transaction_t *)&trans);
	
  CS_HIGH();
}
  

在ESP32S3使用 Adafruit_TinyUSB 建立 HID 裝置進行讀寫

Adafruit_USBD_HID usb_hid; #define USB_VID 0xCafe #define USB_PID 0x4011 #define USB_MANUFACTURER "ESP32S3" #define USB_PRODUCT ...