Hola a tod@s, saludos de nuevo.
Os comento, al final me he olvidado de los ESP01, que dan un montón de problemas de estabilidad, al menos es mi experiencia, y por muy poco más me he hecho con un Nodemcu V1.0 y el salto ha sido una auténtica maravilla, unha sencillez absoluta a la hora de cargar el IDE de arduino y una gran estabilidad, puesto que la electrónica que lleva integrada el circuito te elimina un montón de fallos que tenías que suplir al ESP01.
El problema que me ha surgido ahora es que el DHT11 (en breve pondré un DHT22) me hace una lectura de Tª y Humedad intermitente y con un patrón fijo, a thingspeak me envía lecturas intermitentes y claro, no es fiable el sistema puesto que es para hacer un termostato. He colocado en una de las patas un led (como si fuera un relé) para activar una caldera, y cada vez que el DHT11 no lee los datos, el led se apaga, pasan unos segundos y se vuelve a encender, y así en un bucle infinito. No es problema de HW puesto que he probado varios DHT11 y conectados a distintas patillas del Nodemcu, además la patilla de datos del DHT11 lo tengo con una resistencia pullup......
Probablemente sea un fallo de SW, pero no consigo averiguar cual es el fallo, así que os dejo el código a ver si alguien puede iluminar mi camino.....
El código me funciona, leo datos de Tª/Hum y los envío a thingspeak, con una app creada con appinvetor leo los datos de Tª/Hum, estado del relé y la temperatura que seleccionada....
Os comento, al final me he olvidado de los ESP01, que dan un montón de problemas de estabilidad, al menos es mi experiencia, y por muy poco más me he hecho con un Nodemcu V1.0 y el salto ha sido una auténtica maravilla, unha sencillez absoluta a la hora de cargar el IDE de arduino y una gran estabilidad, puesto que la electrónica que lleva integrada el circuito te elimina un montón de fallos que tenías que suplir al ESP01.
El problema que me ha surgido ahora es que el DHT11 (en breve pondré un DHT22) me hace una lectura de Tª y Humedad intermitente y con un patrón fijo, a thingspeak me envía lecturas intermitentes y claro, no es fiable el sistema puesto que es para hacer un termostato. He colocado en una de las patas un led (como si fuera un relé) para activar una caldera, y cada vez que el DHT11 no lee los datos, el led se apaga, pasan unos segundos y se vuelve a encender, y así en un bucle infinito. No es problema de HW puesto que he probado varios DHT11 y conectados a distintas patillas del Nodemcu, además la patilla de datos del DHT11 lo tengo con una resistencia pullup......
Probablemente sea un fallo de SW, pero no consigo averiguar cual es el fallo, así que os dejo el código a ver si alguien puede iluminar mi camino.....
El código me funciona, leo datos de Tª/Hum y los envío a thingspeak, con una app creada con appinvetor leo los datos de Tª/Hum, estado del relé y la temperatura que seleccionada....
Código:
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ThingSpeak.h> //librería conexión a thingspeak
#include<ESP8266WiFi.h> //librería esp8266
#include <DHT.h> //librería del módulo de temperatura y humedad
#include <Adafruit_Sensor.h>
#define DHTTYPE DHT11
const int releCaldera = 14;
const int DHTpin = 12;
float histeresis = 1;
static unsigned long last_loop;
unsigned long int anteriorRefreshDatos = 0;
float temp= 0;
float humi= 0;
float tempDeseada = 00;
int calderaHabilitada;
int estadoRele = 0;
DHT dht(DHTpin, DHTTYPE);
IPAddress ip(192, 168, 1, 10);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
String apiKey = "XXXXXXXXXXXXXXXXXX";
const char* ssid = "XXXXXXXXXXXXX";
const char* password = "XXXXXXXXXXXXX*";
const char* server = "api.thingspeak.com";
unsigned long myChannelNumber = XXXXXXXXXXXXXXX;
const char * myWriteAPIKey = "XXXXXXXXXXXX";
WiFiClient client;
WiFiServer servidor(80);
void setup() {
//Relé de la caldera
pinMode(releCaldera, OUTPUT);
digitalWrite(releCaldera, LOW);
//Iniciamos puerto serie
Serial.begin(9600);
delay(5);
//Iniciamos el modulo wifi
WiFi.begin(ssid, password);
Serial.println();
Serial.println();
Serial.print("Connectandose a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// Static IP Setup Info Here...
WiFi.config(ip, gateway, subnet);
WiFi.mode(WIFI_STA);
while( WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connectado");
ThingSpeak.begin(client);
Serial.println("Cliente thingspeak iniciado");
servidor.begin();
Serial.print("Servidor iniciado, IP: ");
Serial.println(WiFi.localIP());
}
void refreshDatos(){
if (millis() > anteriorRefreshDatos + 20000){
anteriorRefreshDatos = millis();
float temp = dht.readTemperature();
float humi = dht.readHumidity();
if (calderaHabilitada = 1){
if (temp + histeresis >= tempDeseada && temp > 0) digitalWrite(releCaldera, LOW);
else if (temp < tempDeseada && temp > 0) digitalWrite(releCaldera, HIGH);
else digitalWrite(releCaldera, LOW);
}
Serial.println("Leyendo datos....");
Serial.println();
Serial.print("Temperatura deseada: ");
Serial.println(tempDeseada);
Serial.print("Temperatura: ");
Serial.println(temp);
Serial.print("Humedad: ");
Serial.println(humi);
int estadoRele = digitalRead(releCaldera);
if (estadoRele == LOW)
{
Serial.print("Estado relé caldera: ");
Serial.println("LOW");
} else {
Serial.print("Estado relé caldera: ");
Serial.println("HIGH");
}
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, humi);
ThingSpeak.setField(3, estadoRele);
ThingSpeak.setField(4, tempDeseada);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
Serial.println("Enviando datos...");
Serial.println();
}
}
void loop() {
//Lectura del sensor de temperatura
refreshDatos();
//Codigo servidor
WiFiClient clienteDeServidor = servidor.available();
if (!clienteDeServidor) { //Si no se ha conectado nadie, saltamos al inicio del codigo
return;
}
Serial.println("Nuevo cliente conectado");
while(!clienteDeServidor.available()){
//Esperamos hasta que el cliente haya solicitado o enviado datos
delay(1);
//De paso que estamos esperando al cliente... pues comprobamos si hemos de actualizar la temperatura.
refreshDatos();
}
// Read the first line of the request
String req = clienteDeServidor.readStringUntil('\r');
Serial.println(req);
clienteDeServidor.flush();
// Match the request
int val;
if (req.indexOf("/tempDeseada45") != -1){
tempDeseada = 45;
val = 1;
} else if (req.indexOf("/tempDeseada46") != -1){
tempDeseada = 46;
val = 1;
} else if (req.indexOf("/tempDeseada47") != -1){
tempDeseada = 47;
val = 1;
} else if (req.indexOf("/tempDeseada48") != -1){
tempDeseada = 48;
val = 1;
} else if (req.indexOf("/tempDeseada49") != -1){
tempDeseada = 49;
val = 1;
} else if (req.indexOf("/tempDeseada50") != -1){
tempDeseada = 50;
val = 1;
} else if (req.indexOf("/tempDeseada00") != -1){
tempDeseada = 00;
val = 0;
} else {
Serial.println("peticion invalida");
clienteDeServidor.stop();
return;
}
// Ponemos el pin a 0 o a 1, dependiendo de lo recibido
calderaHabilitada = val;
clienteDeServidor.flush();
delay(10);
}