| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- // 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;
- }
|