Estación Meteorológica con ESP8266 y Thingspeak

Estación meteorológica inalámbrica que proporciona valores de Temperatura, Humedad, Presión y Luminosidad.
Es una estación de bajo costo pero puede ser de utilidad como proyecto o para pequeñas instalaciones (Ej. en el hogar).
Se puede alimentar desde una fuente de 5V o bien con panel solar y baterías recargables.
Dentro de la buena conducta en los servidores IoT, debemos realizar el ingreso de datos con intervalos lentos, ya que podríamos saturar el servidor.
Por ello se realiza un update cada 5 minutos, también se elige esta demora porque no es necesario refrescar tan rápido los valores climáticos.
 

Circuito 
Circuito 


Datos de la estación extraídos de Thingspeak (http://thingspeak.com/channels/128756).


Programa para el ESP8266 sobre ArduinoIDE:

  1. #include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
  2. #include <DNSServer.h>
  3. #include <ESP8266WebServer.h>
  4. #include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
  5. #include <SimpleDHT.h>
  6. #include <Wire.h>
  7. #include <Adafruit_BMP085.h>
  8. String apiKey = "APIKEY DE SU CUENTA THINGSPEAK";
  9. const char* server = "api.thingspeak.com";
  10. int pinDHT11 = D0;
  11. int timeOut = 0;
  12. SimpleDHT11 dht11;
  13. WiFiClient client;
  14. Adafruit_BMP085 bmp;
  15. void setup(){
  16.    WiFiManager wifiManager;
  17.    Serial.begin(115200);
  18.    delay(10);
  19.    wifiManager.resetSettings();
  20.    wifiManager.autoConnect("WS-Electgpl");
  21.    Serial.println("Estacion Conectada a Internet");
  22.    if(!bmp.begin()){
  23.       Serial.println("Error en BMP085");
  24.       while(1){}
  25.    }
  26. }
  27. void loop(){
  28.    byte temperatura = 0;
  29.    byte humedad = 0;
  30.    float luminosidad = analogRead(A0);
  31.    if(dht11.read(pinDHT11, &temperatura, &humedad, NULL)){
  32.       Serial.print("Error en DHT11");
  33.       return;
  34.    }
  35.    if(timeOut==300){
  36.       if(client.connect(server,80)){
  37.          String postStr = apiKey;
  38.          postStr +="&field1=";
  39.          postStr += String(luminosidad);
  40.          postStr +="&field2=";
  41.          postStr += String((float)bmp.readTemperature());
  42.          postStr +="&field3=";
  43.          postStr += String((int)humedad);
  44.          postStr +="&field4=";
  45.          postStr += String((float)bmp.readPressure()/100);
  46.          postStr += "\r\n\r\n";
  47.          client.print("POST /update HTTP/1.1\n");
  48.          client.print("Host: api.thingspeak.com\n");
  49.          client.print("Connection: close\n");
  50.          client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
  51.          client.print("Content-Type: application/x-www-form-urlencoded\n");
  52.          client.print("Content-Length: ");
  53.          client.print(postStr.length());
  54.          client.print("\n\n");
  55.          client.print(postStr);
  56.          Serial.println("% send to Thingspeak");
  57.       }
  58.       client.stop();
  59.       Serial.print("luminosidad: ");
  60.       Serial.print(luminosidad);
  61.       Serial.print(" | temperatura: ");
  62.       Serial.print((float)bmp.readTemperature());
  63.       Serial.print(" | humedad: ");
  64.       Serial.print(humedad);
  65.       Serial.print(" | presion: ");
  66.       Serial.println((float)bmp.readPressure()/100);
  67.       timeOut=0;
  68.    }
  69.    delay(1000);
  70.    timeOut++;
  71.    Serial.print("timeOut");
  72.    Serial.println(timeOut);
  73. }

Nueva versión de código basada en nueva biblioteca de ThingSpeak:


  1. #include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
  2. #include <DNSServer.h>
  3. #include <ESP8266WebServer.h>
  4. #include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
  5. #include <SimpleDHT.h>
  6. #include <Wire.h>
  7. #include <Adafruit_BMP085.h>
  8. #include "ThingSpeak.h"          //https://github.com/mathworks/thingspeak-arduino
  9. unsigned long myChannelNumber = NUMERO DE CANAL DE SU CUENTA THINGSPEAK;
  10. const char * myWriteAPIKey = "APIKEY DE SU CUENTA THINGSPEAK";
  11. int pinDHT11 = D0;
  12. int pinFACTORY = D6;
  13. int timeOut = 0;
  14. SimpleDHT11 dht11;
  15. WiFiClient client;
  16. Adafruit_BMP085 bmp;
  17. void handleButton(){
  18.    int debounce = 1000;
  19.    if(digitalRead(pinFACTORY)==LOW){
  20.       delay(debounce);
  21.       if(digitalRead(pinFACTORY)==LOW){
  22.          WiFiManager wifiManager;      
  23.          wifiManager.resetSettings();
  24.          delay(1000);
  25.          ESP.reset();
  26.       }
  27.    }
  28. }
  29. void setup(){
  30.    WiFiManager wifiManager;
  31.    ThingSpeak.begin(client);  // Initialize ThingSpeak
  32.    Serial.begin(115200);
  33.    pinMode(pinFACTORY, INPUT);
  34.    delay(10);
  35.    // wifiManager.resetSettings();
  36.    wifiManager.autoConnect("WS-Electgpl");
  37.    Serial.println("Estacion Conectada a Internet");
  38.    if(!bmp.begin()){
  39.       Serial.println("Error en BMP085");
  40.    }
  41. }
  42. void loop(){
  43.    byte temperatura = 0;
  44.    byte humedad = 0;
  45.    float luminosidad = analogRead(A0);
  46.    handleButton();
  47.    dht11.read(pinDHT11, &temperatura, &humedad, NULL);
  48.    /*
  49.    if(dht11.read(pinDHT11, &temperatura, &humedad, NULL)){
  50.       Serial.println("Error en DHT11");
  51.       return;
  52.    }
  53.    */
  54.    if(timeOut==300){
  55.       ThingSpeak.setField(1, luminosidad);
  56.       ThingSpeak.setField(2, (float)bmp.readTemperature());
  57.       ThingSpeak.setField(3, (int)humedad);
  58.       ThingSpeak.setField(4, (float)bmp.readPressure()/100);
  59.       ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  60.       Serial.print("luminosidad: ");
  61.       Serial.print(luminosidad);
  62.       Serial.print(" | temperatura BMP: ");
  63.       Serial.print((float)bmp.readTemperature());
  64.       Serial.print(" | temperatura DHT: ");
  65.       Serial.print(temperatura);
  66.       Serial.print(" | humedad: ");
  67.       Serial.print(humedad);
  68.       Serial.print(" | presion: ");
  69.       Serial.println((float)bmp.readPressure()/100);
  70.       timeOut=0;
  71.    }
  72.    delay(1000);
  73.    timeOut++;
  74.    Serial.print("timeOut");
  75.    Serial.println(timeOut);
  76. }

5 comentarios:

  1. if(dht11.read(pinDHT11, &temperatura, &humedad, NULL)){ por que en esta parte me sale error
    al compilar me sale esto 'dht' was not declared in this scope

    ResponderBorrar
    Respuestas
    1. Hola, tenes la biblioteca #include ? la tenes descargada en Arduino IDE?
      Saludos.

      Borrar
  2. Hola profe, llevo varios dias intentando que mi proyecto cargue en ThingSpeak, al final creo qye lo que no me funciona es el WiFiClient client; o el ThingSpeak.begin(client); ya que nunca entro al servidor de ThingSpeak.

    void connTS(){
    ThingSpeak.begin(client);// esto tambien esta en el setup, lo puse aqui para probar
    if(timeOut==300){
    if(client.connect(server,80)){
    ThingSpeak.setField(1, (int)luminosidad);
    ThingSpeak.setField(2, (int)temp);
    ThingSpeak.setField(3, (int)hume);
    ThingSpeak.setField(4, (int)tempF);
    ThingSpeak.writeFields(ChannelID, WriteAPIKey);
    Serial.println("¡Datos enviados a ThingSpeak! \n\n");
    }else{
    Serial.println("¡No entra a ThingSpeak! \n\n");
    }
    client.stop();
    timeOut=0;
    }
    delay(1000);
    timeOut++;
    Serial.print("timeOut");
    Serial.println(timeOut);
    }

    esta es mi conexion, tuve que hacerla aparte para poder probarla, hice de todos los metodos y nunca funciono, siempre entraba al else a los 300 timeOut.

    ResponderBorrar
  3. Hola profe cómo ago pa agregar el sensor de lluvia y en sensor de luz BH1750

    ResponderBorrar