Utilize o ESP32-CAM como leitor de QR Code 13

Neste tutorial você verá como é possível utilizar o ESP32-CAM como leitor de QR Code.

Todos os dias nós observamos ao nosso redor diversas trocas de informações entre os dispositivos e o meio físico auxiliando o homem no dia-a-dia. Um exemplo disso é o código de barras que é utilizado nos supermercados, onde o operador de caixa não precisa digitar qual produto a pessoa levará, ela apenas escaneia o código de barras que denomina aquele produto. 

Figura 1 – ESP32 CAM e Conversor USB

Além do código de barras existem também o QR Code que permite uma ampla possibilidade de uso, concedendo mais informações do que o código de barras. Através deste tutorial poderá utilizar o ESP32-CAM para realizar leituras de QR Code dando a possibilidade de você utilizá-lo para aprimorar seus projetos.

Se interessou? Então continue lendo!

Material necessário

O que é o QR Code?

Basicamente o QR Code é uma evolução do código de barras. Ele é formado por meio de um gráfico 2D, diferente do código de barras que é utiliza apenas a horizontal o QR Code por sua vez, utiliza a horizontal e vertical no qual lhe dá a possibilidade de entregar mais informações.

Funcionamento do Circuito

O circuito é composto pelo ESP32 CAM juntamente com o Conversor USB TTL. O conversor USB será utilizado apenas para fazer a gravação no ESP32 CAM. Após carregar o código para a placa é possível utilizar uma fonte externa para alimentação do ESP respeitando a tensão contínua de 5V.

Depois de carregado o código no módulo, o ESP32 CAM aguardará que você aproxime um QR Code na frente da câmera. Após aproximar o código, as informações contidas neste serão apresentadas no monitor serial da IDE do Arduino.

Figura 2 – Lendo QR Code

 Montagem do circuito

Com todos os componentes em mãos vamos à montagem do circuito. Abaixo temos o esquemático eletrônico montado em uma protoboard.

Figura 3 – Esquemático eletrônico

Obs.: o pino IO0 deve ser conectado ao GND apenas para carregar o código no ESP32 CAM.

Utilizando o ESP32 CAM com a Arduino IDE

Obs.: Caso você já tenha instalado o ESP32 na IDE do Arduino, pule esta etapa.

Na Arduino IDE vá em Arquivos > Preferências e adicione o link abaixo em “URLs Adicionais para Gerenciadores de Placas” e clique em OK.

https://dl.espressif.com/dl/package_esp32_index.json

Depois vá em Ferramentas > Placas > Gerenciador de Placas… e pesquise ESP32 e clique em instalar.

Gerenciador de placas
Figura 4 – Gerenciador de Placas Arduino

Após instalado a placa vá em Ferramentas > Placa e selecione a placa AI Thinker ESP32-CAM.

Selecionando placa para o projeto ESP32-CAM como QR Code
Figura 5 – Selecionando placa

Código

Antes de tudo, precisamos fazer a instalação de uma biblioteca para o funcionamento do código. Será necessário utilizar a biblioteca ESPIno32CAM.

Após o download descompacte os arquivos e cole na pasta de Bibliotecas do Arduino no endereço C:/Arquivos de Programas (x86)/Arduino/libraries

Com a biblioteca instalada vamos a parte do código que será carregado no ESP32.

//Bibliotecas utilizadas
#include "ESPino32CAM.h"
#include "ESPino32CAM_QRCode.h"

ESPino32CAM cam;   //Objeto para captura de imagem
ESPino32QRCode qr; //Objeto para decoficação da imagem

//Define os pinos da câmera
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27
#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22
#define flash 4


//Variável para limitar o print no monitor serial se caso o QR Code ainda estiver na frente da câmera
int trava;

void setup() {
  
  Serial.begin(115200);
  Serial.println("Leitor de QR Code");
  //Define pino do flash
  pinMode(flash,OUTPUT);
  digitalWrite(flash,LOW);//Desliga o flash
    
  //Configura os pinos da câmera
  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 = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = FRAMESIZE_VGA;  
  config.jpeg_quality = 4;
  config.fb_count = 1;
  
  esp_err_t err = esp_camera_init(&config); //Inicialização da câmera
  
  if (err != ESP_OK) {
    
    Serial.printf("O início da câmera falhou com erro 0x%x", err);//Informa erro se a câmera não for iniciada corretamente
    delay(1000);
    ESP.restart();//Reinicia o ESP
    
  }

  //Inicializa o objeto de decodificação
  qr.init(&cam);
  sensor_t *s = cam.sensor();
  s->set_framesize(s, FRAMESIZE_CIF);
  s->set_whitebal(s, true);
  
  Serial.println();
  Serial.println("Aguardando código"); 

}

void loop()
{
  unsigned long pv_time  = millis();
  camera_fb_t *fb = cam.capture(); //Captura a imagem
  if (!fb)
  {
    Serial.println("Falha na captura da imagem");
    return;
  }
  dl_matrix3du_t *rgb888, *rgb565;
  if (cam.jpg2rgb(fb, &rgb888))
  {
    rgb565 = cam.rgb565(rgb888);
  }
  cam.clearMemory(rgb888);
  cam.clearMemory(rgb565);
  dl_matrix3du_t *image_rgb;
  if (cam.jpg2rgb(fb, &image_rgb))
  {
    cam.clearMemory(fb);
        
    qrResoult res = qr.recognition(image_rgb); //Faz decodificação da imagem contendo os dados
    
    if (res.status) //Se conseguir decodificar a imagem mostra os dados na tela
    { 
      
      if(trava == 0){
       trava = 1;
       String leitura = "Código QR Lido: " + res.payload;//Variável para mostrar os dados contidos no QR Code
       Serial.println();
       Serial.println(leitura);  //Mostra os dados no monitor serial
      }
       
    }
    else{ //Se não aguarda receber código 
       
       trava = 0;
       Serial.println();
       Serial.println("Aguardando código"); 
     }
           
    }
    
  cam.clearMemory(image_rgb); //Apaga imagem para receber uma nova imagem
}

Carregando o código no ESP32 CAM

Para carregar o código no ESP32-CAM certifique-se que o pino IO0 está conectado ao GND. Então conecte o cabo do conversor no computador e selecione a porta COM que aparecerá na IDE do arduino em Ferramentas > Porta.

Após isso faça o upload do código e quando aparecer “Connecting…” aperte o botão RST que se encontra embaixo do ESP32-CAM.

Carregando código do ESP32-CAM como QR Code
Figura 6 – carregando código

Se aparecer esta imagem significa que o código foi carregado com sucesso.

Código do ESP32-CAM como QR Code carregado
Figura 7 – código carregado

Depois de carregado o código desconecte o pino IO0 do GND e aperte o botão RST novamente. Isso fará com que seu código comece a rodar no ESP32-CAM.

Abra o monitor serial e observe que aparecerá aguardando código. Aproxime um QR Code na frente da câmera e aguarde as informações aparecerem na tela.

Obs.: Você pode utilizar um site para gerar os códigos QR neste link ou um aplicativo para smartphone Android ou IOS.

Conclusão

Agora que você viu como é fácil utilizar o ESP32-CAM como leitor de QR Code, você pode usar isso ao seu favor em seus projetos, como por exemplo usar o Leitor para acionar um relé que esteja conectado a alguma carga.

Gostou de como utilizar o ESP32-CAM como leitor de QR Code? Deixe seu comentário logo abaixo. Para saber mais sobre o mundo maker, arduino entre outros dispositivos acesse o blog

Faça seu comentário

Acesse sua conta e participe

13 Comentários

  1. Qual a banda necessária pra transmitir um link ao vivo? ou o tamanho do pacote de dados por imagem. Pretendo transmitir via LoRa… Será que é possível? Att.

    1. Olá Lucas,

      Dificilmente você conseguirá transmitir um link de vídeo ao vivo por LoRa, a banda não é suficiente.
      Aqui você pode ver uma fonte a respeito (em inglês): https://stuartsprojects.github.io/2021/02/26/Large-Data-Transfers-with-LoRa-Part1.html

      Abraços!
      Vinícius – Equipe MakerHero

  2. Olá Felipe,

    Primeiramente parabéns pelo post, consegui executar todos os passos e está funcionando certinho, entretanto, para o meu caso em especifico, achei o tempo de leitura muito lento, tentei procurar a biblioteca que mencionou para saber se eu poderia de alguma forma melhorar a performasse, fazer a câmera funcionar em grayscale não sei, mas não encontrei nada sobre essa LIB, você poderia compartilhar o github dela? ou até mesmo me informar se existe uma forma de melhorar essa performasse?

    1. Olá Renan!

      A biblioteca é a seguinte: https://github.com/ThaiEasyElec/ESPIno32CAM

      Abraços!
      Vinícius – Equipe MakerHero

  3. Ola excelente conteúdo,

    Realizei todo o procedimento conforme descrito, mas quando vou realizar a compilação do código aparece um erro conforme descrição abaixo.

    In file included from C:\Users\Tom\Desktop\ESP32_CAM\ESP32_CAM.ino:2:
    C:\Program Files (x86)\Arduino\libraries\ESPIno32CAM-master\src/ESPino32CAM.h:7:10: fatal error: fd_forward.h: No such file or directory
    #include “fd_forward.h” // face Detect
    ^~~~~~~~~~~~~~
    compilation terminated.
    exit status 1
    Erro compilando para a placa AI Thinker ESP32-CAM

    1. Olá Wellington!

      Testei aqui e não apresentou erros.
      Estranho ele reclamar de uma linha que aparenta estar comentada.
      Qual versão da IDE e placas ESP32 você está utilizando?

      Abraços!
      Vinícius – Equipe MakerHero

      1. Olá Vinícius,

        Estou utilizando a IDE do Arduino na versão 1.8.16 e as placas estou utilizando a biblioteca da by Espressif System versão 2.0.2 que está incluída no pacote ESP32 Dev Board, ESP32 S2 Dev Board, ESP32 S3 Dev Board.
        O restante estou seguindo o passo a passo do tutorial.

        Atenciosamente

        Wellington Fernando Pereira

        1. Olá Wellington!

          Verifiquei aqui e com as versões 2.0.0 e superiores do core não está compilando mesmo alguma coisa com a biblioteca(que teve a última atualização em 2019), funcionou até a versão 1.0.6 do core do ESP32.

          Abraços!
          Vinícius – Equipe MakerHero

  4. I bought ESP32CAM(AI Thinker compatibile ? ) from Aliexpress.com
    It did not work with the ESPino32CAM source.
    I solved the problem(PIN definition and etc) thanks to looking at the website here.
    (It is one of the best solution that I tried for QRcode reading in ESP32-CAM)

    Thank you. Obrigada.
    Mike

  5. Brother, vi seu código e até comprei um arduino + host shield usb, para um projeto meu, porém eu não tenho muito conhecimento referente a programação, preciso desenvolver uma código que leia um qr code através de um leitor symbol.
    Consegue me dar alguma luz ?

    1. Olá, bom aconselho você a ler sobre este post:

      https://www.makerhero.com/blog/usb-host-shield/

      Abraço!

      Felipe Santos do Nascimento
  6. Excelente, Felipe!

    Ele armazena o conteúdo do código como string na variável leitura. E quanto à formatação do conteúdo quando for extenso, como site, endereço, telefone, e-mail, etc., ele vai armazenar sequencialmente ou com quebra de linha?

    Obrigado!

    1. Olá Edelson, se for no caso como o link do site mostrado no tutorial, será sequencial, agora se tiver mais informações como um VCARD teria que testar para ver se será sequencial ou se terá as quebras de linha, porém mesmo que tenha quebra de linha ou não, você poderá tratar os dados tranquilamente!

      Abraço!

      Felipe Santos do Nascimento