Planta IoT com ESP8266 NodeMCU – Parte 1 212

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, 1 resistor de 100 ohms e 1 resistor de 200 ohms para o divisor de tensão, jumpers e protoboard. Você pode adquirir o Kit Planta IoT com ESP8266 NodeMCU na loja MakerHero, que tem todos os componentes necessários para este projeto.

Kit Planta IoT com NodeMCU

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 3,3V. Você pode tentar outros valores de resistores, cuidando para que a tensão de saída seja de 3,3V. 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:

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, 3.3V. Dessa forma,
//            para 3.3V, obtem-se (empiricamente) 978 como leitura de ADC
float FazLeituraUmidade(void)
{
    int ValorADC;
    float UmidadePercentual;

     ValorADC = analogRead(0);   //978 -> 3,3V
     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 
     //      |                                |   
     //      |                                |   
     //     _|_  978                         _|_ 0
     //
     //   (UmidadePercentual-0) / (100-0)  =  (ValorADC - 978) / (-978)
     //      Logo:
     //      UmidadePercentual = 100 * ((978-ValorADC) / 978)  
     
     UmidadePercentual = 100 * ((978-(float)ValorADC) / 978);
     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? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

212 Comentários

  1. Olá, estou tendo problemas com o projeto meu sensor sem estar em contato com a umidade ja me informa que esta em 95% de umidade ou até mesmo mais.

    1. Olá Christian.

      Provavelmente o seu sensor está saturado (com defeito) e acusando sempre uma umidade alta.

      Sugiro você testar outro sensor e garantir que o esquema de ligação está correto.

      Att.
      Vitor Mattos.
      Suporte Técnico MakerHero.

      1. Olá, Vitor
        Eu consegui sanar este problema mas agora tenho outro que é: o sensor mesmo em contato com o solo bem úmido ainda assim aponta uma umidade baixa .

        1. Olá Christian.

          Teste em cenários diferentes e veja se o valor apontado fica diferente, exemplo: solo 100% seco, ar livre, solo meio úmido e etc. Caso não apresente diferença, seria basicamente a mesma lógica que falei anteriormente, ou é algum erro de ligação ou o seu sensor está com defeito.

          Att.
          Vitor Mattos.
          Suporte Técnico MakerHero.

  2. Boa tarde pessoal.
    Estou procurando na internet porém estou com dificuldade de encontrar algo específico, gostaria de ver se conseguem me ajudar com algum tópico neste perfil talvez.
    Eu tenho um Raspberry Pi e um ESP8266 ambos conectados na mesma rede TCP/IP.
    Preciso com o Raspberry consultar algumas GPIO do ESP8266 via TCP/IP, mas não consigo achar nada próximo a isto pra me basear na internet.
    Alguém já elaborou algo assim que possa me dar uma luz?

    1. Olá,

      Por TCP/IP mais “cru” é mais difícil de achar implmentação. Em geral é mais comum usar o protocolo MQTT: https://www.makerhero.com/blog/raspberry-pi-controlar-o-nodemcu-parte-1/
      Mas localizei esta dissertação aqui que talvez te ajude: https://repositorio.unesp.br/bitstream/handle/11449/157422/ferreira_iv_me_bauru.pdf?sequence=5&isAllowed=y

      Abraços!
      Vinícius – Equipe MakerHero

  3. Olá, estou tendo dificuldades na leitura do sensor. Estou usando uma NodeMCU ESP-32S, a leitura do sensor na porta ADC está vindo SEMPRE 4095, não importa se estiver no solo ou não, se estiver seco ou meio úmido. Sempre retorna o valor máximo possível na leitura. Já tentei trocar o de pino, mas todos os pinos ADC sempre retornam 4095, então com base no cálculo a umidade sempre retorna 0% alguém saberia me explicar o motivo de sempre retornar 4095?

    Desde já agradeço, pela atenção.

    1. Olá Daniel,

      A montagem está conforme a figura? Os divisor resistivo precisa estar conectado ao A0 do sensor e ao GND, se for conectado ao VCC pode apresentar esse comportamento relatado por você.
      Caso você tenha um LED pode testar apenas alimentar o LED com o sensor, a parte positiva na saída A0 do sensor e a negativa no GND através de um resistor, que pode ser de 220 ohms mais ou menos. Ele deve variar a intensidade do LED conforme a umidade.

      Abraços!
      Vinícius – Equipe MakerHero

  4. Boa tarde Pessoal, td bem?

    Gostaria de uma luz em relação a um projeto que quero realizar, se possível, claro.

    Quero integrar o Esp32 com esse sensor de umidade de solo, e um display ILI9341 para visualizar os parâmetros de umidade, estou meio perdido em relação a conectividade física do sensor Soil com o Esp32 e o código para gerar os dados no display.

    O Esp32 já esta com conectividade ao ILI9341, só falta integrar o sensor
    Conseguem ajudar de alguma forma?

    1. Olá!

      A leitura é basicamente igual a do Arduino ou do ESP8266, a diferença é que o ESP32 possui mais pinos com conversor AD, como você pode conferir neste post aqui: https://randomnerdtutorials.com/esp32-adc-analog-read-arduino-ide/

      Abraços!
      Vinícius – Equipe MakerHero

  5. Olá gostaria de saber se eu também posso controlar a umidade do Solo através da Saída Digital desse mesmo sensor ?

    1. Olá João!

      Não, a saída digital serve para predeterminar um nível de umidade e ter um sinal digital nessa transição, para controlar a umidade seria necessário uma bomba, similar ao esquema na parte 4 do post:
      https://www.makerhero.com/blog/planta-iot-com-esp8266-nodemcu-parte-4/

      Abraços!
      Vinícius – Equipe MakerHero

      1. mas ela em teoria poderia ser utilizada ao invés da saída analógica, por exemplo se eu ajustar o trimpot manualmente para um nível resistência maior e que por consequência obter uma sensibilidade maior para quando o sinal for 1 o esp32 acionar a válvula e quando o sinal for 0 o esp32 não acionar.

        1. Olá!

          Sim, nesse sentido dá para fazer funciona sem problemas.

          Abraços!
          Vinícius – Equipe MakerHero

  6. Olá Boa Noite ! Estou tentando realizar uma comunicação parecida com a de vocês com o sensor higrômetro, ao invés de utilizar um ESP8266 estou utilizando o ESP32 WROOM para esta função. Acabei por ter alguns problemas relacionados as leituras do sensor que estão chegando no nível diferente do programado como por exemplo estou colhendo estes valores:

    Leitura ADC 4095 O limite deveria ser 978
    Umidade percentual 418,71% isso quando o sensor não esta no solo

    Leitura ADC 1053 O limite deveria ser 978
    Umidade percentual 107,67% quando coloco ele no solo molhado ou seja parcialmente úmido

    OBS: não sei se isso pode ser algum problema do hardware, mas já testei o sensor com o arduíno e funcionou perfeitamente, mas não com essa logica de programação

    gostaria apenas de uma opinião de vocês, isso já seria de grande ajuda. E mais uma vez muito Obrigado! a equipe do Felipe flop por todos os esclarecimentos anteriores.

    essa é a logica MQTT que estou utilizando para enviar o Tópico ao Bloker

    #include // biblioteca para conectar o ESP32 na rede WIFI
    #include // biblioteca que envia o sinal para o Bloker MQTT

    /* Definições – deep sleep */
    //#define FATOR_US_PARA_S 1000000 /* Fator de conversão de micro-segundos para segundos */
    //#define TEMPO_DEEP_SLEEP 30 /* Tempo para o ESP32 ficar em deep sleep (segundos) */

    int pino_a = 36; /* Pino ligado ao A0 do sensor e no Pino ADC do ESP32 o pino 36 esp32 wroom */
    int val_a; /* Armazena o valor lido do pino analógico */
    float UmidadePercentual;

    //WiFi
    const char* SSID = “-Guedes_Fibra_Odelicio-“; // SSID / nome da rede WiFi que deseja se conectar
    const char* PASSWORD = “03155677”; // Senha da rede WiFi que deseja se conectar
    WiFiClient wifiClient;

    //MQTT Server
    const char* BROKER_MQTT = “broker.hivemq.com”; // URL do broker MQTT que se deseja utilizar
    int BROKER_PORT = 1883; // Porta do Broker MQTT

    #define ID_MQTT “ESPN0PLACE” // Informe um ID unico e seu. Caso sejam usados IDs repetidos a ultima conexão irá sobrepor a anterior.
    #define TOPIC_PUBLISH “TOPICBotao” // Informe um Tópico único. Caso sejam usados tópicos em duplicidade, o último irá eliminar o anterior.
    PubSubClient MQTT(wifiClient); // Instancia o Cliente MQTT passando o objeto espClient

    //Declaração das Funções
    void mantemConexoes(); // Garante que as conexoes com WiFi e MQTT Broker se mantenham ativas
    void conectaWiFi(); // Faz conexão com WiFi
    void conectaMQTT(); // Faz conexão com Broker MQTT
    void enviaPacote(); // Faz o Envio do Pacote

    void setup() {

    pinMode(pino_a, INPUT);
    Serial.begin(115200); // MANTER

    conectaWiFi(); // MANTER
    MQTT.setServer(BROKER_MQTT, BROKER_PORT);
    }

    void loop() {
    mantemConexoes();
    enviaValores();
    MQTT.loop();
    }

    void mantemConexoes() {
    if (!MQTT.connected()) {
    conectaMQTT();
    }

    conectaWiFi(); //se não há conexão com o WiFI, a conexão é refeita
    }

    void conectaWiFi() {

    if (WiFi.status() == WL_CONNECTED) {
    return;
    }

    Serial.print(“Conectando-se na rede: “);
    Serial.print(SSID);
    Serial.println(” Aguarde!”);

    WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI
    while (WiFi.status() != WL_CONNECTED) {
    delay(2000);
    Serial.print(“.”);
    }

    Serial.println();
    Serial.print(“Conectado com sucesso, na rede: “);
    Serial.print(SSID);
    Serial.print(” IP obtido: “);
    Serial.println(WiFi.localIP());
    }

    void conectaMQTT() {
    while (!MQTT.connected()) {
    Serial.print(“Conectando ao Broker MQTT: “);
    Serial.println(BROKER_MQTT);
    if (MQTT.connect(ID_MQTT)) {
    Serial.println(“Conectado ao Broker com sucesso!”);
    }
    else {
    Serial.println(“Noo foi possivel se conectar ao broker.”);
    Serial.println(“Nova tentatica de conexao em 10s”);
    delay(10000);
    }
    }
    }

    void enviaValores()
    {
    val_a = analogRead(pino_a);
    Serial.print(“[Leitura ADC] “);
    Serial.println(val_a);

    //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
    // | |
    // | |
    // _|_ 978 _|_ 0
    //
    // (UmidadePercentual-0) / (100-0) = (ValorADC – 978) / (-978)
    // Logo:
    // UmidadePercentual = 100 * ((978-ValorADC) / 978)
    UmidadePercentual = 100 * ((978(float)val_a) / 978);
    Serial.print(“[Umidade Percentual] “);
    MQTT.publish(TOPIC_PUBLISH,”UmidadePercentual”);
    Serial.print(UmidadePercentual);
    Serial.println(“%”);
    delay(10000);

    /* Entra em deep sleep */
    //esp_sleep_enable_timer_wakeup(TEMPO_DEEP_SLEEP * FATOR_US_PARA_S); – FUNÇÃO DESATIVADA PARA TESTES
    //esp_deep_sleep_start();
    }

    att joao

    1. Olá João!

      O ADC do ESP32 é de 12 bits, então o valor a ser utilizado é 4095, não 978.

      Abraços!
      Vinícius – Equipe MakerHero

  7. Olá, a imagem do esquemático que informa a relação dos resistores não está presente, poderia me enviar ou me informar como fazer o divisor de tensão?

    1. Olá Arthur!

      Já corrigimos a imagem.

      Abraços!
      Vinícius – Equipe MakerHero

  8. Olá Pedro, Excelente artigo!
    Seria possível listar todos as redes wifi disponíveis para que o usuário possa selecionar e informar a senha e a chave do ThinkSpeak?

    Obrigado!

    1. Alexandre, primeiramente, muito obrigado pelo elogio!

      Eu nunca implementei um wifi scan com o ESP8266, porém creio que seja possível sim.

  9. olá a programação que você utilizou neste projeto também funciona em ESP01 ?

    1. Olá João Victor,

      Não irá funcionar, pois o ESP01 não tem o conversor analógico-digital disponível nos pinos de entrada e saída.

      Abraços!
      Vinícius – Equipe MakerHero

  10. pedro, boa noite.
    estou tendo problemas na implantacao desse projeto
    podemos conversar a respito ? meu zap é 48 999870181 e me chamo Marcos.
    sou de SC

    1. Olá Marcos,

      Quais problemas você está tendo?

      Abraços!
      Vinícius – Equipe MakerHero

      1. montei todo o projeto, verifiquei com um colega bastante experiente e nao funciona!
        ele fica sempre lendo e mostrando valores como 96 97 99 97 96
        ja fizemos um teste….pegamos o sensor e limpamos bem …o sensor liga 2 leds verdes ok ?
        entao, abrimos o serial para acompanhar a leitura e mergulhamos o sensor num copo com agua…..os valores deveriam mudar…..concorda ? mas continua 96 97 , 98 etc, ou seja nao esta funcionando e olha que ja montamos 3 vezes e revisamos tudimho….pode me ajudar ?
        agradeco imensamente.
        marcos

  11. ola, nao consigo compilar pois ele diz que

    ESP8266WiFi.h

    esta faltando

    onde consigo Pedro?

    1. Olá Marcos,

      Antes de carregar o código para a placa você precisa configurar a Arduino IDE para o NodeMCU. Dá uma olhadinha nesse post aqui: https://www.makerhero.com/blog/programar-nodemcu-com-ide-arduino/

      Abraço!
      Rosana – Equipe MakerHero

  12. nao estou conseguindo conectar com o thingspeak

    preciso de orientacao detalhade de como criar os campois certos dentro do usuario e como fazer o exemplo corretamente

    tem como me colocarem em contato com o Pedro Bertolete ?

    1. Olá Marcos,

      Acredito que esse post aqui vai te ajudar https://www.makerhero.com/blog/esp8266-com-thingspeak/

      Abraço!
      Rosana – Equipe MakerHero

  13. Legal, estou experimentando com IOT para usar na minha fazenda. Consegui completar a parte 1. Tive que pesquisar certas coisas como gerenciar bibliotecas no arduino para usar o ESP3266. mas consegui. Ah e o canal linkado aqui nao é mais público entao usei o meu próprio, como sugerido.

    Agora vou á parte 2

    Diana Marcondes Machado Salles
    1. ol, tambem tive que criar meu proprio canal mas nao sei como fonfigurar nada la dentro.
      pode me explicar detalhadamente ? meu zap é 48 999870181

    2. ISSO JA FIZ E TENHO CONTA NO TINSPEAK
      O CODIGO NAO OU PROJETO NAO ESTA FUNCIOANDO POIS JA MONNTEI UMAS 10 VEZES
      REVI, REVIVI, MU AMIGO VIU E TUDO….NAO ESTA FUNCIONANDO….PODE COLA O CODIGO AQUI NOVAMENTE SE HOUVE ALTERACOES ?

  14. Olá, quero fazer o projeto mas fiquei com uma dúvida, qual divisor de tensão usar, poderia passar especificações ?

    1. Fabio,

      Você pode calcular um divisor usando esta calculadora: https://www.arduinoecia.com.br/calculador-divisor-de-tensao-function

      Abraços!
      Diogo – Equipe MakerHero

  15. Gostei muito do projeto , estou esperando chegar meu esp32 Wi-Fi, acredito ser possível adicionar outras funcionalidades como configuração pra acionar ou não iluminação do Jardim por LDR, até mesmo ter um alimentador por horário para cachorros ou gatos.
    Forte abraço e obrigado por compartilhar, sou eletromecanico e novo nessa área de programação e microchip, mas deslubro todo o potencial…

    1. Marcio,

      E continue seus estudos!!

      Abraços!
      Diogo – Equipe MakerHero

  16. Olá, estou precisando fazer um desses, porém eu tenho o esp 32, e preciso subir as infos na plataforma konker. O senhor sabe algum meio para isso?

    1. Lucas, leia esse artigo aqui: https://www.makerhero.com/blog/plataforma-konker-iot-utilizando-a-plataforma-com-uma-raspberry-pi-zero-w/

      La uso MQTT para comunicar com a Konker. Basta acertar os tópicos MQTT para o ESP32 que vai funcionar.

  17. Arduino: 1.8.10 (Windows 10), Placa:”NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Disabled, All SSL ciphers (most compatible), 4M (no SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 115200″

    O sketch usa 274288 bytes (26%) de espaço de armazenamento para programas. O máximo são 1044464 bytes.
    Variáveis globais usam 27228 bytes (33%) de memória dinâmica, deixando 54692 bytes para variáveis locais. O máximo são 81920 bytes.
    esptool.py v2.6
    2.6
    esptool.py v2.6
    Serial port COM5
    Connecting…
    Traceback (most recent call last):
    File “C:\Users\AVELL 1555 MUV\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2/tools/upload.py”, line 25, in
    esptool.main(fakeargs)
    File “C:/Users/AVELL 1555 MUV/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/esptool\esptool.py”, line 2653, in main
    esp.connect(args.before)
    File “C:/Users/AVELL 1555 MUV/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/esptool\esptool.py”, line 460, in connect
    last_error = self._connect_attempt(mode=mode, esp32r0_delay=False)
    File “C:/Users/AVELL 1555 MUV/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/esptool\esptool.py”, line 440, in _connect_attempt
    self.sync()
    File “C:/Users/AVELL 1555 MUV/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/esptool\esptool.py”, line 379, in sync
    timeout=SYNC_TIMEOUT)
    File “C:/Users/AVELL 1555 MUV/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/esptool\esptool.py”, line 322, in command
    self.write(pkt)
    File “C:/Users/AVELL 1555 MUV/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/esptool\esptool.py”, line 285, in write
    self._port.write(buf)
    File “C:/Users/AVELL 1555 MUV/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/pyserial\serial\serialwin32.py”, line 323, in write
    raise writeTimeoutError
    serial.serialutil.SerialTimeoutException: Write timeout
    a porta serial serial.serialutil.SerialTimeoutException: Write timeout
    selecionada não existe ou sua placa não está conectada

    Este relatório teria mais informações com
    “Mostrar a saida detalhada durante a compilação”
    opção pode ser ativada em “Arquivo -> Preferências”

    ESTOU TENDO ESSES PROBLEMAS PARA RODAS O PROGRAMA, ALGUÉM PODE ME AJUDAR?

    1. Igor,

      Esse problema geralmente ocorre quando a placa não está conseguindo se comunicar com o computador. Verifique todos os cabos, as entradas USB do computador, etc. Tente diminuir a velocidade de gravação também!

      Abraços!
      Diogo – Equipe MakerHero

  18. Eu estou no primeiro semestre de ADS e fiquei super animado quando vi esse projeto e decidi fazer por conta própria para cuidar do meu bonsai, porém eu ainda não entendo muito de programação nem arduino.
    Montei o projeto físico e aparentemente deu tudo certo, apenas a programação que não foi…
    Apareceu o seguinte comentário quando eu fui carregar o programa:

    exit status 1
    ‘WiFiClient’ does not name a type

    Isso ocorre dentro das constantes e variáveis globais…

    Poderia me ajudar?

    1. Igor,

      Esse tipo de erro é comum quando a biblioteca não está instalada, ou está mas corrompida. Verifique todas as bibliotecas utilizadas (xxxxxx.h) e se não as tiver, instale-as.

      Abraços!
      Diogo – Equipe MakerHero

  19. Como enviar duas ou mais variaveis para o ThingSpeak via NODEMCU 8266, por exemplo como envio temperatura e umidade e índice de calor ? Desde ja agradeço

    1. #include
      uint8_t temperature, humidity, icalor;
      ThingSpeak.setField( 1, temperature);
      ThingSpeak.setField( 2, indicecalor);
      ThingSpeak.setField( 3, humidity);
      ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

      Consegui usando esta biblioteca e esses comando
      Contudo a função callback não esta pegando há como proceder?

      1. Ellyakin,

        Por favor, enviar sua dúvida no nosso fórum, para ficar mais organizado e fácil de ajudar 🙂

        Abraços!
        Diogo – Equipe MakerHero

  20. Olá Filipe Flop!

    Estou tendo duvidas e precisando de ajuda com um projeto que estou desenvolvendo para o meu TCC.
    A finalidade deste projeto seria acionar e monitorar uma lampada (ou um outro equipamento) ultilizando um Esp32.

    Otimizei este codigo para aplica-lo ao meu projeto, porem o ThinkSpeak parece que não envia ou não recebe a leitura do sensor.

    Meu código (“agora foi! 5”) está no github: “https://github.com/luizeletrica/helpmytcc”
    Lá há um arquivo README, onde descreve mais 2 duvidas, uma seria a um código de um outro post do Filipe Flop (Automação Residencial) e a outra seria relacionado ao NTP.

    Desde já agradeço!
    Att. Luiz Filipe
    [email protected]

  21. Meu projeto não está monitorando corretamente. Ele mostra apenas 97% de umidade, não importa o ambiente. Onde pode estar o erro? Será que é a conexão de internet que eu estou usando?

    1. Olá, Leonardo,

      Verifique as conexões e se o sensor está funcionando corretamente fazendo um teste apenas com ele.

      Abraços!
      Diogo – Equipe MakerHero

  22. Muito bom artigo, Pedro, parabéns!

    1. Carlos, muito obrigado!

  23. Estou tendo o mesmo problema que muitos aqui.

    Ele varia apenas em 99:
    [Leitura ADC] 3
    [Umidade Percentual] 99.69%
    [Leitura ADC] 2
    [Umidade Percentual] 99.80%
    [Leitura ADC] 9
    [Umidade Percentual] 99.08%

    No thingspeak, aparece sempre 99%.

    Não sei o que fazer. Alguém pode ajudar?

    1. ola, conseguiu resolver esse problema?

  24. Olá, estou com um problema quando ligo o sensor no divisor de tensão ele liga o led da saida digital e eu meço com o multimetro ta dando 0,100v e não oscila, oq pode ser ?

    1. Gustavo, algumas perguntas:

      1- Você seguiu corretamente o circuito proposto? Garanta que fez todas as ligações corretamente.
      2- Em qual ponto você está medindo esta tensão?

      Atenciosamente,
      Pedro Bertoleti

      1. Sim Pedro, segui exactamente o circuito do jeito que está no tutorial. Estou medindo a tensão da saída do divisor, entre os 2 resistores e o gnd.
        O módulo parece estar funcionando corretamente, pois quando meço a saida analogica sem o divisor ele varia a tensão conforme a umidade.

        1. Gustavo, eu faria as seguintes verificações:

          – Conferir se o circuito foi realmente montado corretamente (só pra ter ainda mais certeza)

          – Testar cada componente individualmente, uma vez que a causa pode ser algum componente defeituoso

          Atenciosamente,
          Pedro Bertoleti

  25. Boa tarde,
    Estou com o seguinte problema:

    esp8266:12: error: ‘WiFiClient’ does not name a type

    WiFiClient client;

    ^

    C:\Users\RS\Documents\Arduino\esp8266\esp8266.ino: In function ‘void EnviaInformacoesThingspeak(String)’:

    esp8266:28: error: ‘client’ was not declared in this scope

    if (client.connect(EnderecoAPIThingSpeak, 80))

    ^

    C:\Users\RS\Documents\Arduino\esp8266\esp8266.ino: In function ‘void FazConexaoWiFi()’:

    esp8266:51: error: ‘client’ was not declared in this scope

    client.stop();

    ^

    esp8266:55: error: ‘WiFi’ was not declared in this scope

    WiFi.begin(SSID_REDE, SENHA_REDE);

    ^

    esp8266:57: error: ‘WL_CONNECTED’ was not declared in this scope

    while (WiFi.status() != WL_CONNECTED)

    ^

    C:\Users\RS\Documents\Arduino\esp8266\esp8266.ino: In function ‘void loop()’:

    esp8266:124: error: ‘client’ was not declared in this scope

    if (client.connected())

    ^

    esp8266:135: error: ‘client’ was not declared in this scope

    if(!client.connected() &&

    ^

    exit status 1
    ‘WiFiClient’ does not name a type

    Este relatório teria mais informações com
    “Mostrar a saida detalhada durante a compilação”
    opção pode ser ativada em “Arquivo -> Preferências”

    1. Boa noite.

      Vejo duas possibilidades:

      1) Você alterou o código-fonte (em relação ao que está no artigo)? Se sim, poste-o aqui para que seja possível ver se há algum erro nele.

      2) Se o código-fonte está idêntico ao do post, há uma chance de as libs da placa NodeMCU não terem sido corretamente instaladas no seu computador. Confira se a instalação está correta seguinte este nosso tutorial: https://www.makerhero.com/blog/programar-nodemcu-com-ide-arduino/

      Atenciosamente,
      Pedro Bertoleti

      1. Boa noite…..Utilizei o mesmo código fonte, só que agora instalei outras bibliotecas e aparece a seguinte mensagem:

        Opções de compilação alteradas, recompilando tudo
        Archiving built core (caching) in: C:\Users\RS\AppData\Local\Temp\arduino_cache_372951\core\core_esp8266_esp8266_nodemcuv2_CpuFrequency_80,VTable_flash,FlashSize_4M1M,LwIPVariant_v2mss536,Debug_Disabled,DebugLevel_None____,FlashErase_none,UploadSpeed_115200_7c077f361ca2e28df74e2bfb43cf3917.a
        O sketch usa 252156 bytes (24%) de espaço de armazenamento para programas. O máximo são 1044464 bytes.
        Variáveis globais usam 28140 bytes (34%) de memória dinâmica, deixando 53780 bytes para variáveis locais. O máximo são 81920 bytes.
        Uploading 256304 bytes from C:\Users\RS\AppData\Local\Temp\arduino_build_871185/sketch_oct02a.ino.bin to flash at 0x00000000
        …………………………………………………………………….. [ 31% ]
        …………………………………………………………………….. [ 63% ]
        …………………………………………………………………….. [ 95% ]
        ……….. [ 100% ]

        como sou iniciante no esp estou com dúvida em saber se conectou ou não.

      2. Isso significa que compilou, reconheceu o NodeMCU e gravou o programa nele. Ou seja, pelo log enviado, deu tudo certo.

  26. Boa tarde,

    O NodeMCU pode ficar ligado 24hrs?

    Tem algum dado sobre vida útil (ficando ligado 24hrs )?

    Desde já Agradeço!

    1. Oscar, boa tarde.

      Sim, o NodeMCU pode ficar ligado durante 24h sem problemas.
      Quanto à vida útil, não há nenhum dado oficial, até porque isso é altamente dependente da forma como o NodeMCU é utilizado.
      Por exemplo: como qualquer equipamento que utilize memória Flash, se forem feitas sucessivas escritas na flash (até chegar a mais de 100.000, por exemplo), há uma grande chance do NodeMCU perder sua memória Flash.

      Atenciosamente,
      Pedro Bertoleti

      1. Bom dia,

        Obrigado pelo retorno.

        Caso essa perda de memoria acontecer, é reversível?

        Fazer algo para voltar a usar o nodemcu novamente?

        1. Caso você fazer o ciclo de escrita/leitura muitíssimas vezes (por exemplo, estas 100.000 vezes que falei), ja era. Não tem volta. Isso vale para QUALQUER dispositivo que use memória Flash.

  27. Grande Mestre..

    Estou com uma duvida..
    Estou fazendo um projeto na faculdade .. uso NodeMCU – PHP&mySql e Android Studio.. dentre os sensores, uso Sensor de Umidade do Solo c Valvula Solenoide, controle de PH, etc..
    Fiz minhas aplicacoes com NodeMCU, configurando-o como um Client, e a cada loop () o procedimento eh:
    >> ler um php e no MySQL e ele verificar em uma tabela “tb_todo” (exemplo) e ver o que precisa fazer,
    ou seja, tras um JSON, com quais GPIOs ele deve manipular atraves do retorno do Select..

    duvida:
    POREM!! Existe um delay (acredito que delay até obvio, pois ele conecta, entra no banco, traz o resultado de uma query, volta ao node, e manipula as GPIOs)..
    Porem esse delay esta para 4-6 segundos.. isso eh normal ou tem como mudar algo?

    Uma soluçao, tornei o NodeMCU como Server.. ficou muito rapido.. Delay menos de 0,5s..
    porem, tirei minha camada intermediaria, onde controlava todos os comandos no SQL, e agora eu tenho q fazer conexao direto ao NodeMCU , enviar um comando de manipulacao das GPIOs direto , atraves do meu APP(ANdroid).. o que antes eu com o APP, alimentava o MySQL apenas..

    como sou iniciante nessas ferramentas, gostaria muito de uma dica de quem tem mais experiencia no assunto!

    Obrigado, fiquem com DEUS..

    1. JotaErre, primeiramente obrigado pela leitura do artigo.

      A sua pergunta foge do escopo deste post. Sendo assim, sugiro que crie um post no forum MakerHero com este questionamento, assim as pessoas podem opinar, sugerir implementações e, sobretudo, aprender com seu projeto.

      Atenciosamente,
      Pedro Bertoleti

  28. Olá, gostaria de saber oque está acontecendo pois o meu só está retornando os valores 98 e 99 no ThingSpeak estou ultilizando o kit fornecido pelo tutorial.

    1. Olá Murillo!

      Que valores você está recebendo pela serial?

      Abraços!

      André – Equipe MakerHero

      1. Os valores que estou recebendo do ADC é de 39 e 40.
        Mesmo eu molhando o solo fica só nisso

      2. Acredito que consegui resolver. Mas agradeço pela atenção e o otimo trabalho seu.

        1. Valeu Murilo!

          Ficamos muito felizes em saber que nosso trabalho realmente ajuda as pessoas!

          Você já viu o nosso fórum? É um espaço aberto onde todos podem colaborar. Lá você pode postar seus projetos, tirar suas dúvidas, ajudar outras pessoas e contribuir para a comunidade 🙂

          https://www.makerhero.com/forum/

          Abraços!

          André – Equipe MakerHero

          1. André, tenho visto algumas pessoas com o mesmo problema nesse thread, acontece comigo a mesma coisa, meu ADC só recebe 38 e 39, as vezes 39 e 40… seja seco ou molhado, estou usando um resistor de 100 e outro de 220 ohms, respectivamente, que confere uma voltagem de 3,438V, sei que deveria usar 100 e 200 ohms para obter 3,3V. Sou newbie em eletrônica, será que isso pode ter relação com a invariabilidade do ADC ? Testei dois jogos de sensores diferentes e o resultado é o mesmo. Conhece alguém em São Paulo pra me prestar uma consultoria in locu nesse projetinho ?

        2. Amigo, como conseguiu ? Meu ADC só recebe 38 e 39… seja seco ou molhado, to usando resistor 100 e 220 ohms, respectivamente, que confere uma voltagem de 3,438V, sei que deveria usar 100 e 200 para obter 3,3V. Será que é isso ?

        3. Qual a solução dada?

  29. eu queria saber qual e o resistor de 100 e o de 200 é que no esquema mostra os dois mais não as cores ou o valor de cada um.

     

    1. Olá João!

      O de 100 está conectado ao terra.

      Abraços!

      André – Equipe MakerHero

  30. Tem vídeo de explicação?
    é que estou com duvida nos resistores.

    1. Olá João!

      Você tem que fazer um divisor de tensão que entre 5 V e saia 3,3 V.

      Existem diversos valores que podem ser utilizados. Dê uma olhada nesse link : https://www.arduinoecia.com.br/p/calculador-divisor-de-tensao-function.html

      Abraços!

  31. Fiz o projeto, porém a placa só envia o valor do sensor para o ThingSpeak uma única vez, e depois passa a repetir a seguinte mensagem a cada atualização da serial: “- Desconectado do ThingSpeak”

  32. Olá,

    Primeiramente, parabéns pelo post, pois, o aprendizado é sempre garantido.
    Em testes como postado, o meu código esta enviando apenas as duas primeiras leituras, as demais estou acompanhando no monitor, porém, não tenho sucesso de postagem.
    Consegue me auxiliar, se por ventura, houve alguma alteração no ThingSpeak ou coisa do tipo?
    Incluí no fonte as linhas abaixo para acompanhamento do tempo em execução, e pelo monitor vejo que não esta entrando na 2ª condição do loop.

    Código inserido:
    tempo = (millis() – lastConnectionTime);
    Serial.print(” -> Tempo: “);
    Serial.println(tempo);

    Leitura do monitor:
    [Leitura ADC] 860
    [Umidade Percentual] 31.00%
    -> Tempo: 416247.00

    – Desconectado do ThingSpeak

    [Leitura ADC] 860
    [Umidade Percentual] 31.00%
    -> Tempo: 417247.00

    – Desconectado do ThingSpeak

    [Leitura ADC] 860
    [Umidade Percentual] 31.00%
    -> Tempo: 418248.00

    – Desconectado do ThingSpeak

    [Leitura ADC] 857
    [Umidade Percentual] 32.00%
    -> Tempo: 419248.00

    – Desconectado do ThingSpeak

    [Leitura ADC] 860
    [Umidade Percentual] 31.00%
    -> Tempo: 420249.00

    – Desconectado do ThingSpeak

    [Leitura ADC] 857
    [Umidade Percentual] 32.00%
    -> Tempo: 421250.00

    – Desconectado do ThingSpeak

    Se puder me ajudar, (ou alguém), com essa situação, agradeço imensamente…!!

    1. Cleverson, boa tarde.

      Primeiramente, muito obrigado pela leitura e elogio!
      Sobre sua dúvida, você constatou isso usando EXATAMENTE o mesmo código do artigo? Ou alguma alteração (qualquer que seja) foi feita? Faço essas perguntas para entender melhor o porque de ocorrer problema no seu caso.

      Atenciosamente,
      Pedro Bertoleti

  33. Pedro boa tarde.

    Gostei muito desse sei peojeto, queria saber como consigo ao invés de mandar os dados para o ThingSpeak, mandar para meu Broker MQTT local que está rodando no Home Assistant.
    Queria enviar diretamente para meu Home Assistant e não precisar jogar num servidor na internet (ThingSpeak).

    Poderia me ajudar? Muito obrigado

  34. Blz?

    Vi que no esquema a alimentação do sensor está saindo do Vin. Acredito que essa “porta” seja para alimentação externa.

  35. olá, acompanhei o tutorial passo a passo e reproduzi da mesma maneira, exceto pelo divisor de tensão, que usei 220 ohms e 100 ohms (saída 3,438v). A saída do sinal do sensor em porcentagem não varia, a não ser de 99 porcento a 100 porcento, não importa se o sensor está em lugar úmido ou seco. Seria o divisor o problema ou outra coisa? obrigada desde já, parabéns pelo projeto, muito bom!

    1. Olá, bom dia.

      Primeiramente, seu divisor de tensão está colocando o ADC do NodeMCU numa situação perigosa, pois o máximo que este suporte é 3,3V e, pelo que entendi, a tensão nele está maior.

      Antes de verificar o porque do problema, recomendo você colocar o divisor exatamente como mostra o artigo, repetir o teste e informar aqui o que ocorreu neste teste com o divisor correto.

      Atenciosamente,
      Pedro Bertoleti

  36. Olá! Parabéns pelo artigo.

    Dúvida: você usou a própria IDE do Arduino?

    1. Diego, boa tarde.

      Muito obrigado pela leitura e pelo elogio.
      Respondendo à sua pergunta: sim, usei a Arduino IDE.

      Atenciosamente,
      Pedro Bertoleti

      1. Olá Pedro, obrigado pelo retorno. Abusarei de sua boa vontade e farei mais uma pergunta:

        Percebi que com esse seu código, o módulo está funcionando tanto como station como AP ( ele aparece na descoberta de rede wifi do meu note) . Qual configuração necessária para fazê-lo trabalhar apenas como station ? Sabe o comando para esse biblioteca, ou tem algo para me indicar?

        Obrigado

        1. Diego, meu código funciona somente como station (não fiz nada como AP).

  37. Usei esse código, criando uma conta própria no ThingSpeak e aparece esse erro no IDE Arduino:

    Arduino: 1.8.6 Hourly Build 2017/11/13 11:33 (Windows 10), Placa:”NodeMCU 1.0 (ESP-12E Module), 80 MHz, 9600, 4M (3M SPIFFS)”

    Archiving built core (caching) in: C:\Users\User\AppData\Local\Temp\arduino_cache_402643\core\core_esp8266_esp8266_nodemcuv2_CpuFrequency_80,UploadSpeed_9600,FlashSize_4M3M_0de89bcd161ff77f2054cf1685794f62.a
    O sketch usa 231705 bytes (22%) de espaço de armazenamento para programas. O máximo são 1044464 bytes.
    Variáveis globais usam 32400 bytes (39%) de memória dinâmica, deixando 49520 bytes para variáveis locais. O máximo são 81920 bytes.
    error: Failed to open COM1
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_open failed

    Este relatório teria mais informações com
    “Mostrar a saida detalhada durante a compilação”
    opção pode ser ativada em “Arquivo -> Preferências”

    Não consigo mudar a porta porque a opção de mudar em ferramentas fica cinza, como se a ESP não estivesse conectada.
    OBS.: Já configurei a placa como o link https://www.makerhero.com/blog/programar-nodemcu-com-ide-arduino/
    pede.

  38. Gostaria de saber como faço para postar mais de um filed chart
    fiz igual o codigo abaixo ele só posta uma vez no primeiro filed e depois só continua o segundo…
    Grato:

    if(!client.connected() &&
    (millis() – lastConnectionTime > INTERVALO_ENVIO_THINGSPEAK))
    {
    sprintf(FieldUmidade,”field1=%d”,UmidadePercentualTruncada);
    EnviaInformacoesThingspeak(FieldUmidade);
    }

    delay(1000);

    (millis() – lastConnectionTime > INTERVALO_ENVIO_THINGSPEAK))
    {
    sprintf(outramedida,”field2=%d”,outrovalor);
    EnviaInformacoesThingspeak(outramedida);
    }

    1. Conforme dito no artigo, o intervalo mínimo entre duas requisições HTTP / envios de informação para o ThingSpeak é de 15 segundos.

      No seu código, você tá enviando o valor de field 1 a cada quinze segundos, mas logo a seguir é tentado enviar o field 2. Desta forma, o valor de fireld2 nunca irá ser aceito no thingspeak (pois, da forma que está, precisaria ser feito 15 segundos depois do envio de field1).

      Entao você tem duas alternativas:
      1) enviar os dois field de uma vez:

      if(!client.connected() &&
      (millis() – lastConnectionTime > INTERVALO_ENVIO_THINGSPEAK))
      {
      sprintf(FieldUmidade,”field1=%d&field2=%d”,UmidadePercentualTruncada,outrovalor);
      EnviaInformacoesThingspeak(FieldUmidade);
      }

      2) Fazer um controle para enviar o valor de field2 após, no mínimo, 15 segundos do envio de field1

  39. Manoooooo demais demais….. vcs fazem um ótimo trabalho
    essa ajuda não tem em curso nenhum….

    Parabéns…….

  40. Manoooooo demais demais….. vcs fazem um ótimo trabalho
    essa ajuda não tem em curso nenhum….

    Parabéns Manosss….

  41. oi, amigo, parabens e obrigado por dividir seus conhecimentos, consegui enviar os dados para placa acompanhar pelo serial ele conecta na internet fica lendo a porcentagem mas não manda para o meu canal thinkspeak deixei ele aberto para pode verificar.. ID do canal: 351389

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

    //defines
    #define SSID_REDE “Amazon Ekos” //coloque aqui o nome da rede que se deseja conectar
    #define SENHA_REDE “3089682014” //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 = “1BVO9H3MGGI3R6WU”;
    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.1n”);
    client.print(“Host: api.thingspeak.comn”);
    client.print(“Connection: closen”);
    client.print(“X-THINGSPEAKAPIKEY: “+ChaveEscritaThingSpeak+”n”);
    client.print(“Content-Type: application/x-www-form-urlencodedn”);
    client.print(“Content-Length: “);
    client.print(StringDados.length());
    client.print(“nn”);
    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, 3.3V. Dessa forma,
    // para 3.3V, obtem-se (empiricamente) 978 como leitura de ADC
    float FazLeituraUmidade(void)
    {
    int ValorADC;
    float UmidadePercentual;

    ValorADC = analogRead(0); //978 -> 3,3V

    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
    // | |
    // | |
    // _|_ 978 _|_ 0
    //
    // (UmidadePercentual-0) / (100-0) = (ValorADC – 978) / (-978)
    // Logo:
    // UmidadePercentual = 100 * ((978-ValorADC) / 978)

    UmidadePercentual = 100 * ((978-(float)ValorADC) / 978);
    Serial.print(“[Umidade Percentual] “);
    Serial.print(UmidadePercentual);
    Serial.println(“%”);

    return UmidadePercentual;
    }
    void setup()
    {
    Serial.begin(9600);
    lastConnectionTime = 0;
    FazConexaoWiFi();
    Serial.println(“Sensor nivel Ivoglo via internet”);
    }

    //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);
    }

    1. Gustavo, acabei de fazer uma correção no código aqui no artigo.
      Por favor, atualize-o aí e repita seu teste.

    2. fiz correção com base na obs no post acima para inclui \n… mesmo assim não foi..

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

      //defines
      #define SSID_REDE “Amazon Ekos” //coloque aqui o nome da rede que se deseja conectar
      #define SENHA_REDE “3089682014” //coloque aqui a senha da rede que se deseja conectar
      #define INTERVALO_ENVIO_THINGSPEAK 15000 //intervalo entre envios de dados ao ThingSpeak (em ms)

      //constantes e variáveis globais
      char EnderecoAPIThingSpeak[] = “api.thingspeak.com”;
      String ChaveEscritaThingSpeak = “1BVO9H3MGGI3R6WU”;
      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, 3.3V. Dessa forma,
      // para 3.3V, obtem-se (empiricamente) 978 como leitura de ADC
      float FazLeituraUmidade(void)
      {
      int ValorADC;
      float UmidadePercentual;

      ValorADC = analogRead(0); //978 -> 3,3V

      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
      // | |
      // | |
      // _|_ 978 _|_ 0
      //
      // (UmidadePercentual-0) / (100-0) = (ValorADC – 978) / (-978)
      // Logo:
      // UmidadePercentual = 100 * ((978-ValorADC) / 978)

      UmidadePercentual = 100 * ((978-(float)ValorADC) / 978);
      Serial.print(“[Umidade Percentual] “);
      Serial.print(UmidadePercentual);
      Serial.println(“%”);

      return UmidadePercentual;
      }
      void setup()
      {
      Serial.begin(9600);
      lastConnectionTime = 0;
      FazConexaoWiFi();
      Serial.println(“Sensor nivel Ivoglo via internet”);
      }

      //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);
      }

      1. deu certo obrigado!!!

  42. Oi gente, seguinte.. não se esqueçam de colocar o “\n” nas linhas 31,32,34,35 e 38. Só consta o “n”, isso faz com que não haja o envio das informações para o ThingSpeak.

    Att.

    1. Conrado, muito obrigado por avisar!

      Acabei de corrigir

  43. Não consegui carregar o programa no Módulo ESP8266. Meu console do arduino não encontra o ESP8266. Como devo proceder?

    1. Complementando: onde acho o driver para o ESP8266 se conevtar com o programa ARDUINO 1.0.6?

      estou recebendo o seguinte erro:
      Tamanho do arquivo binário sketch: 15,022 (de no máximo 32,256 bytes)
      avrdude: stk500_getsync(): not in sync: resp=0x30

      1. Complemento 2: Usando o programa versão 1.8.5 e usando a opção Ferramentas – Obter informação da placa – recebo a seguinte resposta:

        BN: Placa não identificada
        VID: 1A86
        PID: 7523
        SN: Envie qualquer sketch para obter

        1. Mario, boa tarde.

          Siga este tutorial aqui: https://www.makerhero.com/blog/programar-nodemcu-com-ide-arduino/
          Ele ensina a programar o NodeMCU no Arduino IDE. Creio que se seguir este tutorial seus problemas acabarão.

          Atenciosamente,
          Pedro Bertoleti

  44. Pedro, excelente tutorial!!! Parabéns.

    Muito bom para iniciantes. Eu comprei o Planta IoT Kit com vocês.

    Eu fiz o tutorial, mas independente do solo o resultado é sempre o mesmo. Testei sem colocar no solo, em um solo seco e em um solo bastante encharcado e o resultado é sempre mesmo, apresentando abaixo:

    [Leitura ADC] 22
    [Umidade Percentual] 97.75%
    [Leitura ADC] 21
    [Umidade Percentual] 97.85%

    Será que o medidor está com problema?

    Eu usei 2 resistores de 100 ohms. No tutorial fala de 1 de 100 ohms e outro de 200 ohms, mas no circuito esquemático aparece 2 resistores de 100 ohms. Devo utilizar 2 resistores de 100 ohms mesmo?

    Estou tentando buscar possíveis causas para Leitura ADC não mudar.

    Obrigado pelo apoio.

    1. Wagner, tudo bem?

      Muito obrigado pela leitura e elogio!
      Olha, isso tá com cara ou de mau contato ou de ligação errada. Siga o circuito esquemático (ou seja, coloque 2 resistores de 100ohms) e verifique as ligações novamente (se possivel, substitua os fios / jumpers tambem).

      1. Olá Pedro,

        obrigado pela resposta. Eu retirei todos os jumpers e resistores.

        Depois comecei a montar o projeto do zero e resultou na mesma situação.

        Utilizando 2 resistores de 100ohms, segue o resultado dos testes:

        ADC – 21-22 Sem colocar no solo
        ADC – 21-22 solo seco
        ADC – 21-22 solo encharcado
        ADC – 21-22 dentro da água

        ADC – 9-10 Curto (Jumper nas 2 pontas do sensor)

        ADC – 8-9 Se remover o jumper da saída Vin do nodemcu
        ADC – 133-134 Se remover o jumper da saída GND do nodemcu que liga ao módulo antes do sensor
        ADC – 9-10 Se remover o jumper da saída A0 do nodemcu
        ADC – 9-10 Se remover o jumper do pino B32 da protoboard que vai para a saída A0 do módulo do sensor

        Alguma outra sugestão, ou teste a fazer? Obrigado pelo Apoio!

        1. Wagner, obrigado pelos testes!

          Há sim mais um teste a ser feito: coloque um potenciômetro no lugar do sensor e veja se ao variar o valor de resistência a medição do ADC muda também.
          Se mudar bastante, suspeito que seu sensor esteja com algum tipo de problema.

          1. Obrigado pela resposta Pedro!

            Na última sexta-feira consegui comprar um Potenciômetro de 10k e um outro sensor de Umidade do solo.

            1 – Primeiro Teste: Novo sensor de Umidade do solo. Utilizando 2 resistores de 100 ohms.

            Resultado: mesmo comportamento do outro sensor.

            ADC – 21-22 solo seco
            ADC – 21-22 solo encharcado
            ADC – 9-10 Curto (Jumper nas 2 pontas do sensor)

            2 – Segundo Teste: POTENCIOMETRO LINEAR 10K – CURSOR METAL. Utilizando 2 resistores de 100ohms.

            ADC – 8-9 Girando tudo para a Esquerda
            ADC – 9 Girando para o Meio
            ADC – 17-18-20-21 Girando tudo para a Direita – Depois de uns 15 segundos começou a cheirar queimado. Aí desliguei.

            Alguma sugestão?

            Obrigado pelo apoio!

          2. Wagner, como exatamente você ligou o potenciômetro no seu teste? Pergunto pois não era, um hipótese nenhuma, para cheirar queimado.

            O teste com um segundo sensor foi uma ideia muito legal. Como o resultado foi o mesmo, desconfio portanto do ADC do NodeMCU. Você tem um segundo NodeMCU para fazer um teste?

            Pedro Bertoleti
  45. Não estou conseguindo enviar as informações para o canal que criei no ThingsSpeak, coloquei a chave de escrita do canal como foi falado, e lá criei um campo chamada umidade. Pelo serial monitor consigo ver os valores sem problemas, mas meu gráfico não aparece nada, mesmo depois de um bom tempo de funcionamento.

    1. Thais, coloque seu código aqui. Sem ele fica complicado descobrir o problema ocorrido.

  46. Olá, primeiramente parabéns pelo projeto, muito bem explicado!
    Só fiquei com dúvida com relação à foto que você colocou do seu projeto montado, onde não é possível visualizar os resistores…

    1. Thais, boa noite.

      A foto realmente não está retratando o circuito real. Desculpa a falha.
      Sendo assim, guie-se pelo circuito esquemático, ele está 100% correto.

      Atenciosamente,
      Pedro Bertoleti

  47. Excelente projeto!
    Gostaria de saber se é possível utilizar o ThingSpeak para ler valores 0 e 1 e criar um gráfico. Se for possível, como?

    1. Cauê, bom dia.

      Primeiramente, muito obrigado pela leitura e elogio!
      É possível utilizar alguma placa para ler informações digitais (os 0 e 1 que você informou) e enviar ao ThingSpeak sim. Para isso, tomando como base o código deste post, bataria fazer algo semelhante a:

      char FieldDado[11];
      int ValorASerPassado;

      sprintf(FieldDado,”field1=%d”,ValorASerPassado);
      EnviaInformacoesThingspeak(FieldDado);

      Onde a variável “ValorASerPassado” deve ser igual a 0 ou 1.

      Mas atenção:

      1) Lembre-se que é possível enviar dados ao ThingSpeak de, no mínimo, 15 em 15 segundos. Portanto, se precisar enviar dados sucessivos com um intervalo de tempo menor que 15s, o ThingSpeak não atende ao que você precisa.

      2) Não é possível (até onde eu conheço pelo menos) fazer gráficos de onda quadrada no ThingSpeak.

      Atenciosamente,
      Pedro Bertoleti

  48. Bom dia pedro !

    sou um iniciante e montei o projeto utilizando na imagem da parte 1 2 resistores de 100 ohms que vem junto com o kit iot da MakerHero , esta correto ? outra coisa baixei o codigo e esta indicando um erro exit status 1
    stray ‘\303’ in program na linha Serial.println("Conectando-se à rede WiFi…"); .
    o que pode ser ?

    obrigado e parabens pela iniciativa

    1. Boa tarde!

      Quanto ao resistor, é isso mesmo. Eles são de 100 ohms e, nas ligações, basta seguir o circuito esquemático.
      Quanto ao erro exit status 1, tente reinstalar sua biblioteca do NodeMCU.

      Atenciosamente,
      Pedro Bertoleti

  49. Pedro!

    Muito bom seu post! Parabéns!

    Atualmente, utilizo como fonte de alimentação pro nodemcu a saída usb do meu notebook.
    Gostaria de saber se o nodemcu aguenta tensão 110v ou de 220v direta da tomada.

    Abraço!

    1. Hugo, bom dia.

      Muito obrigado pela leitura e pelo elogio!
      Respondendo sua pergunta, NÃO é possível alimentar o NodeMCU direto da tomada, nunca faça isso!
      Ele funciona com tensão de operação 5VDC (mesma tensão disponível na USB), não sendo tolerante a outros valores de alimentação.

      Atenciosamente,
      Pedro Bertoleti

      1. Entendi! Muito obrigado pela rapidez na resposta. Você teria alguma sugestão de conversor para isso?

        Abraço!

  50. Boa noite, percebi que a voltagem antes era ate 1V e agora mudou para 3,3V. O que houve?

    1. Geovani, bom dia.

      Percebemos que o conversor AD do NodeMCU aceita no máximo 3V3 (pois, antes do sinal chegar ao ESP8266 12-E, já há um divisor resistivo na placa do NodeMCU). Dessa forma, mudamos o divisor resistivo. Como benefícios desta mudança, isso confere maior resolução na medição.

      Atenciosamente,
      Pedro Bertoleti

  51. Boas, a Tensão de operação do sensor é entre 3,3 v a 5 v .

    se eu alimentar o sensor 3,3 v em de a 5 v não preciso das resistências para o A0 ?

    Cumprimentos

    1. Em teoria, sim. Porém, por 3,3V estar muito perto do limiar inferior de alimentação, não acho seguro operar com o sensor desta maneira.
      Por isso achei melhor utilizar 5V (assim é garantia que o sensor funcionará corretamente e compatibilizo o nível de tensão com o divisor resistivo).

      1. obrigado, posso utilizar uma resistencia de 120 ohms como a R1 e outra resistencia de 220 ohms como R2 para o sensor ?

  52. boa noite, eu alterei o parametro( String ChaveEscritaThingSpeak) no codigo para o meu e não aparece nada no canal que criei no gráfico.

    1. Pedro, boa tarde.

      Tem certeza que alterou somente isso? Se sim, com certeza você colocou a chave errada. Verifique e tente novamente. Lembre-se que os dados são enviados somente de 30 em 30 segundos (você poderia abaixar esse tempo até para de 15 em 15 segundos, menor que isso o ThingSpeak irá recusar seus dados).

      Atenciosamente,
      Pedro Bertoleti

      1. sim alterei so isso.

        Cumprimentos

        Obrigado

      2. Boa noite , eu estive a ver o seu projeto da planta parte 3 e la tem isto :

        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(“%”);

        mas no seu projeto da planta parte 2 tem isto:

        //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
        // | |
        // | |
        // _|_ 978 _|_ 0
        //
        // (UmidadePercentual-0) / (100-0) = (ValorADC – 978) / (-978)
        // Logo:
        // UmidadePercentual = 100 * ((978-ValorADC) / 978)

        qual é o valor que esta certo para converter para percentagem ?
        é que num tem 978 e no outro tem 418

        Cumprimentos

        1. Pedro, boa noite.

          Realmente houve um erro, acabei de corrigir em todos os artigos. O valor correto é 978. Desculpa a falha.

          Atenciosamente,
          Pedro Bertoleti

  53. 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

    1. Ivan, boa tarde.

      Pode ser que, no seu caso, os valores para calculo da umidade sejam diferentes (por alguma característica do sensor que está usando ou do solo medido). Obtenha os valores de leituras do ADC com solo seco e umido, e aplique-os na função LazLeituraUmidade(). Isso deverá resolver seus problemas.

      Atenciosamente,
      Pedro Bertoleti

  54. 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:UsersuserAppDataLocalTemparduino_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

  55. 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!

    1. Aliás, PEDRO! kkkkkk

    2. Carol, boa noite.

      Obrigado pelo feedback!
      Sobre sua pergunta, o próprio ThingSpeak possui um broker MQTT. Isso permitiria fazer o que deseja.

      Atenciosamente,
      Pedro Bertoleti

  56. 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!!!!

    1. 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

  57. 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

    1. Zeca, bom dia.

      Você seguiu o procedimento de instalação das bibliotecas corretamente? Nós aqui do blog temos um tutorial para isso neste link: https://www.makerhero.com/programar-nodemcu-com-ide-arduino/
      Sugiro refazer o procedimento segundo o tutorial.

      Atenciosamente,
      Pedro Bertoleti

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

    1. Vinicius, bom dia.

      Sem usar módulo algum Wi-Fi, não. Utilizando um módulo Wi-Fi (até mesmo o próprio nodemcu), é possível.

      Atenciosamente,
      Pedro Bertoleti

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

    1. Guilherme, boa tarde.

      Infelizmente, no ThingSpeak no eixo x só pode conter a escala de tempo.

      Atenciosamente,
      Pedro Bertoleti

  60. Qual programa vocês usam para desenhar os circuitos ?

    1. Jampierre, boa tarde.

      Utilizamos o Fritzing (https://fritzing.org/home/).

      Atenciosamente,
      Pedro Bertoleti

  61. 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

    1. 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

      1. 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!

        1. 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

          1. 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?

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

    1. Olá Jampierre

      Consegue sim, use a porta analógica A0 de sua placa para conectar o sensor.

      Abs.

      CK

  63. Muito bom o projeto. Parabens!!!

    1. Bruno, muito obrigado!

  64. 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/

    1. 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

      1. Obrigado pela ajuda Carlos!

    2. 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

      1. 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!

      2. 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!

  65. 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

    1. 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

      1. Muito obrigada Pedro!!! Vou tentar aqui!!!

      2. 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.

        1. 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

          1. 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?

            Almir Lamounier
    2. 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

  66. Olá Pedro,

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

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

      1. 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.

    2. 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

    3. Olá Leticia,

      Faz o seguinte: onde tem o cálculo:
      UmidadePercentual = 100 * ((978-(float)ValorADC) / 978);

      Você pega o valor de saída ADC do seu arduino sem estar medindo nada e coloca onde tem o valor 978. Neste momento será calibrado seus valores de Porcentagem (%).

      Mais lembrando o medidor não pode estar medindo nada.

  67. 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

    1. 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.

      1. Boa tarde!

        Obrigado Carlos, baixei o driver correto e deu boa!!!

        Abs!

  68. 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?

    1. 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

      1. Boa tarde Pedro!

        Grato pelo retorno, estarei analisando as possibilidades, e em paralelo farei o projeto do post, que é muito bacana…

        Att, Paulo

  69. 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!

    1. 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

  70. 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

    1. Marcelo, boa tarde.

      No seu caso, você precisaria de outra placa. Motivo: o ESP8266 ESP01 não possui entrada de conversor analógico-digital em sua pinagem.
      Você pode usar o NodeMCU mesmo ou algum outro ESP8266 que possua entrada de conversor analógico-digital (ADC).

      Atenciosamente,
      Pedro Bertoleti

      1. Entendo, Pedro.

        Agradeço o retorno.

        1. Marcelo, você pode realizar o teste conectando o ESP-01 diretamente a um Arduino, que possui ADC integrado. Abs

  71. 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.

    1. 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

      1. 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

      2. 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?

        1. 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

  72. 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?

    1. 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

  73. 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!

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

    Valeu!

    1. 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?

      1. Ficou claro, sim!
        Só mais uma dúvida, qual a tensão e a corrente para a fonte de alimentação?

        Muito obrigado!

        1. A tensão precisa ser 5V, já a corrente recomendo no mínimo 500mA.

          Na prática, um carregador de celular serve perfeitamente.

  75. 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

    1. Muito legal seu projeto! Se puder, compartilhe-o conosco, tenho certeza que muitos o utilizarão.

      1. Claro que sim Pedro, avise apenas onde compartilhar com você , Google drive por exemplo, e te envio toda documentação.

        Abs.

        1. Carlos, coloque no GitHub por favor. O bom é que, dessa forma, mais pessoas poderão ver e replicar o projeto.

          1. Bom dia Pedro,

            farei isso e depois posto o link aqui do projeto no GitHub

            Abs.

  76. Olá Pedro,

    Como sempre muito bom!!!

    Grande abraço!

    CK

    1. Carlos, muito obrigado!

      Abraço!

Trackbacks and Pingbacks

  1. […] dar personalidade em sua planta, ao ponto de te enviar uma mensagem lembrando sobre a rega. Clique AQUI e comece já a viver o […]

  2. […] dar personalidade em sua planta, ao ponto de te enviar uma mensagem lembrando sobre a rega. Clique AQUI e comece já a viver o […]

  3. […] em frente com o projeto do post anterior da Planta IoT com ESP8266 NodeMCU, neste post o projeto será aprimorado. Agora, sua planta irá […]

  4. […] continuidade ao projeto da planta IoT (Planta IoT com ESP8266 NodeMCU e Planta IoT com ESP8266 NodeMCU – Parte 2), agora chegamos à parte 3 do projeto: avisos […]

  5. […] Planta IoT com ESP8266 NodeMCU – Parte 1 (Monitoramento da planta IoT com ThingSpeak) […]