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.
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.
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.
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.
Após instalado a placa vá em Ferramentas > Placa e selecione a placa AI Thinker ESP32-CAM.
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.
Se aparecer esta imagem significa que o código foi carregado com sucesso.
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.
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.
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
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?
Olá Renan!
A biblioteca é a seguinte: https://github.com/ThaiEasyElec/ESPIno32CAM
Abraços!
Vinícius – Equipe MakerHero
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
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
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
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
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
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 ?
Olá, bom aconselho você a ler sobre este post:
https://www.makerhero.com/blog/usb-host-shield/
Abraço!
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!
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!