Buscando informações de um livro utilizando ESP8266 Deixe um comentário

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 miniTeclado MatricialDisplay OLED
5VVCC
GNDGND
D3SDA
D5SCL
D4R1
D2R2
D1R3
RXR4
D8C1
D7C2
D6C3
D0C4

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!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *