Buscando informações de um livro utilizando ESP8266 4

Nesse post veremos como obter informações de um livro utilizando ESP8266, através do seu código ISBN (igual ao seu código de barras). Para isso utilizaremos um ESP8266 para obter as informações do livro fornecidas por uma API.

O que é ISBN?

O ISBN (International Standard Book Number) é um número padronizado internacionalmente de 10 ou 13 dígitos único de cada publicação. Esse número é usado por diversos sistemas para catalogar o inventário de livros e é utilizado como código de barras.

Informação do livro utilizando ESP8266

O que é uma API?

Uma API (Application Programming Interface) é uma interface que permite a utilização padronizada dos serviços de um software. Isso possibilita que essas ferramentas sejam utilizadas para outras aplicações desenvolvidas por terceiros. 

Utilizaremos a plataforma Google Books para buscar as informações de um livro através do seu código ISBN. Para informações detalhadas, acesse “Uso da API do Google Books”.

Materiais Necessários

Para montagem desse projeto precisaremos dos componentes abaixo:

Montagem do Circuito

Esquemático do projeto Buscando informações de um livro utilizando ESP8266

Para montagem desse projeto devemos conectar o display OLED na alimentação de 5V do Wemos D1 mini (proveniente da porta USB), conectar a interface I²C do display a interface do módulo e conectar os pinos do teclado a portas digitais do microcontrolador. A tabela abaixo apresenta todas as conexões que devem ser feitas.

Wemos D1 mini Teclado Matricial Display OLED
5V VCC
GND GND
D3 SDA
D5 SCL
D4 R1
D2 R2
D1 R3
RX R4
D8 C1
D7 C2
D6 C3
D0 C4

Configuração da IDE do Arduino para a placa WeMos

As placas baseadas no ESP8266 não estão instaladas nativamente na IDE do Arduino. Acesse o post “Como programar o NodeMCU com IDE Arduino” para instruções em como realizar a instalação. Após seguir os passos do post, na IDE do Arduino, vá em Ferramentas → Placa → LOLIN(WEMOS) D1 mini Lite.

Programação

Para esse projeto precisamos instalar as seguintes bibliotecas através do gerenciador de bibliotecas da IDE do Arduino ou dos links abaixo:

As demais bibliotecas utilizadas já estão presentes nativamente na IDE do Arduino.

A comunicação com API do Google Books será feita por protocolo HTTPS pelo método GET e as informações recebidas formatadas em JSON. A API não exige uma chave para consulta de dados públicos, então, os únicos parâmetros que precisam ser alterados no código abaixo são o nome e a senha da sua rede WiFi.

#include <Wire.h>
#include <SSD1306Wire.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <Keypad.h>

String host = "googleapis.com";

//Nome e Senha da sua rede WiFi
#define ssid "insira-aqui-o-nome-da-rede-wifi"
#define password "insira-aqui-a-senha-da-rede-wifi"
//*****************************

//Mapa do nome de cada um dos botões
char hexaKeys[4][4] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[4] = { D4, D2, D1, RX};  //Pinos onde estão conectados R1, R2, R3 e R4
byte colPins[4] = { D8, D7, D6, D0};  //Pinos onde estão conectados R1, R2, R3 e R4

//Objetos
WiFiClientSecure client;
Keypad teclado = Keypad( makeKeymap(hexaKeys), rowPins, colPins, 4, 4);
SSD1306Wire oled( 0x3c, D3, D5);  //Endereço I2C do Display, SDA, SCL

//Protótipos das Funções 
String GEThttps( String argHost, String argURL);
void parseData( String payload, String *title, String *author, String *pages, String *date, String *publisher);
void printData( String command, String title, String author, String pages, String date, String publisher);

void setup() 
{
  oled.init();    //Incializa o Display
  
  //Comunicação Serial sem o pino RX - que está sendo usado pelo teclado
  Serial.begin(9600, SERIAL_8N1, SERIAL_TX_ONLY); 
  
  oled.setFont(ArialMT_Plain_16);  //Define a fonte do Texto
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  oled.drawString( 0, 2, "Conecting...");
  oled.display();
  while(WiFi.status() != WL_CONNECTED)    //Aguarda conexão WiFi
  {
    delay(100);
  }
  oled.clear();
  oled.drawString( 0, 2, "Digite o ISBN:");
  oled.display();   //Imprime no Display os dados na memória

  client.setInsecure(); //Permite comunicação https
}

void loop() 
{  
  static String ISBN = "";
  char pressedKey = teclado.getKey();

  static String title = "";
  static String author = "";
  static String pages = "";
  static String date = "";
  static String publisher = "";
  
  if (pressedKey)
  {
   Serial.print(pressedKey);
   if(pressedKey == '*')  //Apagar
   {
      ISBN = "";
      oled.clear();
      oled.drawString( 0, 0, "Digite o ISBN:");
      oled.display();
   }
   else if(pressedKey == '#') //Enter - buscar ISBN
   {
      oled.clear();
      oled.drawString( 0, 0, "Buscando...");
      oled.display();
      String URL = "www.googleapis.com/books/v1/volumes?q=isbn:";
      URL += ISBN;
      parseData(GEThttps( host, URL), &title, &author, &pages, &date, &publisher);
      printData("", title, author, pages, date, publisher);
   }
   else if(pressedKey == 'A' || pressedKey == 'B')  //Anterior
      printData("previous", title, author, pages, date, publisher);
   else if(pressedKey == 'C' || pressedKey == 'D')  //Próximo
      printData("next", title, author, pages, date, publisher);
   else   //Um número foi digitado
   {
      ISBN += pressedKey;
      oled.drawString( 0, 0, "Digite o ISBN:");
      oled.drawString( 0, 16, ISBN);
      oled.display();
   }
    
  }

}

String GEThttps( String argHost, String argURL)
{
  String page = "";
  
  if (client.connect(argHost, 443))    //Host Connection
    {
      client.println("GET " + argURL + " HTTP/1.1");   //Sends the URL
      client.println("");
      
      while (true) 
      {
        char c = client.read();
        Serial.print(c);
        page = page + c;
        if(page.indexOf("      }\n    }\n  ]\n}") != -1)   //Checks if the relevant data has been received
          break;
        yield();    //Resets Watchdog Timer
      }
    }
    else
      Serial.println("[ERROR] Failed to Connect!");
      
  return page;
}


void parseData( String payload, String *title, String *author, String *pages, String *date, String *publisher)
{
  String JSONpayload = payload.substring(payload.indexOf("{"));   //Obtem só os dados em JSON
  
  DynamicJsonBuffer jsonBuffer;
  JsonObject& json = jsonBuffer.parseObject(JSONpayload);

  //Extraindo as informações do arquivo JSON
  String title_ = json ["items"][0]["volumeInfo"]["title"];
  String author_ = json ["items"][0]["volumeInfo"]["authors"][0];
  String pages_ = json ["items"][0]["volumeInfo"]["pageCount"];
  String date_ = json ["items"][0]["volumeInfo"]["publishedDate"];
  String publisher_ = json ["items"][0]["volumeInfo"]["publisher"];

  *title = title_;
  *author = author_;
  *pages = pages_;
  *date = date_;
  *publisher = publisher_;
}

void printData( String command, String title, String author, String pages, String date, String publisher)
{
  static int currentInfo = 0;
  
  if(command == "next")
    currentInfo++;
  else if(command == "previous")
    currentInfo--;
  else 
    currentInfo = 0;

  if(currentInfo == 0) //Título
  {
    oled.clear();
    oled.drawString( 0, 0, "Titulo:");
    oled.drawStringMaxWidth(0, 16, 128, title);
    oled.display();
  }
  else if(currentInfo == 1) //Autor
  {
    oled.clear();
    oled.drawString( 0, 0, "Autor:");
    oled.drawStringMaxWidth(0, 16, 128, author);
    oled.display();
  }
  else if(currentInfo == 2) //Número de Páginas
  {
    oled.clear();
    oled.drawString( 0, 0, "Paginas:");
    oled.drawString( 0, 16, pages);
    oled.display();
  }
  else if(currentInfo == 3) //Data de Publicação
  {
    oled.clear();
    oled.drawString( 0, 0, "Publicacao:");
    oled.drawString( 0, 16, date);
    oled.display();
  }
  else if(currentInfo == 4) //Editora
  {
    oled.clear();
    oled.drawString( 0, 0, "Editora:");
    oled.drawString( 0, 16, publisher);
    oled.display();
  }
}

Funcionamento

Descrição do keypad

Assim que é ligado, o módulo tentará se conectar com a rede WiFi configurada. Quando a conexão for bem-sucedida a mensagem “Digite o ISBN:” aparecerá na tela.

Digite o código ISBN e aperte ‘#’ para realizar a busca. Assim que a busca for concluída, o título da obra deve aparecer na tela e você poderá utilizar as teclas C e D para passar para a próxima informação ou utilizar as teclas A e B para retroceder. Para realizar uma nova busca ou corrigir o código ISBN digitado utilize a tecla ‘*’.

Conclusão

Você pode usar o código presente nesse post como base para projetos que envolvam livros como, por exemplo, um controle de inventário da sua biblioteca. O código pode ser usado também para acessar APIs que exijam certificação SSL através do protocolo HTTPS de forma simples e rápida.

Projeto de informações de um livro utilizando ESP8266 finalizado

Gostou de aprender como buscar informações de um livro utilizando o ESP8266? Deixe um comentário aqui embaixo nos contando o que achou!

Faça seu comentário

Acesse sua conta e participe

4 Comentários

  1. Olá Italo, muito bom o projeto e as explicações.
    Como poderia ser feito para listar as rede wifi disponíveis para que quem for usar poder selecionar a rede e digitar a senha? Você tem algum exemplo ou indicação de algum artigo sobre isso? todos os exemplo que achei o SSID e a senha estão hardcode.
    Obrigado!

    1. Que bom que gostou, Alexandre! Você pode usar a biblioteca WiFiManager, segue um post sobre a utilização com ESP32 mas você pode usar o mesmo procedimento para o ESP8266: https://www.makerhero.com/blog/aprenda-a-configurar-a-rede-wifi-do-esp32-pelo-smartphone/

  2. Ítalo, vejo que há muito a aprender, não sabia dessa informação de busca de livros, o projeto é muito bom. parabéns pelo projeto.

    1. Fico feliz que gostou, Wilson!