Planta IoT com ESP8266 NodeMCU – Parte 1

Planta IoT com ESP8266 NodeMCU – Parte 1

Hoje vamos começar uma série de posts que vão compor a nossa Planta IoT, uma planta conectada à internet que avisa no seu celular quando precisa ser regada! Irado, né? Para isso será necessário um sensor de umidade do solo para medir a umidade do solo da planta e um módulo wifi ESP8266 NodeMCU para enviar os dados para a internet, simples assim :)

Nessa primeira parte, vamos unir o ESP8266 NodeMCU ao ThingSpeak, mostrando como enviar dados da umidade da planta para a nuvem. Nos próximos posts você irá aprender como disparar as informações para o seu celular.

Planta IoT com ESP8266 NodeMCU

O módulo Wifi NodeMCU é uma das placas / plataformas mais populares para prototipação de soluções IoT. Conforme já mostrado neste blog, o NodeMCU funciona perfeitamente integrado ao MQTT, possibilitando controle e monitoramento remoto. Neste post, será mostrado como integrar o NodeMCU com outra grande plataforma de IoT: o ThingSpeak.

Como funciona o ThingSpeak?

O ThingSpeak é uma plataforma IoT que permite, sem custo algum, o upload de dados numéricos. Tais dados ficam armazenados na nuvem, onde então é permitido a visualização dos mesmos em gráficos em tempo real. Ou seja, se você deseja monitorar qualquer grandeza numérica (umidade, temperatura, pressão, etc.) à distância via Internet, o ThingSpeak é uma boa pedida. Vale ressaltar que o ThingSpeak está em constante evolução, portanto novos recursos podem ser adicionados a qualquer momento.

O ThingSpeak possui apenas uma limitação: o tempo entre upload de dados deve ser de, no mínimo, 15 segundos. Se isso for desobedecido, os dados enviados fora deste intervalo de tempo serão ignorados ou não registrados.

No projeto deste post os uploads serão feitos em intervalos de 30 segundos.

Upload de dados ao ThingSpeak

Para enviar dados ao ThingSpeak, faz-se uma requisição HTTP ao servidor do ThingSpeak. Uma requisição HTTP nada mais é que uma string (que contém as informações da requisição HTTP) enviada via socket TCP client (quem deseja fazer a requisição) a um socket TCP server (servidor que receberá a requisição, no caso o servidor do ThingSpeak) através da porta 80.

Outra informação importante é que, na requisição HTTP, constará uma chave de escrita para o canal ThingSpeak. Trata-se de uma string (única para cada canal), necessária para o ThingSpeak “saber” para qual canal direcionar os dados enviados.

Observação: o socket TCP estabelecido não tem grande tempo de vida. A conexão ao servidor termina assim que o mesmo envia a sua resposta à requisição. Ou seja, uma requisição HTTP foi feita para ter “vida curta”, sendo portanto destinado somente a um tráfego breve de dados entre socket TCP client e socket TCP server.

Planta IoT com ESP8266 NodeMCU

O projeto Planta IoT com ESP8266 NodeMCU consiste em fazer o NodeMCU enviar, a cada trinta segundos, a umidade percentual medida para um canal do ThingSpeak. Para este exemplo, criei um canal público (link), cuja  chave de escrita é KGFP6X4JQTJZFIAP. Entretanto, recomendo fortemente você criar sua conta no ThingSpeak e criar seu próprio lá, assim você pode se divertir a vontade!

03

Esquema Elétrico da Planta IoT

Em termos de hardware, será necessário um NodeMCU, um sensor higrômetro, cinco resistores de 1k para o divisor de tensão, jumpers e protoboard. A alimentação é feita pelo cabo USB (o mesmo cabo utilizado na programação do NodeMCU). O sensor higrômetro é lido através do único pino de ADC do NodeMCU (A0), o que permite a leitura da umidade percentual (0 – 100%).

O divisor de tensão é necessário pois a tensão de saída A0 do sensor fornece 5V, enquanto a entrada analógica do NodeMCU aceita no máximo 1V. Você pode tentar outros valores de resistores, cuidando para que a tensão de saída seja de 1V. Utilize a calculadora de divisor de tensão deste link para realizar os cálculos de acordo com os resistores que você tem em mãos.

Observe o circuito esquemático abaixo, que será usado no projeto Planta IoT:

Esquemático NodeMCU e Higrômetro

Programando o Módulo ESP8266 NodeMCU

Segue o código-fonte do projeto. Leia atentamente todos os comentários do mesmo.

#include <ESP8266WiFi.h>  //essa biblioteca já vem com a IDE. Portanto, não é preciso baixar nenhuma biblioteca adicional

//defines
#define SSID_REDE     " "  //coloque aqui o nome da rede que se deseja conectar
#define SENHA_REDE    "  "  //coloque aqui a senha da rede que se deseja conectar
#define INTERVALO_ENVIO_THINGSPEAK  30000  //intervalo entre envios de dados ao ThingSpeak (em ms)

//constantes e variáveis globais
char EnderecoAPIThingSpeak[] = "api.thingspeak.com";
String ChaveEscritaThingSpeak = "KGFP6X4JQTJZFIAP";
long lastConnectionTime; 
WiFiClient client;

//prototypes
void EnviaInformacoesThingspeak(String StringDados);
void FazConexaoWiFi(void);
float FazLeituraUmidade(void);

/*
 * Implementações
 */

//Função: envia informações ao ThingSpeak
//Parâmetros: String com a  informação a ser enviada
//Retorno: nenhum
void EnviaInformacoesThingspeak(String StringDados)
{
    if (client.connect(EnderecoAPIThingSpeak, 80))
    {         
        //faz a requisição HTTP ao ThingSpeak
        client.print("POST /update HTTP/1.1\n");
        client.print("Host: api.thingspeak.com\n");
        client.print("Connection: close\n");
        client.print("X-THINGSPEAKAPIKEY: "+ChaveEscritaThingSpeak+"\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(StringDados.length());
        client.print("\n\n");
        client.print(StringDados);
  
        lastConnectionTime = millis();
        Serial.println("- Informações enviadas ao ThingSpeak!");
     }   
}

//Função: faz a conexão WiFI
//Parâmetros: nenhum
//Retorno: nenhum
void FazConexaoWiFi(void)
{
    client.stop();
    Serial.println("Conectando-se à rede WiFi...");
    Serial.println();  
    delay(1000);
    WiFi.begin(SSID_REDE, SENHA_REDE);

    while (WiFi.status() != WL_CONNECTED) 
    {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connectado com sucesso!");  
    Serial.println("IP obtido: ");
    Serial.println(WiFi.localIP());

    delay(1000);
}

//Função: faz a leitura do nível de umidade
//Parâmetros: nenhum
//Retorno: umidade percentual (0-100)
//Observação: o ADC do NodeMCU permite até, no máximo, 1V. Dessa forma,
//            para 1V, obtem-se (empiricamente) 418 como leitura de ADC
float FazLeituraUmidade(void)
{
    int ValorADC;
    float UmidadePercentual;

     ValorADC = analogRead(0);   //418 -> 1.0V
     Serial.print("[Leitura ADC] ");
     Serial.println(ValorADC);

     //Quanto maior o numero lido do ADC, menor a umidade.
     //Sendo assim, calcula-se a porcentagem de umidade por:
     //      
     //   Valor lido                 Umidade percentual
     //      _    0                           _ 100
     //      |                                |   
     //      |                                |   
     //      -   ValorADC                     - UmidadePercentual 
     //      |                                |   
     //      |                                |   
     //     _|_  418                         _|_ 0
     //
     //   (UmidadePercentual-0) / (100-0)  =  (ValorADC - 418) / (-418)
     //      Logo:
     //      UmidadePercentual = 100 * ((418-ValorADC) / 418)  
     
     UmidadePercentual = 100 * ((418-(float)ValorADC) / 418);
     Serial.print("[Umidade Percentual] ");
     Serial.print(UmidadePercentual);
     Serial.println("%");

     return UmidadePercentual;
}
void setup()
{  
    Serial.begin(9600);
    lastConnectionTime = 0; 
    FazConexaoWiFi();
    Serial.println("Planta IoT com ESP8266 NodeMCU");
}

//loop principal
void loop()
{
    float UmidadePercentualLida;
    int UmidadePercentualTruncada;
    char FieldUmidade[11];
    
    //Força desconexão ao ThingSpeak (se ainda estiver desconectado)
    if (client.connected())
    {
        client.stop();
        Serial.println("- Desconectado do ThingSpeak");
        Serial.println();
    }

    UmidadePercentualLida = FazLeituraUmidade();
    UmidadePercentualTruncada = (int)UmidadePercentualLida; //trunca umidade como número inteiro
    
    //verifica se está conectado no WiFi e se é o momento de enviar dados ao ThingSpeak
    if(!client.connected() && 
      (millis() - lastConnectionTime > INTERVALO_ENVIO_THINGSPEAK))
    {
        sprintf(FieldUmidade,"field1=%d",UmidadePercentualTruncada);
        EnviaInformacoesThingspeak(FieldUmidade);
    }

     delay(1000);
}

Resultado da Planta IoT no ThingSpeak

Após carregar o código fonte para o NodeMCU, abra o Serial Monitor (com baudrate em 9600 bauds) para acompanhar o que o NodeMCU está fazendo. Abra o site do canal também (no caso deste exemplo, o canal https://thingspeak.com/channels/137361), assim pode-se ver, em tempo real, cada chegada dos dados da nossa Planta IoT no gráfico.

O gráfico resultante será algo semelhante a figura abaixo:

Gráfico de umidade percentual x tempo

Gráfico de umidade percentual x tempo

 Sugestão

Este post utilizou-se de um canal ThingSpeak pré-definido / já criado. É fortemente recomendado que, ao reproduzir este projeto, você crie seu próprio canal ThingSpeak (o que implica em alterar a chave de escrita no código-fonte). Se isto não for feito, você estará fazendo upload de dados em um canal “público” / de demonstração, o que pode não garantir o funcionamento que deseja.

- Planta IoT com ESP8266 NodeMCU – Parte 2 – Mensagem via Twitter
Planta IoT com ESP8266 NodeMCU – Parte 3 – Informações sobre umidade do solo

Gostou ? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo), comente e visite nossa loja FILIPEFLOP!

9
Planta IoT com ESP8266 NodeMCU – Parte 1
24 votos, 5.00 classificação média (100% pontuação)

Engenheiro eletricista formado pela Faculdade de Engenharia de Guaratinguetá (FEG - UNESP), trabalha com desenvolvimento de firmware. Colaborador do site FILIPEFLOP.

Compartilhe este Post

73 Comentários

  1. Ivan - 2 de abril de 2017

    Olá, boa noite!

    Parabéns pelo trabalho e obrigado por compartilhar.

    Estou testando o projeto aqui para ter noção do funcionamento do mesmo, e estou com algumas dúvidas:
    – Mesmo com o sensor de umidade não estando em contato com o solo, a umidade medida é de quase 100%;
    Isso está correto?

    – Coloquei o sensor em contato com um solo praticamente seco, e mesmo assim ele envia sinais de umidade entre 90 e 98%

    A principio segui o passo a passo mostrado no post, mas se alguém souber de um detalhe a mais e puder me esclarecer essas dúvidas, fico grato.

    Obrigado, abraços, até mais

  2. Gustavo dos santos - 1 de abril de 2017

    Olá! comprei os sensores para tentar fazer em casa, mas ao enviar o código para o Modulo wi-fi NodeMcu aparece a seguinte mensagem:

    O sketch usa 232101 bytes (22%) de espaço de armazenamento para programas. O máximo são 1044464 bytes.
    Variáveis globais usam 32532 bytes (39%) de memória dinâmica, deixando 49388 bytes para variáveis locais. O máximo são 81920 bytes.
    Uploading 236256 bytes from C:\Users\user\AppData\Local\Temp\arduino_build_744551/planta_por_thing_speak.ino.bin to flash at 0x00000000
    error: failed sending 1072 bytes
    .error: failed sending 1044 bytes
    .error: failed sending 1040 bytes
    .error: failed sending 1040 bytes
    .error: failed sending 1069 bytes
    .error: failed sending 1087 bytes
    .error: failed sending 1083 bytes
    .error: failed sending 1059 bytes
    .error: failed sending 1063 bytes
    .error: failed sending 1058 bytes
    .error: failed sending 1052 bytes
    .error: failed sending 1049 bytes
    .error: failed sending 1068 bytes
    .error: failed sending 1071 bytes
    .error: failed sending 1068 bytes
    warning: espcomm_send_command: didn’t receive command response
    warning: espcomm_send_command(FLASH_DOWNLOAD_DATA) failed
    warning: espcomm_send_command: wrong direction/command: 0x01 0x03, expected 0x01 0x04
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed

  3. Carol - 26 de março de 2017

    Hugo, parabéns pelo post!

    Gostaria de saber se o thingspeak poderia enviar comandos para desligar um LED, por exemplo. Como isso poderia ser feito?

    Obrigada!

  4. Carlos Alexandre - 23 de março de 2017

    Queria saber se é possivel usar o Módulo Wireless Nrf24l01+ ao invés deste q vcs usaram. Quem poder me ajudar eu agradeço muito,. VLW!!!!

    • Pedro Bertoleti - 24 de março de 2017

      Carlos, bom dia.

      O Nrf24l01+ trata-se de um módulo para comunicação RF (com recursos de endereçamento, checagem de integridade de dados, etc) 2.4GHz, não um módulo para comunicação Wi-Fi 802.11b/g/n. Logo, objetivando simplesmente utilizar o Nrf24l01+ no lugar do NodeMCU, é impossível.

      Porém, se for fazer um gateway contendo conectividade Wi-Fi ou ethernet e um Nrf24l01+ (ou seja, numa “arquitetura de comunicação” diferente da abordada neste artigo), é possível.

      Atenciosamente,
      Pedro Bertoleti

  5. Concorra a um Kit completo de Sensores | Blog FILIPEFLOP - 21 de março de 2017

    […] tal fazer uma planta IoT que envia mensagem para o seu celular quando precisa ser regada? Ou um alarme de incêndio para sua […]

  6. Zeca - 17 de março de 2017

    Quando mando compilar o programa dá esse erro acusando que essa biblioteca não existe, como posso solucionar esse problema?
    Eu comprei o modulo ESP8266 a vocês, eu ja consegui conectar ele criando um webserver, o problema esta ocorrendo agora que estou tentando criar o programa para conectar ao thingspeak.
    fatal error: ESP8266WiFi.h: No such file or directory

    #include

  7. vinicius - 8 de março de 2017

    É possivel fzer com um arduino uno ou leonardo no lugar do nodemcu?

  8. Guilherme de Oliveira Antonio - 12 de fevereiro de 2017

    Olá amigo, no thingspeak só é possivel no eixo x a escola de tempo?
    é possivel colocar outro componente que aja em cima dele?

  9. Jampierre - 6 de janeiro de 2017

    Qual programa vocês usam para desenhar os circuitos ?

  10. Hugo Tavares - 9 de dezembro de 2016

    Bom dia,
    Se eu não utilizar o circuito divisor de tensão e colocar o sensor de umidade do solo nas portas A0, 3,3V para a alimentação e GND, terei valores imprecisos demais?
    Muito obrigado e excelente projeto

    • Pedro Bertoleti - 9 de dezembro de 2016

      Hugo, bom dia.

      Se você não colocar o divisor de tensão, você queimará a entrada analógica (havendo chance de, inclusive, danificar o NodeMCU por completo).

      Atenciosamente,
      Pedro Bertoleti

      • Hugo Tavares - 9 de dezembro de 2016

        Entendi. Se para um projeto seja necessário um relé, é possível conectar o sensor na porta 3.3V para a alimentação e o relé na porta Vin? Valeu!

        • Carlos - 9 de dezembro de 2016

          Oi Hugo,

          A entrada VIN é como seu nome diz, (IN)uma entrada, por tanto ela somente serve para alimentar o modulo com +5V por exemplo, não pode ser usada como saída, você pode alimentar um sensor com o 3.3V e GND e usar outro GPIO para alimentar um rele, caso seu rele somente funcione com 5V devera usar essa tensão, e um transistor como driver.

          No meu canal tenho alguns vídeos que tratam sobre isso.
          https://www.youtube.com/channel/UCLZ2cga6-yqz5jtI-XvE7PA

          Abs.

          CK

          • Hugo Tavares - 9 de dezembro de 2016

            O projeto possui um relé e o sensor de umidade do solo. Para o relé, usaria o VIN, GND e uma porta digital. Para o sensor, usaria 3,3V, GND e a porta analógica com o divisor de tensão. Seria possível?

  11. Jampierre - 4 de dezembro de 2016

    Consigo fazer o projeto substituindo a placa Módulo WiFi ESP8266 NodeMcu ESP-12E pela Placa WeMos D1 R2 Wifi ESP8266 ??

  12. bruno - 1 de dezembro de 2016

    Muito bom o projeto. Parabens!!!

  13. Artur Felipe Veloso - 8 de novembro de 2016

    Primeiramente parabéns pelo projeto, bela inovação!

    Tenho várias dúvidas quanto ao módulo, entre elas:
    – Ele só precisa de uma fonte de alimentação e se conectar no wifi da casa? Não precisa necessariamente estar conectando via USB no computador? (sem a necessidade de um programa rodando no computador, no caso)

    – Ele se conecta diretamente na API do thinkspeak? pode enviar como receber dados dela? Eu tenho uma API, poderia fazer com que o módulo se conectasse na minha do mesmo jeito?

    – Esse tempo de 15 segundos de delay, é um padrão de troca de dados ou apenas um padrão do think speak? pq no caso, se ele puder se conectar com a minha API, eu poderia botar um padrão menor.. seria isso?

    Obrigado desde já!! o/

    • Carlos kwiek - 8 de novembro de 2016

      Olá Artur,

      O Pedro já ira responder claro, mas somente para ajudar.

      Tenho várias dúvidas quanto ao módulo, entre elas:
      Ele só precisa de uma fonte de alimentação e se conectar no wifi da casa? Resposta: SIM!
      Não precisa necessariamente estar conectando via USB no computador? (sem a necessidade de um programa rodando no computador, no caso) Resposta: NÃO PRECISA!

      Ele se conecta diretamente na API do thinkspeak? Resposta: SIM!
      pode enviar como receber dados dela? Resposta: SIM
      Eu tenho uma API, poderia fazer com que o módulo se conectasse na minha do mesmo jeito? Resposta, NÃO CONHEÇO SUA API.

      Veja meu canal no Thingspeak https://thingspeak.com/channels/159893 onde dei uma incrementada no proposto pelo Pedro, ela atualiza a cada 15 milissegundos, não é uma regra padrão, mas im uma solicitação de todos os sites que hospedam aplicações IOT para não carregar o servidor com informação desnecessária, dependo da aplicação deveria ser até maior este intervalo.

      Abs.

      CK

    • Pedro Bertoleti - 8 de novembro de 2016

      Artur, boa tarde.

      Primeiramente, muito obrigado pela leitura e elogio! Segue abaixo as respostas às suas perguntas:

      Pergunta: Ele só precisa de uma fonte de alimentação e se conectar no wifi da casa? Não precisa necessariamente estar conectando via USB no computador? (sem a necessidade de um programa rodando no computador, no caso)
      Resposta: Exato, somente precisa de uma fonte de alimentação (que pode ser feita vi Vin e GND ou mesmo pela porta USB do módulo) e se conectar ao WiFi. O computador só é necessário na hora de gravar o programa no módulo (ou seja, funcionamento idêntico a um Arduino comum).

      Pergunta: Ele se conecta diretamente na API do thinkspeak? pode enviar como receber dados dela? Eu tenho uma API, poderia fazer com que o módulo se conectasse na minha do mesmo jeito?
      Resposta: O módulo faz uma requisição HTTP a uma API do ThingSpeak sendo possível tanto o envio de informações (o que foi retratado neste projeto) quanto recepção. Não entendi o que você disse com “tenho uma API”

      Pergunta: Esse tempo de 15 segundos de delay, é um padrão de troca de dados ou apenas um padrão do think speak? pq no caso, se ele puder se conectar com a minha API, eu poderia botar um padrão menor.. seria isso?
      Resposta: o ThingSpeak exige que o tempo entre envio de informações seja no mínimo 15 segundos. Ou seja, envios com intervalos inferiores a 15 segundos serão descartados. Isso independe da forma de como você envia os dados ao ThingSpeak.

      Atenciosamente,
      Pedro Bertoleti

      • Artur Veloso - 9 de novembro de 2016

        Obrigado CARLOS KWIEK e Pedro Bertoleti! Todas as dúvidas foram esclarecidas, só faltou a da minha API, para explicar melhor:
        Eu to fazendo um site (API) muitoparecido com o thinkspeak, porém com outras finalidades e fins, nela eu já consigo fazer as mesmas requisições como o do thinkspeak, só que atualmente eu to fazendo para um programa que roda no computador, e do programa é mandado para o Arduino via USB, minha dúvida é se, eu uso a requisição HTTP para a minha API, se eu vou poder tanto pegar dados da placa, como mandar comandos para a API, (como ocorre com o thinkspeak). ?? Pois se der certo, eu faço essa conexão direto, sem precisar de um programa, um computador e uma conexao USB no meio.. hehe

        Grande abraço!

      • Artur Felipe Veloso - 9 de novembro de 2016

        Obrigado CARLOS KWIEK e Pedro Bertoleti! Todas as dúvidas foram esclarecidas, só faltou a da minha API, para explicar melhor:
        Eu to fazendo um site (API) muitoparecido com o thinkspeak, porém com outras finalidades e fins, nela eu já consigo fazer as mesmas requisições como o do thinkspeak, só que atualmente eu to fazendo para um programa que roda no computador, e do programa é mandado para o Arduino via USB, minha dúvida é se, eu uso a requisição HTTP para a minha API, se eu vou poder tanto pegar dados da placa, como mandar comandos para a API, (como ocorre com o thinkspeak). ?? Pois se der certo, eu faço essa conexão direto, sem precisar de um programa, um computador e uma conexao USB no meio.. hehe

        Grande abraço!

  14. Gabrielle - 7 de novembro de 2016

    Olá,

    Estou seguindo este exemplo de comunicação com o site ThingSpeak utilizando o NodeMcu, porém preciso enviar dois dados, pois estou usando um sensor de corrente e outro de tensão. Como poderia aproveitar este código? pois vi que ele manda uma String de dados, mas eu teria que mandar uma informação por vez não é?

    Obrigada

    • Pedro Bertoleti - 7 de novembro de 2016

      Gabrielle, boa tarde.

      Primeiramente, obrigado pela leitura!
      Para enviar mais de um dado, você precisa primeiro criar um numero de graficos / charts no seu canal do ThingSpeak (numero de charts = numero de informações que deseja enviar, pois o ThingSpeak não permite plotar mais de uma informação por gráfico). Uma vez criado, modifique a seguinte linha:

      sprintf(FieldUmidade,”field1=%d”,UmidadePercentualTruncada);

      Por exemplo, se você deseja enviar 2 informações, faça:

      sprintf(StringAlvo,”field1=%d&field2=%d”,dado1,dado2);

      Dessa forma, o dado1 irá ser enviado no chart 1 e o dado 2 no chart 2 do seu canal.

      Atenciosamente,
      Pedro Bertoleti

      • Gabrielle - 7 de novembro de 2016

        Muito obrigada Pedro!!! Vou tentar aqui!!!

      • Almir Lamounier - 1 de fevereiro de 2017

        Olá Pedro,

        Primeiramente, parabéns pelo ótimo post.
        Semelhante à Gabrielle, eu preciso enviar 3 dados referentes à medição de 3 sensores. Fiz a seguinte linha de código:

        —-
        char StringAlvo[11];

        //verifica se está conectado no WiFi e se é o momento de enviar dados ao ThingSpeak
        if(!client.connected() && (millis() – lastConnectionTime > 10000))
        {
        sprintf(StringAlvo,”field1=%d&field2=%d&field3=%d”,dado1,dado2,dado3);
        EnviaInformacoesThingspeak(StringAlvo);
        }
        —-

        No entanto, os dado que aparecem na Serial são diferentes daqueles que são mostrados no ThingSpeak. A data e horário estão corretos, mas os 3 dados dos sensores estão completamente distorcidos. A princípio, pensei que o erro era na declaração desta variável: char StringAlvo[11], mas ainda não encontrei uma solução.

        Alguma ideia do que pode estar acontecendo? Desde já agradeço.

        • Pedro Bertoleti - 1 de fevereiro de 2017

          Almir, boa tarde.

          A primeira vista, percebi que o problema pode estar no tamanho da string. para 3 informações, 11 bytes me parece pouco. Eu experimentaria fazer e verificar três coisas:

          1) Aumente o tamanho deste array para um tamanho que com certeza caiba as informações / string inteira (passar de 11 bytes para 100, por exemplo).
          2) dado1, ado2 e dado3 são variaveis do tipo inteiro mesmo?
          3) Antes de enviar, printa a string no SerialMonitor e verifica se as leituras estão coerentes.

          Atenciosamente,
          Pedro Bertoleti

          • Almir Lamounier - 1 de fevereiro de 2017

            Bingo!

            A variável temperatura estava declarada como float, como deve ser. Este era o problema. Então não é possível informar a temperatura com casas decimais no ThingSpeak?

    • Carlos - 7 de novembro de 2016

      Olá Gabriele,

      No meu canal tenho alguns exemplos e tutoriais, talvez possam lhe ser uteis.

      https://www.youtube.com/user/kwiekbrasil/search?query=thingspeak

      Att.

      CK

  15. Leticia - 31 de outubro de 2016

    Olá Pedro,

    Gostaria de entender o cálculo que vc fez para encontrar o valor de ADC = 418…
    Obrigada.

    • Leticia - 31 de outubro de 2016

      Poderia me dizer também como funciona esse sensor higrometro? Ele mede a resistencia do solo (quantidade de sais na água, condutividade etc?)

      • Pedro Bertoleti - 31 de outubro de 2016

        Leticia, quanto ao funcionamento do sensor não sei te respondr ao certo, mas analisando o circuito do mesmo (olhando as trilhas e componentes) eu imagino que ele funcione medindo a condutividade.

    • Pedro Bertoleti - 31 de outubro de 2016

      Leticia, boa tarde.

      Primeiramente, obrigado pela leitura do post.
      Quanto ao valor 418, eu o consegui empiricamente (coloquei o sensor numa situação onde havia a menor umidade detectável possível no meu ambiente).
      Pode parecer incorreto, mas em sistemas que envolvem leituras analógicas de sensores, isso é necessário (ou seja, dificilmente haverá um valro “fixo” para todas as situações). Isto porque cada ambiente de uso / teste é diferente do outro (pode ser que, no seu caso, a umidade zero seja um valor ligeiramente diferente de 418, então você deve ajustar o valor para uma melhor medição). Grosso modo, este processo é chamado de ajuste de indicação (isso é real, acontece em sistemas industriais).

      Se não ficou claro, por favor me avise que explico de outra maneira.

      Atenciosamente,
      Pedro Bertoleti

  16. Paulo Luis Steinhauser - 17 de setembro de 2016

    Boa tarde, também fiz o mesmo procedimento, mas no meu compila (a compilação em si se dá sem erros) e depois aparece os seguintes erros, sendo que a porta está correta, e tudo mais, porém o SO não reconhece o dispositivo por algum motivo, já troquei de cabo, de computador, de versão do IDE, Sistema Operacional, e nada adiantou. Aparentemente o dispositivo é “estranho” ao Sistema Operacional. Alguém poderia me dar uma ideia do que acontece?

    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08
    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed

    Att, Paulo

    • Carlos Kwiek - 17 de setembro de 2016

      Paulo,

      O erro é de comunicação com a placa,
      warning: espcomm_send_command: wrong direction/command: 0x00 0x08, expected 0x01 0x08

      warning: espcomm_sync failed
      error: espcomm_open failed
      error: espcomm_upload_mem failed

      Assegure´se de ter selecionado na IDE a placa certa, alem da porta, alem de porta você tem que selecionar a placa, no caso das ESP8266 da nodecmu a placa escolhida deve ser a Geniric Board, mas no caso da Spakfun deve ser escolhida a placa dele, que tem um mcu da Espressif, caso não tenha as placas em sua lista você pode baixar, no site da Sparkfun existe o procedimento para baixar placas.

      Boa sorte.

      Abs.

  17. Paulo Luis Steinhauser - 5 de setembro de 2016

    Boa noite! Partindo deste exemplo, posso ao invés de utilizar este módulo, usar o ESP8266 WiFi Shield Sparkfun? Sendo que tenho mais sensores para coletar dados e ainda, necessito enviar dados para um site e armazenar os valores num banco de dados?

    • Pedro Bertoleti - 7 de setembro de 2016

      Paulo, boa tarde.

      Infelizmente, nunca utilizei este shield, sendo assim não consigo te responder com 100% de certeza.
      Entretanto, comunicando via comandos AT (enviados pela UART) com o ESP8266 eu tenho certeza que dá pra fazer o que você deseja. Portanto, 99% de chance de dar certo, lembrando que para isso seria um software totalmente diferente em relação ao deste post.
      Ficou claro?

      Atenciosamente,
      Pedro Bertoleti

  18. Gerbert Santos - 5 de setembro de 2016

    Muito maneiro o post!! Acabei de adquirir os componentes necessários para montar o projeto! Vou implementar em uma pequena horta na minha casa. Fico no aguardo da segunda parte, assim que estiver funcionando mandarei fotos para o canal!

    • Pedro Bertoleti - 7 de setembro de 2016

      Gerbert, boa tarde.

      Muito obrigado pela leitura e pelo elogio! Muito legal saber que você irá utilizar o projeto! Ficamos no aguardo das fotos, estamos ansiosos para ver seu projeto em ação.

      Atenciosamente,
      Pedro Bertoleti

  19. Marcelo Creimer - 29 de agosto de 2016

    Bom dia,

    Gostaria de realizar este experimento, mas não tenho a placa NodeMCU citada. Entretanto, tenho o seguinte:
    – Módulo WiFi ESP8266 ESP-01
    – Adaptador para Módulo WiFi ESP8266 ESP-01
    – Conversor de Nível Lógico I2C 3,3-5V Bidirecional

    Portanto, pergunto, é preciso realizar o experimento com o material acima, ou preciso comprar outra placa?

    Obrigado

  20. Breno Mayder - 28 de agosto de 2016

    Olá Pedro, estou seguindo seus projetos e os reproduzindo para aprendizado, estou com um problema e queria tirar uma dúvida, testei com três sensores de umidade e todos só retornam valores entre 98 e 97, mesmo molhando bastante a terra, é possível que seja problema no sensor?
    Fiz teste enviando valores estáticos e os dados foram recebidos perfeitamente, então acredito que não seja problema no ESP8266.

    • Pedro Bertoleti - 28 de agosto de 2016

      Breno, boa noite.

      Primeiramente, muito obrigado pela leitura!
      No seu caso, pode ser que o sensor esteja com um valor de ADC lido em 0% de umidade ligeiramente diferente de 418 (isto pode realmente acontecer, todo sistema que envolve ADC normalmente precisa de um “ajuste fino” mesmo).
      Recomendo que você varie ligeiramente (uma ou duas unidades, para cima e para baixo) este limite de 418 até chegar a 100% de umidade neste caso mais extremo. Desta forma, você estará ajustando a medição do sensor à sua situação.

      Atenciosamente,
      Pedro Bertoleti

      • Breno Mayder - 28 de agosto de 2016

        Parece que é isso mesmo, quando eu retorno apenas o ValorADC meu retorno fica com valor entre 06 e 08.

        Veja, https://thingspeak.com/channels/149990

      • Breno Mayder - 29 de agosto de 2016

        Olá Pedro, me desculpe incomodar mais uma vez, eu não obtive sucesso em meus experimentos, aumentei e abaixei o limite consideravelmente mas mas os valores continuam estabilizados e na maioria das vezes muito altos.

        Notei que em seu gráfico resultante, os valores também variam muito pouco entre 72 e 74, os meus variam entre 97 e 99 tanto com o modulo submerso em um solo bem úmido quanto ele fora do solo.

        Em seu gráfico o modulo esta em um ambiente úmido ou seco ou este resultado já foi com a alteração de seco para úmido?

        • Pedro Bertoleti - 29 de agosto de 2016

          Breno, bom dia.

          Eu testei o AD em todo seu range, até os extremos (ou seja, de 0 a 1.00V). Para isolarmos o problema, faça o seguinte teste por favor:

          – Coloque 1.00V no pino A0 no NodeMCU. Este terá que ler umidade 0% (ou próximo disso)
          – Coloque 0V (GND) no pino A0 no NodeMCU. Este terá que ler umidade 100% (ou próximo disso)

          Se isto não ocorrer, provavelmente a entrada A0 de seu NodeMCU está danificada.
          Se acontecer conforme previsto, há chances do sensor não estar respondendo conforme você espera.

          Atenciosamente,
          Pedro Bertoleti

  21. Roni Alvarenga - 26 de agosto de 2016

    Olá, que ótimo artigo! Unindo meus dois hobbies! Como eu faria para realizar a aferição de vários vasos com o mesmo módulo?

    • Pedro Bertoleti - 28 de agosto de 2016

      Roni, muito obrigado p-ela leitura e pergunta!

      Sem utilizar circuitos adicionais (ou seja, somente com o NodeMCU) não é possível. Para o que você deseja, é necessário você utilizar algum analog multiplexer (74HC4051, por exemplo).

      Atenciosamente,
      Pedro Bertoleti

  22. Paulo Luis Steinhauser - 25 de agosto de 2016

    Boa noite pessoal!

    Também tenho alguns canais no thingspeak (como o https://thingspeak.com/channels/143073 ), estou ainda vendo algumas situações para trabalhar com alguns sensores onde os dados devem ser carregados na plataforma bem como num Banco de Dados, onde acesso numa página PHP e posso criar algumas funções. A questão é, no momento estou carregando dos dados através de alguns Ethernet Shields. Eu possuo um wifi shield CC3000, e gostaria de fazer o upload de dados de forma mais simples, mas tem um problema, não estou conseguindo com êxito, mesmo com os parâmetros de rede e do site estarem corretos, deve haver alguma diferença entre o wifi shield e o CC3000. Alguém conseguiu fazer ou tem alguma ideia?

    Abraços a todos!

  23. Hugo Tavares - 24 de agosto de 2016

    Projeto muito bom!
    É possível substituir os 5 resisitores de 1k por 1 de 5.1k?

    Valeu!

    • Pedro Bertoleti - 25 de agosto de 2016

      Hugo, boa tarde.

      Primeiramente, muito obrigado pela leitura e elogio.
      Respondendo sua pergunta, a substituição não pode ser feita. O motivo é que o AD do NodeMCU suporta, no máximo 1.00V. Como o sensor higrômetro disponibiliza em sua saída analógica uma tensão de 0 até 5V, é necessário utilizar um divisor de tensão.
      Dessa forma, pra poder “aproveitar” exatamente toda a faixa de 0 até 1,00V (toda a faixa de tensão aceitável pelo AD do NodeMCU), fiz o divisor com cinco resistores iguais.
      Ficou claro?

  24. Carlos Kwiek - 24 de agosto de 2016

    Tenho alguns canais no ThingSpeak, neste por exemplo https://thingspeak.com/channels/135498 eu controlo Umidade e Temperatura ambiente do meu apartamento, visualizo em Charts e Gauge os valores, e ainda coloco a minha localização geográfica, recebo no twitter mensagem de alerta caso supere os limites estabelecidos por mim.

    Todos os componentes usados foram adquiridos aqui, vou montar o que você sugere aqui agora também.

    Obrigado.

    Grande abraço!

    CK

  25. Carlos Kwiek - 24 de agosto de 2016

    Olá Pedro,

    Como sempre muito bom!!!

    Grande abraço!

    CK

Deixe uma resposta