1
resposta

Esp 8266 cp 2102 +DHT 22+ThingSpeak (IoT analytic)

Prezado e querido professor Ricardo, muito obrigado pelas dicas anteriores, por favor poderia ajudar-me a fazer um programa que leia temperatura e humidade de um DHT-22, aplicando os dados no ThingSpeak (TS) para analise ? Ja tentei varios programas na internet, me inscrevi no TS, coloco a chave e nao funciona. Troquei de esp8266 e DHT 22, mesmo assim nada, poderia ajudar-me ? Abaixo o programa que estou usando.

/* Este programa envia os dados coletados do DHT11 para a plataforma de IoT
* thingspeak.com
*/

//Include da lib de Wifi do ESP8266
#include "ESP8266WiFi.h"
//Include da lib do sensor DHT11 e DHT22
#include "DHT.h"

//Define do pino a ser utilizado no ESP para o sensor = GPIO4
#define DHT_DATA_PIN 2
#define DHTTYPE DHT22

//Definir o SSID da rede WiFi
const char* ssid = "xxxxxxxxxxxxx";
//Definir a senha da rede WiFi
const char* password = "xxxxxxxxxxxxxxx";

//Colocar a API Key para escrita neste campo
//Ela é fornecida no canal que foi criado na aba API Keys
String apiKey = "xxxxxxxxxxxxxxxxx";
const char* server = "api.thingspeak.com";

DHT dht(DHT_DATA_PIN, DHTTYPE);
WiFiClient client;

void setup() {
  //Configuração da UART
  Serial.begin(9600);
  //Inicia o WiFi
  WiFi.begin(ssid, password);

  //Espera a conexão no router
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  dht.begin();

  //Logs na porta serial
  Serial.println("");
  Serial.print("Conectado na rede ");
  Serial.println(ssid);
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());
}

void loop() {

  //Espera 20 segundos para fazer a leitura
  delay(20000);
  //Leitura de umidade
  float umidade = dht.readHumidity();
  //Leitura de temperatura
  float temperatura = dht.readTemperature();

  //Se não for um numero retorna erro de leitura
  if (isnan(umidade) || isnan(temperatura)) {
    Serial.println("Erro ao ler o sensor!");
    return;
  }

  //Inicia um client TCP para o envio dos dados
  if (client.connect(server,80)) {
    String postStr = apiKey;
           postStr +="&field1=";
           postStr += String(temperatura);
           postStr +="&field2=";
           postStr += String(umidade);
           postStr += "\r\n\r\n";

     client.print("POST /update HTTP/1.1\n");
     client.print("Host: api.thingspeak.com\n");
     client.print("Connection: close\n");
     client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
     client.print("Content-Type: application/x-www-form-urlencoded\n");
     client.print("Content-Length: ");
     client.print(postStr.length());
     client.print("\n\n");
     client.print(postStr);

     //Logs na porta serial
     Serial.print("Temperatura: ");
     Serial.print(temperatura);
     Serial.print(" Umidade: ");
     Serial.println(umidade);
  }
  client.stop();
}
1 resposta

Oi Paulo,

Não sei exatamente o que está acontecendo mas tenho uma sugestão:

Primeiro, tente publicar os dados fora do seu ambiente nodemcu. Use alguma extensão do chrome como Postman ou Rest Client (ou curl na linha de comando ou outra ferramenta HTTP) para montar a requisição HTTP e enviar para ThingSpeak. Assim está garantindo que não tem nenhum problema do lado ThinkSpeak.

Segundo passo é pegar a resposta no seu código C. No final da função loop() vc poderia adicionar:

  delay(10);
  // lendo a resposta
  Serial.println("Resposta:");
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

A resposta vai te ajudar entender o problema.

abs