🧪 Novos tutoriais em andamento — do braço robótico ao sensor
Ir para o conteúdo
Compre este produtoLoja oficialSite oficial

Capítulo 7: Leitura de código QR

Comprar na loja

Objetivo do capítulo: fazer o NanoCam ler códigos QR/códigos de barras e enviar o resultado decodificado para a porta serial e para a imagem da página web.

Princípio

Usa a biblioteca pré-compilada esp-code-scanner para decodificar em tempo real códigos QR (QR Code / Barcode) na imagem. O quadro RGB565 da câmera é enviado diretamente ao scanner, sem conversão para escala de cinza. A cada quadro um novo objeto scanner é criado e destruído em seguida, evitando acúmulo de estado interno.

O resultado da decodificação é disponibilizado simultaneamente por:

  1. Log na porta serial

  2. Buffer compartilhado g_last_code, que guarda o resultado mais recente para sobreposição no fluxo HTTP/MJPEG

  3. Sobreposição de texto verde na parte inferior da imagem da página web

Passos

7.1 Alternar o modo

Plain
ai_mode:5

Consulte o manual do protocolo serial para todos os comandos.

7.2 Ler o código

Coloque o código QR diante da câmera; a porta serial exibe:

Plain
I (xxxxx) qrcode: Decoded [QR-Code]: https://example.com

Ao mesmo tempo, um texto verde com o conteúdo decodificado aparece na parte inferior da imagem da página http://<IP>/.

7.3 Leitura contínua

Aponte para o próximo código e a decodificação é feita automaticamente; o scanner é recriado a cada quadro, funcionando continuamente sem travar.

Código

Lógica central de leitura

main/ai/nano_qrcode.cpp:

C++
// 每帧创建全新扫描器对象
esp_image_scanner_t *scn = esp_code_scanner_create();
esp_code_scanner_config_t cfg = {
    ESP_CODE_SCANNER_MODE_FAST,
    ESP_CODE_SCANNER_IMAGE_RGB565,
    fb->width, fb->height
};
esp_code_scanner_set_config(scn, cfg);
int count = esp_code_scanner_scan_image(scn, fb->buf);
// 解码成功
const esp_code_scanner_symbol_t result = esp_code_scanner_result(scn);
ESP_LOGI(TAG, "Decoded [%s]: %s", result.type_name, result.data);
// 保存到共享缓冲区供网页叠加
snprintf(g_last_code, sizeof(g_last_code), "%s: %s",
         result.type_name, result.data);
esp_code_scanner_destroy(scn);

Resultado

Aponte para o código QR → conteúdo decodificado na porta serial + sobreposição na imagem da página web.

Próximo capítulo: Capítulo 8: Reconhecimento facial