// Based on https://drive.google.com/file/d/1w8hJ5NhNik3qo2xl6eDrlgG4n6R4LuJ_/view #include "quirc.h" struct QRCodeData { bool valid; int dataType; uint8_t payload[1024]; int payloadLen; }; // creating a task handle TaskHandle_t QRCodeReader_Task; struct quirc *q = NULL; uint8_t *image = NULL; camera_fb_t * fb = NULL; struct quirc_code code; struct quirc_data data; quirc_decode_error_t err; struct QRCodeData qrCodeData; String QRCodeResult = ""; void qr_reader_setup() { // camera init camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 10000000; config.pixel_format = PIXFORMAT_GRAYSCALE; config.frame_size = FRAMESIZE_QVGA; config.jpeg_quality = 15; config.fb_count = 1; /*#if defined(CAMERA_MODEL_ESP_EYE) pinMode(13, INPUT_PULLUP); pinMode(14, INPUT_PULLUP); #endif*/ esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); ESP.restart(); } sensor_t * s = esp_camera_sensor_get(); s->set_framesize(s, FRAMESIZE_QVGA); //Serial.println("Configure and initialize the camera successfully."); //Serial.println(); /* ---------------------------------------- */ /* ---------------------------------------- create "QRCodeReader_Task" using the xTaskCreatePinnedToCore() function */ xTaskCreatePinnedToCore( QRCodeReader, /* Task function. */ "QRCodeReader_Task", /* name of task. */ 10000, /* Stack size of task */ NULL, /* parameter of the task */ 1, /* priority of the task */ &QRCodeReader_Task, /* Task handle to keep track of created task */ 0); /* pin task to core 0 */ /* ---------------------------------------- */ } void qr_reader_loop() { delay(1); } void QRCodeReader( void * pvParameters ){ /* ---------------------------------------- */ Serial.println("Waiting for QR code"); //Serial.print("QRCodeReader running on core "); //Serial.println(xPortGetCoreID()); //Serial.println(); /* ---------------------------------------- */ /* ---------------------------------------- Loop to read QR Code in real time. */ while(1){ q = quirc_new(); if (q == NULL){ Serial.print("can't create quirc object\r\n"); continue; } fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); continue; } quirc_resize(q, fb->width, fb->height); image = quirc_begin(q, NULL, NULL); memcpy(image, fb->buf, fb->len); quirc_end(q); int count = quirc_count(q); if (count > 0) { quirc_extract(q, 0, &code); err = quirc_decode(&code, &data); if (err){ Serial.println("Decoding FAILED"); QRCodeResult = "Decoding FAILED"; } else { //Serial.printf("Decoding successful:\n"); dumpData(&data); } Serial.println(); } esp_camera_fb_return(fb); fb = NULL; image = NULL; quirc_destroy(q); } /* ---------------------------------------- */ } void dumpData(const struct quirc_data *data) { /*Serial.printf("Version: %d\n", data->version); Serial.printf("ECC level: %c\n", "MLHQ"[data->ecc_level]); Serial.printf("Mask: %d\n", data->mask); Serial.printf("Length: %d\n", data->payload_len);*/ Serial.printf("Payload: %s\n", data->payload); QRCodeResult = (const char *)data->payload; }