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:
1 parent
1d79051250
commit
2b73b57ee6
12 files changed
+84
-84
No files matched your search
@@ -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)是否连着在启动时会强制出错误电平的电阻或外设。",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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:复位期间若被拉低,芯片会进入固件烧录模式。",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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...");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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.");
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -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 秒
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user