feat(i18n): finish zh-CN example comments and align Strapping term with the glossary

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas RayanandClaude Sonnet 5.5 committed 2026-11-01 22:11:17 -03:00
1 parent 1d79051250
commit 2b73b57ee6
12 files changed
+84 -84

No files matched your search

+7 -7
View File
@@ -11,7 +11,7 @@ export const categoriasDiagnostico = [
nome: "供电与硬件", nome: "供电与硬件",
icone: "Zap", icone: "Zap",
cor: "amber", cor: "amber",
descricao: "Wi-Fi/BLE 射频峰值引起的电压跌落、冲突的 Strapping 引脚、电磁噪声以及 LDO 问题。", descricao: "Wi-Fi/BLE 射频峰值引起的电压跌落、冲突的 启动配置引脚、电磁噪声以及 LDO 问题。",
}, },
{ {
id: "cpu-panics", id: "cpu-panics",
@@ -128,18 +128,18 @@ else:
}, },
{ {
id: "strapping-pins", id: "strapping-pins",
titulo: "启动时 Strapping 引脚冲突", titulo: "启动时 启动配置引脚冲突",
categoria: "alimentacao", categoria: "alimentacao",
sintomas: ["bootloop", "upload-fail"], sintomas: ["bootloop", "upload-fail"],
gravidade: "严重", gravidade: "严重",
logSerial: "rst:0x1 (POWERON_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)\nflash read err, 1000\nwaiting for download", logSerial: "rst:0x1 (POWERON_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)\nflash read err, 1000\nwaiting for download",
resumo: "ESP32 无法从闪存启动固件,或意外进入下载模式,原因是某个 Strapping 引脚在复位时被强制到了错误的逻辑电平。", resumo: "ESP32 无法从闪存启动固件,或意外进入下载模式,原因是某个 启动配置引脚在复位时被强制到了错误的逻辑电平。",
causaRaiz: causaRaiz:
"在 EN/CHIP_PU 引脚拉高(上电复位)的瞬间,CPU 会对特定引脚(Strapping 引脚)的状态采样,以配置闪存电压(1.8V 或 3.3V)、启动模式(UART 下载或 SPI 闪存)和时钟输出。如果你在这些引脚上接了带上拉/下拉的传感器、继电器或 LED,微控制器读到的就是无效逻辑电平,启动随之卡住。", "在 EN/CHIP_PU 引脚拉高(上电复位)的瞬间,CPU 会对特定引脚(启动配置引脚)的状态采样,以配置闪存电压(1.8V 或 3.3V)、启动模式(UART 下载或 SPI 闪存)和时钟输出。如果你在这些引脚上接了带上拉/下拉的传感器、继电器或 LED,微控制器读到的就是无效逻辑电平,启动随之卡住。",
gambiarra: { gambiarra: {
titulo: "在代码里加延时,或每次上电都手动拔线", titulo: "在代码里加延时,或每次上电都手动拔线",
descricao: "试图在 setup() 里用软件解决问题,或依赖每次重启前手动断开连线。", descricao: "试图在 setup() 里用软件解决问题,或依赖每次重启前手动断开连线。",
consequencia: "没用:Strapping 引脚由硬件读取,此时 CPU 还没有加载你的代码或引导加载程序中的任何一行。", consequencia: "没用:启动配置引脚由硬件读取,此时 CPU 还没有加载你的代码或引导加载程序中的任何一行。",
}, },
solucaoEngenharia: { solucaoEngenharia: {
titulo: "安全的 GPIO 分配与复位期间隔离", titulo: "安全的 GPIO 分配与复位期间隔离",
@@ -734,10 +734,10 @@ export const regrasDecodificadorLog = [
}, },
{ {
padrao: /rst:0x1 \(POWERON_RESET\),boot:0x[0-9a-fA-F]+/i, padrao: /rst:0x1 \(POWERON_RESET\),boot:0x[0-9a-fA-F]+/i,
titulo: "上电复位 / Strapping 引脚", titulo: "上电复位 / 启动配置引脚",
tipo: "硬件 / 启动", tipo: "硬件 / 启动",
explicacao: explicacao:
"微控制器重启并报告了 Strapping 引脚寄存器。如果之后卡住,可能是某个启动引脚处于错误的逻辑电平。", "微控制器重启并报告了 启动配置引脚寄存器。如果之后卡住,可能是某个启动引脚处于错误的逻辑电平。",
acaoRecomendada: acaoRecomendada:
"检查 GPIO 0、2、12、15(ESP32)或 8、9(C3)是否连着在启动时会强制出错误电平的电阻或外设。", "检查 GPIO 0、2、12、15(ESP32)或 8、9(C3)是否连着在启动时会强制出错误电平的电阻或外设。",
}, },
+3 -3
View File
@@ -116,7 +116,7 @@ export const categoriasGlossario = [
{ {
termo: "启动 ROM", termo: "启动 ROM",
definicao: "乐鑫在出厂时永久写入的只读存储器,包含一级引导加载程序(First-Stage Bootloader)、数学表和基础初始化例程,永远无法修改。", definicao: "乐鑫在出厂时永久写入的只读存储器,包含一级引导加载程序(First-Stage Bootloader)、数学表和基础初始化例程,永远无法修改。",
exemplo: "上电后 ROM 最先运行,检查 Strapping 引脚,然后从闪存加载用户的引导加载程序。", exemplo: "上电后 ROM 最先运行,检查 启动配置引脚,然后从闪存加载用户的引导加载程序。",
}, },
{ {
termo: "SPI 闪存(Quad-SPI 与 Octal-SPI)", termo: "SPI 闪存(Quad-SPI 与 Octal-SPI)",
@@ -206,7 +206,7 @@ export const categoriasGlossario = [
icone: "Sliders", icone: "Sliders",
emoji: "🔌", emoji: "🔌",
cor: "amber", cor: "amber",
descricao: "GPIO 引脚、Strapping 引脚、ADC/DAC 转换器、PWM/LEDC、MCPWM、RMT、PCNT、TWAI®/CAN、I2C、SPI 与 I2S。", descricao: "GPIO 引脚、启动配置引脚、ADC/DAC 转换器、PWM/LEDC、MCPWM、RMT、PCNT、TWAI®/CAN、I2C、SPI 与 I2S。",
termos: [ termos: [
{ {
termo: "GPIO(通用输入输出)", termo: "GPIO(通用输入输出)",
@@ -214,7 +214,7 @@ export const categoriasGlossario = [
exemplo: "用 `gpio_set_level()` 或 `digitalWrite()` 读取按键、控制继电器和 LED。", exemplo: "用 `gpio_set_level()` 或 `digitalWrite()` 读取按键、控制继电器和 LED。",
}, },
{ {
termo: "Strapping 引脚", termo: "启动配置引脚(Strapping)",
definicao: "特定的 GPIO 引脚,芯片在复位释放的那一毫秒由硬件采样,以决定启动模式(UART 下载与 SPI 闪存启动)和电压电平。", definicao: "特定的 GPIO 引脚,芯片在复位释放的那一毫秒由硬件采样,以决定启动模式(UART 下载与 SPI 闪存启动)和电压电平。",
exemplo: "经典 ESP32/S3 的 GPIO 0 或 ESP32-C3 的 GPIO 9:复位期间若被拉低,芯片会进入固件烧录模式。", exemplo: "经典 ESP32/S3 的 GPIO 0 或 ESP32-C3 的 GPIO 9:复位期间若被拉低,芯片会进入固件烧录模式。",
}, },
+10 -10
View File
@@ -1,8 +1,8 @@
/* /*
* Exemplo ESP-IoT-Solution para ESP32 * 面向 ESP32 的 ESP-IoT-Solution 示例
* Inicialização de Botão Inteligente com Callbacks e Driver de Display/Sensores * 智能按键初始化,包含回调和显示屏/传感器驱动
* *
* Dependência (idf_component.yml): * 依赖(idf_component.yml):
* espressif/button: "^3.3.0" * espressif/button: "^3.3.0"
* espressif/led_indicator: "^1.2.0" * espressif/led_indicator: "^1.2.0"
*/ */
@@ -16,19 +16,19 @@
static const char *TAG = "iot_solution_app"; static const char *TAG = "iot_solution_app";
#define BUTTON_GPIO_NUM 0 // Botão BOOT nativo #define BUTTON_GPIO_NUM 0 // 原生 BOOT 按键
#define LED_INDICATOR_GPIO 2 // LED indicador #define LED_INDICATOR_GPIO 2 // 指示 LED
static led_indicator_handle_t led_handle = NULL; static led_indicator_handle_t led_handle = NULL;
/* Callback para clique único do botão */ /* 按键单击回调 */
static void button_single_click_cb(void *arg, void *data) static void button_single_click_cb(void *arg, void *data)
{ {
ESP_LOGI(TAG, "Evento: Clique Único detectado!"); ESP_LOGI(TAG, "Evento: Clique Único detectado!");
led_indicator_start(led_handle, BLINK_DOUBLE_FAST); led_indicator_start(led_handle, BLINK_DOUBLE_FAST);
} }
/* Callback para clique longo (> 3 segundos) */ /* 长按回调(> 3 秒) */
static void button_long_press_cb(void *arg, void *data) static void button_long_press_cb(void *arg, void *data)
{ {
ESP_LOGW(TAG, "Evento: Pressionamento Longo! Acionando modo de reset de fábrica."); ESP_LOGW(TAG, "Evento: Pressionamento Longo! Acionando modo de reset de fábrica.");
@@ -39,14 +39,14 @@ void app_main(void)
{ {
ESP_LOGI(TAG, "Iniciando ESP-IoT-Solution Component Suite"); ESP_LOGI(TAG, "Iniciando ESP-IoT-Solution Component Suite");
// 1. Configuração do LED Indicator // 1. LED Indicator 配置
led_indicator_gpio_config_t led_cfg = { led_indicator_gpio_config_t led_cfg = {
.is_active_level_high = true, .is_active_level_high = true,
.gpio_num = LED_INDICATOR_GPIO, .gpio_num = LED_INDICATOR_GPIO,
}; };
led_handle = led_indicator_create(&led_cfg); led_handle = led_indicator_create(&led_cfg);
// 2. Configuração do Botão com debounce de hardware/software automático // 2. 按键配置,自动进行硬件/软件消抖
button_config_t btn_cfg = { button_config_t btn_cfg = {
.type = BUTTON_TYPE_GPIO, .type = BUTTON_TYPE_GPIO,
.long_press_time = 3000, .long_press_time = 3000,
@@ -60,7 +60,7 @@ void app_main(void)
button_handle_t btn_handle = iot_button_create(&btn_cfg); button_handle_t btn_handle = iot_button_create(&btn_cfg);
assert(btn_handle != NULL); assert(btn_handle != NULL);
// Registra callbacks para diferentes gestos // 为不同手势注册回调
iot_button_register_cb(btn_handle, BUTTON_SINGLE_CLICK, button_single_click_cb, NULL); iot_button_register_cb(btn_handle, BUTTON_SINGLE_CLICK, button_single_click_cb, NULL);
iot_button_register_cb(btn_handle, BUTTON_LONG_PRESS_START, button_long_press_cb, NULL); iot_button_register_cb(btn_handle, BUTTON_LONG_PRESS_START, button_long_press_cb, NULL);
+3 -3
View File
@@ -26,18 +26,18 @@ void app_event_cb(const esp_matter_event_t *event)
void app_main(void) void app_main(void)
{ {
// Inicializa NVS // 初始化 NVS
esp_err_t err = nvs_flash_init(); esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase()); ESP_ERROR_CHECK(nvs_flash_erase());
ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(nvs_flash_init());
} }
// Inicializa o Matter node // 初始化 Matter 节点
esp_matter::node_t *node = esp_matter::node::create(NULL, app_event_cb); esp_matter::node_t *node = esp_matter::node::create(NULL, app_event_cb);
esp_matter::endpoint_t *endpoint = esp_matter::endpoint::create(node, ESP_MATTER_ENDPOINT_TYPE_ON_OFF_LIGHT); esp_matter::endpoint_t *endpoint = esp_matter::endpoint::create(node, ESP_MATTER_ENDPOINT_TYPE_ON_OFF_LIGHT);
// Inicia o stack Matter // 启动 Matter 协议栈
ESP_ERROR_CHECK(esp_matter::start(node)); ESP_ERROR_CHECK(esp_matter::start(node));
ESP_LOGI(TAG, "Dispositivo Matter iniciado. Aguardando comissionamento..."); ESP_LOGI(TAG, "Dispositivo Matter iniciado. Aguardando comissionamento...");
+6 -6
View File
@@ -15,29 +15,29 @@ void print_array(const char *label, int16_t *array, int size) {
void app_main(void) void app_main(void)
{ {
// Vetor de entrada (ex: saída de uma camada anterior) // 输入向量(例如上一层的输出)
int16_t input[INPUT_SIZE] = {1, 2, 3, 4}; int16_t input[INPUT_SIZE] = {1, 2, 3, 4};
// Pesos da camada densa (3x4) // 全连接层权重(3x4)
int8_t weights[OUTPUT_SIZE * INPUT_SIZE] = { int8_t weights[OUTPUT_SIZE * INPUT_SIZE] = {
1, -1, 2, 0, 1, -1, 2, 0,
0, 1, -1, 1, 0, 1, -1, 1,
2, 0, 1, -2 2, 0, 1, -2
}; };
// Bias de cada neurônio // 每个神经元的偏置
int16_t bias[OUTPUT_SIZE] = {10, -5, 0}; int16_t bias[OUTPUT_SIZE] = {10, -5, 0};
// Saída // 输出
int16_t output[OUTPUT_SIZE]; int16_t output[OUTPUT_SIZE];
// Multiplicação da matriz: output = weights * input + bias // 矩阵乘法:output = weights * input + bias
esp_nn_mul_mat_16x8_16(weights, input, bias, output, esp_nn_mul_mat_16x8_16(weights, input, bias, output,
OUTPUT_SIZE, INPUT_SIZE, /*shift=*/0); OUTPUT_SIZE, INPUT_SIZE, /*shift=*/0);
print_array("Antes da ReLU", output, OUTPUT_SIZE); print_array("Antes da ReLU", output, OUTPUT_SIZE);
// Aplicar função de ativação ReLU // 应用 ReLU 激活函数
esp_nn_relu_16(output, OUTPUT_SIZE); esp_nn_relu_16(output, OUTPUT_SIZE);
print_array("Depois da ReLU", output, OUTPUT_SIZE); print_array("Depois da ReLU", output, OUTPUT_SIZE);
+10 -10
View File
@@ -1,8 +1,8 @@
/* /*
* Exemplo ESP-NOW para ESP32 * 面向 ESP32 的 ESP-NOW 示例
* Comunicação Sem Fio Ponto-a-Ponto e Broadcast sem roteador Wi-Fi * 无需 Wi-Fi 路由器的点对点无线通信和广播
* *
* Protocolo nativo integrado no ESP-IDF * ESP-IDF 内置的原生协议
*/ */
#include <stdio.h> #include <stdio.h>
@@ -16,7 +16,7 @@
static const char *TAG = "esp_now_demo"; static const char *TAG = "esp_now_demo";
// Estrutura de dados enviada no pacote // 数据包中发送的数据结构
typedef struct { typedef struct {
uint32_t sensor_id; uint32_t sensor_id;
float temperatura; float temperatura;
@@ -24,16 +24,16 @@ typedef struct {
uint32_t tempo_ms; uint32_t tempo_ms;
} __attribute__((packed)) dados_pacote_t; } __attribute__((packed)) dados_pacote_t;
// Endereço MAC de Broadcast (envia para todos os nós ESP-NOW por perto) // 广播 MAC 地址(发送给附近所有 ESP-NOW 节点)
static const uint8_t broadcast_mac[ESP_NOW_ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; static const uint8_t broadcast_mac[ESP_NOW_ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
/* Callback executado ao enviar um pacote */ /* 发送数据包时执行的回调 */
static void on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status) static void on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status)
{ {
ESP_LOGI(TAG, "Envio concluído: %s", status == ESP_NOW_SEND_SUCCESS ? "SUCESSO (ACK)" : "FALHA"); ESP_LOGI(TAG, "Envio concluído: %s", status == ESP_NOW_SEND_SUCCESS ? "SUCESSO (ACK)" : "FALHA");
} }
/* Callback executado ao receber um pacote de outro ESP32 */ /* 接收其他 ESP32 数据包时执行的回调 */
static void on_data_recv(const esp_now_recv_info_t *recv_info, const uint8_t *data, int len) static void on_data_recv(const esp_now_recv_info_t *recv_info, const uint8_t *data, int len)
{ {
if (len == sizeof(dados_pacote_t)) { if (len == sizeof(dados_pacote_t)) {
@@ -47,7 +47,7 @@ static void on_data_recv(const esp_now_recv_info_t *recv_info, const uint8_t *da
void app_main(void) void app_main(void)
{ {
// Inicializa NVS e Wi-Fi em modo Station // 以 Station 模式初始化 NVS 和 Wi-Fi
nvs_flash_init(); nvs_flash_init();
esp_netif_init(); esp_netif_init();
esp_event_loop_create_default(); esp_event_loop_create_default();
@@ -56,12 +56,12 @@ void app_main(void)
esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_start(); esp_wifi_start();
// Inicializa o protocolo ESP-NOW // 初始化 ESP-NOW 协议
ESP_ERROR_CHECK(esp_now_init()); ESP_ERROR_CHECK(esp_now_init());
esp_now_register_send_cb(on_data_sent); esp_now_register_send_cb(on_data_sent);
esp_now_register_recv_cb(on_data_recv); esp_now_register_recv_cb(on_data_recv);
// Registra o peer de Broadcast // 注册广播对端
esp_now_peer_info_t peer_info = { esp_now_peer_info_t peer_info = {
.channel = 1, .channel = 1,
.ifidx = WIFI_IF_STA, .ifidx = WIFI_IF_STA,
+13 -13
View File
@@ -1,8 +1,8 @@
/* /*
* Exemplo ESP-RainMaker para ESP32 * 面向 ESP32 的 ESP-RainMaker 示例
* Dispositivo: Interruptor Inteligente com controle via App e Nuvem * 设备:可通过应用和云端控制的智能开关
* *
* Dependência (idf_component.yml): * 依赖(idf_component.yml):
* espressif/esp_rainmaker: "^1.4.0" * espressif/esp_rainmaker: "^1.4.0"
*/ */
@@ -21,7 +21,7 @@
static const char *TAG = "app_rainmaker"; static const char *TAG = "app_rainmaker";
static esp_rmaker_device_t *switch_device; static esp_rmaker_device_t *switch_device;
/* Callback acionado quando o usuário altera o estado no App móvel */ /* 用户在移动应用中更改状态时触发的回调 */
static esp_err_t write_cb(const esp_rmaker_device_t *dev, const esp_rmaker_param_val_t val, void *priv_data, esp_rmaker_write_ctx_t *ctx) static esp_err_t write_cb(const esp_rmaker_device_t *dev, const esp_rmaker_param_val_t val, void *priv_data, esp_rmaker_write_ctx_t *ctx)
{ {
if (ctx) { if (ctx) {
@@ -31,14 +31,14 @@ static esp_err_t write_cb(const esp_rmaker_device_t *dev, const esp_rmaker_param
bool state = val.val.b; bool state = val.val.b;
ESP_LOGI(TAG, "Estado do interruptor alterado para: %s", state ? "LIGADO" : "DESLIGADO"); ESP_LOGI(TAG, "Estado do interruptor alterado para: %s", state ? "LIGADO" : "DESLIGADO");
// Atualiza o parâmetro na nuvem e no aplicativo // 更新云端和应用中的参数
esp_rmaker_param_update_and_report(priv_data, val); esp_rmaker_param_update_and_report(priv_data, val);
return ESP_OK; return ESP_OK;
} }
void app_main(void) void app_main(void)
{ {
// Inicialização da memória não-volátil (NVS) // 初始化非易失性存储(NVS)
esp_err_t err = nvs_flash_init(); esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase()); ESP_ERROR_CHECK(nvs_flash_erase());
@@ -46,30 +46,30 @@ void app_main(void)
} }
ESP_ERROR_CHECK(err); ESP_ERROR_CHECK(err);
// Inicializa o provisionamento Wi-Fi // 初始化 Wi-Fi 配网
app_wifi_init(); app_wifi_init();
// Configura o nó RainMaker // 配置 RainMaker 节点
esp_rmaker_config_t rainmaker_cfg = { esp_rmaker_config_t rainmaker_cfg = {
.enable_time_sync = true, .enable_time_sync = true,
}; };
esp_rmaker_node_t *node = esp_rmaker_node_init(&rainmaker_cfg, "ESP32_SmartSwitch", "Switch"); esp_rmaker_node_t *node = esp_rmaker_node_init(&rainmaker_cfg, "ESP32_SmartSwitch", "Switch");
// Cria o dispositivo padrão 'Switch' // 创建默认的 'Switch' 设备
switch_device = esp_rmaker_switch_device_create("Luz Sala", NULL, true); switch_device = esp_rmaker_switch_device_create("Luz Sala", NULL, true);
// Registra callback de escrita // 注册写回调
esp_rmaker_device_add_cb(switch_device, write_cb, NULL); esp_rmaker_device_add_cb(switch_device, write_cb, NULL);
esp_rmaker_node_add_device(node, switch_device); esp_rmaker_node_add_device(node, switch_device);
// Habilita serviços adicionais (OTA e Timezone) // 启用附加服务(OTA 和时区)
esp_rmaker_ota_enable_default(); esp_rmaker_ota_enable_default();
esp_rmaker_timezone_service_enable(); esp_rmaker_timezone_service_enable();
// Inicia o agente RainMaker // 启动 RainMaker 代理
esp_rmaker_start(); esp_rmaker_start();
// Inicia o provisionamento Wi-Fi via BLE (abre no app oficial RainMaker) // 通过 BLE 启动 Wi-Fi 配网(在官方 RainMaker 应用中打开)
app_wifi_start(POP_TYPE_RANDOM); app_wifi_start(POP_TYPE_RANDOM);
ESP_LOGI(TAG, "Nó RainMaker pronto! Escaneie o QR Code no app ESP RainMaker."); ESP_LOGI(TAG, "Nó RainMaker pronto! Escaneie o QR Code no app ESP RainMaker.");
+10 -10
View File
@@ -1,8 +1,8 @@
/* /*
* Exemplo ESP-SR para ESP32-S3 / ESP32-P4 * 面向 ESP32-S3 / ESP32-P4 的 ESP-SR 示例
* Reconhecimento de Fala Local Offline (WakeNet + MultiNet) * 离线本地语音识别(WakeNet + MultiNet)
* *
* Dependência (idf_component.yml): * 依赖(idf_component.yml):
* espressif/esp-sr: "^1.5.0" * espressif/esp-sr: "^1.5.0"
*/ */
@@ -27,7 +27,7 @@ void feed_audio_task(void *arg)
int16_t *feed_buff = (int16_t *)malloc(audio_chunksize * sizeof(int16_t) * 2); int16_t *feed_buff = (int16_t *)malloc(audio_chunksize * sizeof(int16_t) * 2);
while (1) { while (1) {
// Leitura de áudio I2S dos microfones da placa // 从开发板麦克风读取 I2S 音频
// i2s_read(I2S_NUM_0, feed_buff, ...); // i2s_read(I2S_NUM_0, feed_buff, ...);
afe_handle->feed(afe_data, feed_buff); afe_handle->feed(afe_data, feed_buff);
@@ -42,7 +42,7 @@ void speech_recognition_task(void *arg)
esp_afe_sr_data_t *afe_data = (esp_afe_sr_data_t *)arg; esp_afe_sr_data_t *afe_data = (esp_afe_sr_data_t *)arg;
const esp_afe_sr_iface_t *afe_handle = &ESP_AFE_SR_HANDLE; const esp_afe_sr_iface_t *afe_handle = &ESP_AFE_SR_HANDLE;
// Inicializa o modelo de comandos de fala (MultiNet) // 初始化语音命令模型(MultiNet)
const esp_mn_iface_t *multinet = &ESP_MN_HANDLE; const esp_mn_iface_t *multinet = &ESP_MN_HANDLE;
model_iface_data_t *model_data = multinet->create(&MULTINET_MODEL, 6000); model_iface_data_t *model_data = multinet->create(&MULTINET_MODEL, 6000);
@@ -54,12 +54,12 @@ void speech_recognition_task(void *arg)
continue; continue;
} }
// 1. Verificação de Wake Word (Palavra de ativação) // 1. 唤醒词(Wake Word)检测
if (res->wake_word_detected == WAKENET_DETECTED) { if (res->wake_word_detected == WAKENET_DETECTED) {
ESP_LOGW(TAG, ">>> PALAVRA-CHAVE DETECTADA! Canal de escuta aberto."); ESP_LOGW(TAG, ">>> PALAVRA-CHAVE DETECTADA! Canal de escuta aberto.");
} }
// 2. Reconhecimento de comando local // 2. 本地命令识别
if (res->raw_data_size > 0) { if (res->raw_data_size > 0) {
esp_mn_state_t mn_state = multinet->detect(model_data, res->data); esp_mn_state_t mn_state = multinet->detect(model_data, res->data);
@@ -67,7 +67,7 @@ void speech_recognition_task(void *arg)
esp_mn_results_t *mn_res = multinet->get_results(model_data); esp_mn_results_t *mn_res = multinet->get_results(model_data);
ESP_LOGI(TAG, ">>> COMANDO RECONHECIDO: ID #%d (Frase correspondente)", mn_res->command_id[0]); ESP_LOGI(TAG, ">>> COMANDO RECONHECIDO: ID #%d (Frase correspondente)", mn_res->command_id[0]);
// Exemplo de ação // 操作示例
if (mn_res->command_id[0] == 1) { if (mn_res->command_id[0] == 1) {
ESP_LOGI(TAG, "Ação: Ligar Luz da Sala"); ESP_LOGI(TAG, "Ação: Ligar Luz da Sala");
} else if (mn_res->command_id[0] == 2) { } else if (mn_res->command_id[0] == 2) {
@@ -85,14 +85,14 @@ void app_main(void)
{ {
ESP_LOGI(TAG, "Iniciando ESP-SR Speech Recognition Engine"); ESP_LOGI(TAG, "Iniciando ESP-SR Speech Recognition Engine");
// Configura o pipeline de Audio Front-End (AEC, BSS, VAD, WakeNet) // 配置音频前端流水线(AEC、BSS、VAD、WakeNet)
afe_config_t afe_config = AFE_CONFIG_DEFAULT(); afe_config_t afe_config = AFE_CONFIG_DEFAULT();
afe_config.wakenet_init = true; afe_config.wakenet_init = true;
afe_config.voice_communication_init = false; afe_config.voice_communication_init = false;
esp_afe_sr_data_t *afe_data = ESP_AFE_SR_HANDLE.create_from_config(&afe_config); esp_afe_sr_data_t *afe_data = ESP_AFE_SR_HANDLE.create_from_config(&afe_config);
// Cria as tarefas de alimentação de áudio e reconhecimento // 创建音频输入和识别任务
xTaskCreatePinnedToCore(feed_audio_task, "feed_task", 4096, afe_data, 5, NULL, 0); xTaskCreatePinnedToCore(feed_audio_task, "feed_task", 4096, afe_data, 5, NULL, 0);
xTaskCreatePinnedToCore(speech_recognition_task, "sr_task", 8192, afe_data, 5, NULL, 1); xTaskCreatePinnedToCore(speech_recognition_task, "sr_task", 8192, afe_data, 5, NULL, 1);
} }
+2 -2
View File
@@ -4,7 +4,7 @@
#include "human_face_detect_msr01.hpp" #include "human_face_detect_msr01.hpp"
#include "human_face_detect_mnp01.hpp" #include "human_face_detect_mnp01.hpp"
#define CAMERA_MODEL_AI_THINKER // ou o modelo da sua placa #define CAMERA_MODEL_AI_THINKER // 或你的开发板型号
#include "camera_pins.h" #include "camera_pins.h"
@@ -52,7 +52,7 @@ void loop() {
return; return;
} }
// Detecta rostos na imagem // 检测图像中的人脸
box_array_t *faces = face_detect_msr01(fb->buf, fb->width, fb->height, fb->format); box_array_t *faces = face_detect_msr01(fb->buf, fb->width, fb->height, fb->format);
if (faces) { if (faces) {
Serial.printf("Rostos detectados: %d\n", faces->len); Serial.printf("Rostos detectados: %d\n", faces->len);
+10 -10
View File
@@ -1,8 +1,8 @@
/* /*
* Exemplo ESP-Zigbee-SDK para ESP32-H2 e ESP32-C6 (IEEE 802.15.4) * 面向 ESP32-H2 和 ESP32-C6 的 ESP-Zigbee-SDK 示例(IEEE 802.15.4)
* Dispositivo: Lâmpada Inteligente Zigbee 3.0 (Home Automation End Device) * 设备:Zigbee 3.0 智能灯(Home Automation End Device)
* *
* Dependência (idf_component.yml): * 依赖(idf_component.yml):
* espressif/esp-zigbee-lib: "^1.6.0" * espressif/esp-zigbee-lib: "^1.6.0"
*/ */
@@ -16,9 +16,9 @@
static const char *TAG = "zigbee_light_device"; static const char *TAG = "zigbee_light_device";
#define HA_ESP_LIGHT_ENDPOINT 1 #define HA_ESP_LIGHT_ENDPOINT 1
#define ESP_ZB_PRIMARY_CHANNEL_MASK (1l << 15) // Canal 15 padrão Zigbee #define ESP_ZB_PRIMARY_CHANNEL_MASK (1l << 15) // Zigbee 默认信道 15
/* Callback de escrita em atributos Zigbee (ex: Liga/Desliga via Home Assistant) */ /* Zigbee 属性写入回调(例如通过 Home Assistant 开关) */
static esp_err_t zb_attribute_handler(const esp_zb_zcl_set_attr_value_message_t *message) static esp_err_t zb_attribute_handler(const esp_zb_zcl_set_attr_value_message_t *message)
{ {
if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) { if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) {
@@ -31,7 +31,7 @@ static esp_err_t zb_attribute_handler(const esp_zb_zcl_set_attr_value_message_t
return ESP_OK; return ESP_OK;
} }
/* Callback de eventos da pilha Zigbee */ /* Zigbee 协议栈事件回调 */
void esp_zb_app_signal_handler(esp_zb_app_signal_msg_t *signal_msg) void esp_zb_app_signal_handler(esp_zb_app_signal_msg_t *signal_msg)
{ {
uint32_t *p_sg_p = signal_msg->p_app_signal; uint32_t *p_sg_p = signal_msg->p_app_signal;
@@ -58,7 +58,7 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_msg_t *signal_msg)
static void esp_zb_task(void *pvParameters) static void esp_zb_task(void *pvParameters)
{ {
// Configura nó Zigbee como End Device // 将 Zigbee 节点配置为 End Device
esp_zb_cfg_t zb_nwk_cfg = { esp_zb_cfg_t zb_nwk_cfg = {
.esp_zb_role = ESP_ZB_DEVICE_TYPE_ED, .esp_zb_role = ESP_ZB_DEVICE_TYPE_ED,
.install_code_policy = false, .install_code_policy = false,
@@ -69,11 +69,11 @@ static void esp_zb_task(void *pvParameters)
}; };
esp_zb_init(&zb_nwk_cfg); esp_zb_init(&zb_nwk_cfg);
// Cria o cluster de On/Off de iluminação residencial // 创建住宅照明 On/Off 集群
esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG(); esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG();
esp_zb_ep_list_t *ep_list = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &light_cfg); esp_zb_ep_list_t *ep_list = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &light_cfg);
// Registra endpoint e manipulador de atributos // 注册端点和属性处理程序
esp_zb_device_register(ep_list); esp_zb_device_register(ep_list);
esp_zb_core_action_handler_register(zb_attribute_handler); esp_zb_core_action_handler_register(zb_attribute_handler);
@@ -86,7 +86,7 @@ void app_main(void)
{ {
ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(nvs_flash_init());
// Inicializa a pilha de rádio IEEE 802.15.4 // 初始化 IEEE 802.15.4 射频协议栈
esp_zb_platform_config_t config = { esp_zb_platform_config_t config = {
.radio_config = { .radio_mode = ZB_RADIO_MODE_NATIVE }, .radio_config = { .radio_mode = ZB_RADIO_MODE_NATIVE },
.host_config = { .host_connection_mode = ZB_HOST_CONNECTION_MODE_NONE }, .host_config = { .host_connection_mode = ZB_HOST_CONNECTION_MODE_NONE },
+5 -5
View File
@@ -1,11 +1,11 @@
from machine import Pin from machine import Pin
from time import sleep from time import sleep
# Define o pino 2 como saída (geralmente o LED embutido) # 将引脚 2 定义为输出(通常是板载 LED)
led = Pin(2, Pin.OUT) led = Pin(2, Pin.OUT)
while True: while True:
led.value(1) # Liga o LED led.value(1) # 点亮 LED
sleep(0.5) # Aguarda 0,5 segundos sleep(0.5) # 等待 0.5 秒
led.value(0) # Desliga o LED led.value(0) # 关闭 LED
sleep(0.5) # Aguarda 0,5 segundos sleep(0.5) # 等待 0.5 秒
+5 -5
View File
@@ -1,5 +1,5 @@
//! Exemplo Rust no ESP32 usando `esp-hal` (Modo Bare-Metal / no_std) //! 使用 `esp-hal` 在 ESP32 上运行 Rust 的示例(裸机 / no_std 模式)
//! Pisca um LED e envia mensagens via UART Serial com segurança de memória garantida. //! 闪烁 LED 并通过 UART 串口发送消息,同时提供内存安全保障。
//! //!
//! Cargo.toml: //! Cargo.toml:
//! esp-hal = { version = "0.22", features = ["esp32s3"] } //! esp-hal = { version = "0.22", features = ["esp32s3"] }
@@ -22,12 +22,12 @@ use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
// Inicializa periféricos do SoC com verificação em tempo de compilação // 在编译期检查的前提下初始化 SoC 外设
let peripherals = Peripherals::take(); let peripherals = Peripherals::take();
let system = SystemControl::new(peripherals.SYSTEM); let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze(); let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
// Configura os pinos de E/S // 配置 I/O 引脚
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
let mut led = Output::new(io.pins.gpio2, Level::Low); let mut led = Output::new(io.pins.gpio2, Level::Low);
@@ -38,7 +38,7 @@ fn main() -> ! {
let mut counter: u32 = 0; let mut counter: u32 = 0;
loop { loop {
// Inverte estado do LED com garantia de exclusão mútua // 在保证互斥的前提下翻转 LED 状态
led.toggle(); led.toggle();
counter += 1; counter += 1;