ESP8266 e Bancos de Dados – Requisições WEB com PHP

Neste artigo vamos mostrar como enviar dados coletados de sensores e armazená-los em um banco de dados usando ESP8266 através da conexão WI-FI e requisições HTTP com PHP


Nosso projeto de exemplo, vai funcionar da seguinte maneira:

  • A cada 30 segundos o ESP8266 vai ler os dados do sensor e enviá-los através da conexão Wi-Fi a um servidor WEB via requisição HTTP  (GET ou POST);
  • No servidor um script PHP vai receber os dados enviados e gravá-los no banco de dados .

Supõe-se que o leitor tenha conhecimentos básicos sobre a teoria de Bancos de Dados Relacionais e MySQL, bem como sobre requisições HTTP.
No final do artigo relaciono alguns links úteis nesse sentido.

Passo 1: Criação do Banco de Dados

Vamos criar um banco de dados que será usado futuramente para armazenar os dados de uma estação meteorológica. Por isso nossa tabela receberá o nome de weather

Para criar o banco e a tabela, utilizei a ferramenta phpMyAdmin que vem com o uWamp – pacote de instalação do Apache + PHP + MySQL

Crie o banco de dados maker no MySQL e a tabela weather que receberá os dados dos sensores com a seguinte estrutura:

Obs:

  1. O campo wea_id (chave primária) será incrementado automaticamente a cada inserção;
  2. A mesma coisa acontecerá o campo wea_date que guardará a data e hora em que o sinal foi enviado
  3. Os campos wea_temp e wea_humid vão armazenar os dados de temperatura e umidade enviados pelo ESP,

Passo 2: Script PHP

O script PHP ficará encarregado de ler os dados dos sensores enviados pelo ESP por uma requisição GET, fazer a conexão com o banco e gravar os dados através de um comando INSERT.

Vejamos:

Obs: Crie uma pasta weather dentro da pasta www do servidor e coloque esse script com o nome insert_weather.php.

Passo 3: Protótipo ESP8266

Para nosso teste vamos usar o sensor de temperatura e umidade DHT11 e a placa de desenvolvimento NodeMCU, mas você pode usar qualquer placa compatível com a IDE do Arduino como a WEMOS ou a Adafruit Huzzah.

Montagem:

Nodemcu e DHT11
Nodemcu e DHT11

O sketch comentado ficou da seguinte forma:

Obs:

  1. Repare que usamos library SimpleDHT para controlar o sensor DHT11, mas você pode usar a library de sua preferência. Veja aqui as instruções para usar essa biblioteca.
  2. Neste exemplo usamos o servidor de teste da máquina local Windows, o localhost. No entanto, para acesso remoto não deve ser usado o IP 127.0.0.1. Para saber o IP da máquina local para a variável server use o comando ipconfig e observe o valor do ipv4.

Passo 4: Ação

Depois de criar o banco e upar o sketch para o ESP, realize a seguinte sequência de passos para ver tudo funcionando:

  • Startar o servidor através da ferramenta uWamp. O Apache deve ser startado no modo ONLINE;
  • Startar o sketch do ESP8266 e abra o Monitor Serial da IDE para acompanhar as mensagens de log.

Pronto! Para ver o resultado abra o phpMyAdmin e execute o seguinte comando SQL:

SELECT * FROM WEATHER

E então você verá os dados chegando a cada 30 segundos.
Até a próxima!

Referências

43 comentários sobre “ESP8266 e Bancos de Dados – Requisições WEB com PHP”

  1. Poderia passar algum link que mostre um exemplo de como buscar uma informação presente no nomeMCU e apresentá-la numa página WEB, como por exemplo ver o status do led da placa? Obrigado.

  2. Olá José Cintra!

    Onde posso encontrar estas bibliotecas? Poderia deixar um link?
    #include
    #include

    Obrigado!

  3. Bom dia;

    José Cintra, estou com uma dificuldade para conseguir gravar os dados do sensor DHT 11 no bando dos dados (MYSQL) que só me retorna um conjunto vazio no Uwamp. Fiz todas as configurações necessárias que você descreveu no tutorial, mas não deu certo. Só fiquei em dúvida sobre qual endereço de requisição HTTP tenho que colocar nesse campo: (const char http_site[] = “http://mycomputer”;) no lugar de mycomputer?

    Abraços.

    1. Olá Gilielson,!
      Para saber qual o endereço usar no sketch, execute o comando ipconfig do windows.
      Instruções completas enviei no seu email
      Abraço
      José Cintra

          1. Enviei o email com fotos sobre minhas duvida, muito obrigado pela atenção.

        1. Olá Francisco
          Coloque o nome “DNS” do seu computador. No Windows, para saber o nome do seu computador vá em “Meu computador”

  4. Boa noite!
    No meu projeto pretendo coletar dados de sensores pelo ESP8266 Sparkfun e enviá-los para ser exibido na página da minha empresa em forma de gráficos em tempo real. Parabéns pelo tutorial, mas infelizmente no serial monitor tenho essas mensagens de retorno:

    Gravando dados no BD:
    27 *C, 57 %
    /?temp=27&humid=57
    HTTP/1.1 404 Not Found
    Server: Apache
    Content-Type: text/html; charset=iso-8859-1
    Content-Length: 225
    Accept-Ranges: bytes
    Date: Mon, 27 Mar 2017 23:22:20 GMT
    Age: 0
    Connection: close

    404 Not Found

    Not Found
    The requested URL /weather/insert_weather.php/ was not found on this server.

    Gravando dados no BD:
    27 *C, 58 %
    /?temp=27&humid=58
    HTTP/1.1 404 Not Found
    Server: Apache
    Content-Type: text/html; charset=iso-8859-1
    Content-Length: 225
    Accept-Ranges: bytes
    Date: Mon, 27 Mar 2017 23:22:26 GMT
    Age: 107
    Connection: close

    Essa mensagem fica repetindo para sempre.

    Teria alguma dica que eu possa tentar? Fiz exatamente como você ensinou.

    Obrigado!!

    1. Olá Paulo!
      Esse erro ocorre quando a página não foi encontrada na pasta do servidor.
      Verifique no servidor que você instalou qual deve ser a pasta onde ficam os documentos web.
      No servidor que uso essa pasta se chama WWW. Em outras instalações essa pasta pode estar configurada com outros nomes, como ROOT ou HTDOCS.
      Dentro dessa pasta deve ser criada a pasta weather para colocar os arquivos do exemplo:
      /weather/insert_weather.php/
      Verifique qual a porta esta usando também.
      Abraço.

      1. Bom dia José Cintra!

        No meu servidor tenho a pasta httpdocs. Dentro dela coloquei a pasta weather e continuou com o mesmo erro. Tentei adicionar a pasta weather na pasta httpdocs/www.gridenergia.com.br/ que se encontra no servidor, mas continuou com o mesmo erro. Usei a porta 8080 como você descreveu no tutorial e também a porta 80, mas ainda nenhum resultado.

        Esse projeto consiste em um trabalho de tcc que estou desenvolvendo e preciso muito que de certo kkkkkk. Teria como entrar em contato com você por email para que possa me dar uma ajuda ou alguma dica?

        Desde já agradeço sua atenção! Bom dia.

          1. Estou usando seu exemplo contudo estou tendo o seguinte erro

            HTTP/1.1 400 Bad Request
            Server: Apache
            Content-Type: text/html; charset=iso-8859-1
            Content-Length: 226
            Accept-Ranges: bytes
            Date: Fri, 31 Mar 2017 18:02:26 GMT
            Age: 0
            Connection: keep-alive

            400 Bad Request

            Bad Request
            Your browser sent a request that this server could not understand.

            HTTP/1.1 400 Bad Request

  5. Boa tarde,

    Eu consigo inves de mandar dados, fazer com que o ESP8266 pegue a tag de um cartão via leitor RFID e buscar dados em um banco de dados?

    Obrigado

  6. Olá José, eu consigo após enviar as informações via GET ou POST ter uma resposta do servidor destino (ex. cadastro ok, etc)? Obrigado!

    1. Olá Juliano!
      Sim. No código de exemplo, onde está escrito // Informações de retorno do servidor para debug
      Ali você pode tratar a resposta do servidor. Você pode colocar o seu código ali.
      Existe um exemplo no blog no artigo sobre ajax Aqui

  7. Olâ Muito bom poste

    Gostaria de usar o Modulo dht22 isso mudaria apenas as linhas:
    int pinDHT11 = D2;
    SimpleDHT11 dht11
    //Leitura do sensor DHT11
    delay(3000); //delay entre as leituras
    byte temp = 0;
    byte humid = 0;
    if (dht11.read(pinDHT11, &temp, &humid, NULL)) {
    Serial.print(“Falha na leitura do sensor.”);
    return;
    }

    _____________________________________________________________
    para:

    int pinDHT22 = D2;
    SimpleDHT22 dht22
    delay(3000); //delay entre as leituras
    byte temp = 0;
    byte humid = 0;
    if (dht22.read(pinDHT22, &temp, &humid, NULL)) {
    Serial.print(“Falha na leitura do sensor.”);
    return;
    }

    ____________________________________________________________________
    ??????
    Agradeço desde já

  8. Bom dia, tudo bem?

    Pode me auxiliar com a conexão de um ESP8266 NODE MCU com banco MySQL?

    Da parte do PHP, fiz algumas alterações e estão ok. Fiz um teste inserindo a linha no navegador e gravou no banco.

    http://thinkpro.com.br/dashboard/insert.php

    Na IDE do Arduino, tenho o seguinte erro, que fica se repetindo:

    Gravando dados no BD:
    19 *C, 61 %
    Falha na conexao com o site
    GET request failed

    Poderia me auxiliar, por favor? Anexo, segue o código .ino.

    Muito obrigado!

    Benito

  9. Boa tarde.
    Estou tentado conectar o ESP8266+arduino, mas não estou conseguindo. Todos os tutoriais que encontro usam a biblioteca , mas quando busco no github, a biblioteca foi renomeada como SerialESP8266wifi. Instalo, mas não conecta. Na verdade não sei se o problema é este, mas preciso resolver este para verificar outros. Obrigado

    1. Desculpe, o texto ficou truncado. Tento conectar ESP8266-01+Arduino UNO na minha rede wifi. A biblioteca que é solicitada é a ESP8266WiFi.h .

  10. Olá! parabéns pelo post, o mesmo esta sendo muito util para minha aprendizagem, porém eu tenho uma duvida.
    const char http_site[] = “http://mycomputer”;
    oque deve ser colocado nessa parte do sketch?
    eu coloquei parte da url do endereço do insert_wether.php, ficou assim:
    const char http_site[] = “http://weather/insert_weather.php”;
    esta errado?

    1. Olá Uigor!
      Substitua “mycomputer” pelo nome do seu computador (como é visto na rede).
      No Windows, para descobrir o nome do seu computador, clique com o botão direito no ícone “Meu computador” ou “Computador”

  11. Estou com mesmo problema que o Andrew:

    HTTP/1.1 400 Bad Request
    Server: Apache
    Content-Type: text/html; charset=iso-8859-1
    Content-Length: 226
    Accept-Ranges: bytes
    Date: Fri, 31 Mar 2017 18:02:26 GMT
    Age: 0
    Connection: keep-alive

    400 Bad Request

    Bad Request
    Your browser sent a request that this server could not understand.

    HTTP/1.1 400 Bad Request

    1. Olá João!
      As vezes pode ser nos comandos print, pois são eles que montam a requisição para o servidor
      Tente mudar a variável http_site no comando abaixo e coloque o IP da sua máquina para garantir

      client.println(http_site);

  12. João, tive o mesmo problema.

    Removi + ” HTTP/1.1″ da linha de codigo abaixo e começou a gravar no banco de dados… o restante deixei do jeito que estava

    client.println(“GET /weather/insert_weather.php” + param + ” HTTP/1.1″);

    ficaria desse jeito:
    client.println(“GET /weather/insert_weather.php” + param);

  13. Estou com este problema

    Bad request!

    */–>

    Bad request!

    Your browser (or proxy) sent a request that
    this server could not understand.

    If you think this is a server error, please contact
    the webmaster.

    Error 400

    http://www.example.com
    Apache/2.4.26 (Win32) OpenSSL/1.0.2l PHP/7.1.7

  14. Parabens pelo topico.

    Estou com algumas dúvidas, estou tentando fazer a conexão com um servidor. Tenho dúvidas nos seguintes itens.

    IPAddress servers();
    const char http_site[] = “”;

    1. Olá Madson. Você está usando um servidor local na sua máquina, certo? Dessa forma, use:
      IPAddress – O endereço IP da máquina (você consegue esse IP executando o ipconfig e observe o valor do ipv4)
      http_site – nome da máquina (você consegue saber no Windows em “meu computador”

      1. Muito obrigado José Cintra.
        Estou com um problema agora, que ele não está inserindo no banco. Ele não está retornando nenhum erro.

        Executei a pagina manualmente e inseriu.

        dentro do wamp tem: wamp/www/weather/insert_weather.php

        acho que o problema pode estar aqui:
        client.println(“GET /weather/insert_weather.php” + param + ” HTTP/1.1″);

        Tem algum lugar que voce me indica, para estudar sobre o client.println e esse GET?

          1. Obrigado Jose Cintra,

            Para fazer o caminho inverso, pegar a variável do banco e passar para o esp8266. Acredito que deva usar outra biblioteca, você tem ideia do que posso procurar?

Deixe uma resposta

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