Сканер QR-кодов на ESP32-CAM (Arduino IDE)

Перевод статьи ESP32-CAM QR Code Reader/Scanner (Arduino IDE) — Rui Santos & Sara Santos, Random Nerd Tutorials.
Из этого руководства вы узнаете, как собрать сканер (или, если угодно, считыватель) QR-кодов на плате ESP32-CAM и запрограммировать его из Arduino IDE. ESP32-CAM непрерывно использует камеру, чтобы искать новые QR-коды: за это отвечает библиотека ESP32QRCodeReader и доработанная версия библиотеки quirc. Как только плата находит корректный QR-код, она выводит его содержимое в монитор порта.
Обзор проекта#
Коротко о том, как всё работает.

ESP32-CAM постоянно сканирует новые QR-коды и выводит их данные в монитор порта.
- ESP32-CAM постоянно сканирует новые QR-коды.
- Обнаружив корректный QR-код, плата выводит его содержимое в монитор порта Arduino IDE.
Такой проект пригодится для системы контроля посещаемости по билетам, для отслеживания товаров, в роли системы доступа (проверять QR-коды, чтобы открывать двери или ячейки шкафчиков) и для множества других задач.
Что понадобится#
Мы возьмём плату ESP32-CAM в исполнении модуля AI-Thinker, но подойдут и другие модули — достаточно правильно назначить пины в коде. Ещё один пример — плата Freenove ESP32-Wrover CAM.
Плата ESP32-CAM — это устройство за $9 (или дешевле), в котором объединены чип ESP32-S, камера OV2640, слот для карты microSD и несколько выводов GPIO.

ESP32-CAM за $9: чип ESP32-S, камера OV2640, слот microSD и несколько GPIO.
Чтобы повторить проект, вам нужны следующие компоненты:
- ESP32-CAM с камерой OV2640 — см. подборку Best ESP32-CAM Dev Boards (либо любая другая ESP32-CAM с камерой OV2640);
- программатор ESP32-CAM-MB на micro-USB (рекомендуется) или FTDI-программатор.
Для знакомства с ESP32-CAM пригодятся отдельные руководства:
- ESP32-CAM Video Streaming and Face Recognition with Arduino IDE
- ESP32-CAM AI-Thinker Pinout Guide: GPIOs Usage Explained
- ESP32-CAM Troubleshooting Guide
Подготовка Arduino IDE#
Программировать плату ESP32 мы будем из Arduino IDE. Значит, у вас должна быть установлена сама Arduino IDE, а к ней — дополнение для ESP32. Если ещё не ставили, начните с этого руководства:
Установка библиотеки ESP32QRCodeReader#
В этом руководстве мы используем библиотеку ESP32QRCodeReader от Alvarowolfx — с ней читать QR-коды на ESP32-CAM совсем просто.
Затем в Arduino IDE зайдите в Sketch > Include Library > Add .ZIP library и установите библиотеку, которую только что скачали.

Sketch > Include Library > Add .ZIP library.
Код: сканер QR-кодов на ESP32-CAM#
Скопируйте код сканера QR-кодов в Arduino IDE.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-cam-qr-code-reader-scanner-arduino/
*********/
#include <Arduino.h>
#include <ESP32QRCodeReader.h>
// FOR THIS PROJECT, YOUR ESP32-CAM NEEDS TO HAVE PSRAM.
// Some of the compatible boards: CAMERA_MODEL_AI_THINKER | CAMERA_MODEL_WROVER_KIT | CAMERA_MODEL_ESP_EYE
// CAMERA_MODEL_M5STACK_PSRAM | CAMERA_MODEL_M5STACK_V2_PSRAM | CAMERA_MODEL_M5STACK_WIDE
ESP32QRCodeReader reader(CAMERA_MODEL_AI_THINKER);
void onQrCodeTask(void *pvParameters) {
struct QRCodeData qrCodeData;
while (true) {
if (reader.receiveQrCode(&qrCodeData, 100)) {
Serial.println("Scanned new QRCode");
if (qrCodeData.valid) {
Serial.print("Valid payload: ");
Serial.println((const char *)qrCodeData.payload);
}
else {
Serial.print("Invalid payload: ");
Serial.println((const char *)qrCodeData.payload);
}
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(115200);
Serial.println();
reader.setup();
Serial.println("Setup QRCode Reader");
reader.beginOnCore(1);
Serial.println("Begin on Core 1");
xTaskCreate(onQrCodeTask, "onQrCode", 4 * 1024, NULL, 4, NULL);
}
void loop() {
delay(100);
}
Как работает код#
Начинается всё с подключения библиотек, необходимых для сканирования QR-кодов на ESP32-CAM:
#include <Arduino.h>
#include <ESP32QRCodeReader.h>
Затем создаём объект reader для сканера QR-кодов. В этом руководстве мы используем модель AI-Thinker ESP32-CAM.
// FOR THIS PROJECT, YOUR ESP32-CAM NEEDS TO HAVE PSRAM.
// Some of the compatible boards: CAMERA_MODEL_AI_THINKER | CAMERA_MODEL_WROVER_KIT | CAMERA_MODEL_ESP_EYE
// CAMERA_MODEL_M5STACK_PSRAM | CAMERA_MODEL_M5STACK_V2_PSRAM | CAMERA_MODEL_M5STACK_WIDE
ESP32QRCodeReader reader(CAMERA_MODEL_AI_THINKER);
Обратите внимание: плата обязательно должна иметь PSRAM. Код проверялся и должен работать со следующими версиями плат ESP32-CAM:
CAMERA_MODEL_AI_THINKERCAMERA_MODEL_WROVER_KITCAMERA_MODEL_ESP_EYECAMERA_MODEL_M5STACK_PSRAMCAMERA_MODEL_M5STACK_V2_PSRAMCAMERA_MODEL_M5STACK_WIDE
setup()#
В функции setup() сначала инициализируем последовательную связь на скорости 115200 бод — она нужна для отладки.
void setup() {
Serial.begin(115200);
Serial.println();
Вызов reader.setup() запускает камеру, используя настройки библиотеки по умолчанию для платы AI-Thinker (или той, что вы выбрали).
reader.setup();
Serial.println("Setup QRCode Reader");
Считыватель камеры мы запускаем на ядре 1 процессора (у чипа ESP32 два ядра).
reader.beginOnCore(1);
Serial.println("Begin on Core 1");
Наконец, создаём задачу FreeRTOS для функции onQrCodeTask. Так сканер QR-кодов сможет работать в фоне.
xTaskCreate(onQrCodeTask, "onQrCode", 4 * 1024, NULL, 4, NULL);
onQrCodeTask()#
Функция onQrCodeTask в цикле while (true) постоянно ищет новые QR-коды, и, обнаружив корректный код, выводит его данные в монитор порта.
void onQrCodeTask(void *pvParameters) {
struct QRCodeData qrCodeData;
while (true) {
if (reader.receiveQrCode(&qrCodeData, 100)) {
Serial.println("Scanned new QRCode");
if (qrCodeData.valid) {
Serial.print("Valid payload: ");
Serial.println((const char *)qrCodeData.payload);
}
else {
Serial.print("Invalid payload: ");
Serial.println((const char *)qrCodeData.payload);
}
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
Вызов reader.receiveQrCode() пытается получить QR-код. Если код распознан, его данные попадают в структуру qrCodeData. Поле qrCodeData.valid говорит, корректен ли код: при true в монитор порта выводится строка Valid payload: и само содержимое, иначе — Invalid payload:. Полезная нагрузка (payload) — это те данные, что зашиты в QR-коде (например, ссылка или текст).
Заливка кода на ESP32-CAM AI-Thinker через программатор ESP32-CAM-MB#
Чтобы залить код, подключите к плате программатор ESP32-CAM-MB на micro-USB (как он устроен, можно прочитать в этом руководстве).

Программатор ESP32-CAM-MB на micro-USB.
Затем подключите плату к компьютеру по USB-кабелю.
После этого в Arduino IDE зайдите в Tools > Board и выберите AI-Thinker ESP32-CAM (либо найдите плату через строку поиска сверху). У вас должно быть установлено дополнение ESP32, иначе этой платы в меню не будет.

Tools > Board > AI-Thinker ESP32-CAM.
Зайдите в Tools > Port и выберите COM-порт, к которому подключена ESP32-CAM.
Обратите внимание: если плата не появляется, значит, скорее всего, у вас не установлены драйверы CH340C. Наберите в поиске «CH340C drivers» с названием вашей операционной системы и поставьте драйверы.
Наконец, нажмите в Arduino IDE кнопку Upload.
Вот и всё! Код сканера QR-кодов должен заработать на вашей ESP32-CAM.
Демонстрация#
После заливки откройте монитор порта на скорости 115200 бод. Нажмите на плате кнопку сброса — должен запуститься сканер QR-кодов. Проверьте окно монитора порта Arduino IDE: всё ли работает как надо.

Сканер инициализировался — видно в мониторе порта.
Наведите ESP32-CAM на QR-код. Вот пример кода с данными https://randomnerdtutorials.com/.

Тестовый QR-код.

Наводим камеру на QR-код.
Содержимое кода должно вывестись в мониторе порта Arduino IDE:

Распознанная полезная нагрузка в мониторе порта.
Если в мониторе порта у вас постоянно появляется такое сообщение:
Invalid payload: ECC failure
то, возможно, стоит взять QR-код поменьше, стабильнее держать камеру и наводить её точно на код при хорошем освещении.
У ESP32-CAM есть ограничения по разрешению, и с движением она справляется плохо, поэтому камеру нужно наводить на QR-код ровно и без дрожания. Кроме того, распознавать QR-коды сложно при плохом освещении — как слишком ярком, так и слишком тусклом.
Диагностика и советы#
Как уже говорилось, этот сканер QR-кодов расходует много памяти, поэтому ваша ESP32-CAM обязательно должна иметь PSRAM. Вот платы, которые проверялись и должны работать с этим примером:
CAMERA_MODEL_AI_THINKERCAMERA_MODEL_WROVER_KITCAMERA_MODEL_ESP_EYECAMERA_MODEL_M5STACK_PSRAMCAMERA_MODEL_M5STACK_V2_PSRAMCAMERA_MODEL_M5STACK_WIDE
Если вы сталкиваетесь с любой из следующих ошибок, загляните в наше руководство ESP32-CAM Troubleshooting Guide: Most Common Problems Fixed:
Failed to connect to ESP32: Timed out waiting for packet headerCamera init failed with error 0x20001или похожая;- ошибка Brownout detector или Guru meditation error;
Sketch too big— выбрана неверная схема разделов (partition scheme);Board at COMX is not available— не выбран COM-порт;Psram error: GPIO isr service is not installed.
Итого#
Надеемся, руководство оказалось полезным и пригодится вам в проектах. Похожие проекты с ESP32-CAM, которые могут понравиться: