🧪 新教程持续更新中 · 从机械臂到传感器,跟着教程从零搭建
跳到主要内容

第 7 章:二维码扫描

淘宝店铺

本章目标:让 NanoCam 扫描二维码/条形码,把解码结果输出到串口与网页画面。

原理

使用 esp-code-scanner 预编译库实时解码画面中的二维码(QR Code / Barcode)。摄像头输出的 RGB565 帧直接传给扫描器,无需灰度转换。每帧创建全新扫描器对象,扫完即销毁,避免内部状态累积。

解码结果同时通过:

  1. 串口日志输出

  2. 共享缓冲区 g_last_code 保存最新结果,供 HTTP/MJPEG 流叠加显示

  3. 网页画面底部叠加绿色文字标注

步骤

7.1 切换模式

Plain
ai_mode:5

完整指令见串口协议手册

7.2 扫码

将二维码放在摄像头前,串口输出:

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

同时网页画面 http://<IP>/ 底部出现绿色文字标注解码内容。

7.3 连续扫码

对准下一个码自动解码输出,扫描器每帧重建,可连续工作不崩溃。

代码

核心扫描逻辑

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);

效果

对准二维码→串口输出解码内容 + 网页画面叠加显示。

下一章:第 8 章:人脸识别