Comunicacion Arduino, WIFI con ESP8266
Publicado: 21 Mar 2015 17:49
Hola tras trastear unos días con el modulo ESP8266 he conseguido ver los valores de un sensor DHT22 en una pagina del navegador, tras mucho investigar e seguido los pasos de esta pagina y modificando el programa ya se pueden mandar datos del arduino al navegador: http://www.prometec.net/servidor-web-esp8266/
Ahora me queda conseguir que no deje de transmitir al de un periodo corto de tiempo y conseguir que no me haga falta tener conectado el arduino al ordenador con el cable serie, ya que si lo desconectas aunque este alimentado deja de funcionar al no tener comunicación serial
Hay va el codigo por si os sirve
#include "DHT.h"
#define DHTPIN 12 // Establecemos la entrada digital en la que tenemos
// conectada la salida data del sensor.
#define DHTTYPE DHT22 // Definimos el sensor que vamos a usar DHT 11
DHT dht(DHTPIN, DHTTYPE); // Configuramos la entrada y el sensor
String ordenes[]=
{ //"AT+RST", // Resetea el modulo esta comentado porque no funciona no se porque
"AT+CWMODE=3", // Para poner el modulo en modo 3
"AT+CIFSR" , // Consulta la dirección IP del modulo
"AT+CIPMUX=1", // Habilita varias conexiones simultaneas
"AT+CIPSERVER=1,80", // Arranca un servidor web con el numero de servicio = 1 en el puerto 80
"END" // Para reconocer el fin de los comandos AT
};
void setup()
{ Serial3.begin(19200);
Serial.begin(19200);
dht.begin();
delay (1000);
int index = 0;
while(ordenes[index] != "END")
{ Serial3.println(ordenes[index++]);
while ( true)
{ String s = GetLineWIFI();
if ( s!= "") Serial.println(s);
if ( s.startsWith("no change"))
break;
if ( s.startsWith("OK"))
break;
if ( s.startsWith("ready"))
break;
// if (millis()-T >10000) break;
}
Serial.println("....................");
}
}
void loop()
{ while (Serial3.available() >0 )
{ char c = Serial3.read();
if (c == 71)
{ Serial.println("Enviada Web Request");
webserver();
delay(500);
}
}
}
void http(String output)
{
Serial3.print("AT+CIPSEND=0,"); // AT+CIPSEND=0, num
Serial3.println(output.length());
if (Serial3.find(">")) // Si recibimos la peticion del mensaje
{ Serial.println(output);
Serial3.println(output); //Aqui va el string hacia el WIFI
delay(10);
while ( Serial3.available() > 0 )
{ if ( Serial3.find("SEND OK") ) // Busca el OK en la respuesta del wifi
break;
}
}
}
void webserver(void)
{ http("<!DOCTYPE HTML>");
http("<html>");
http("<head><title>LECTURAS ANALOGICAS.</title>");
http("<meta http-equiv=\"refresh\" content=\"15\"></head>");
http("<body><h1> Situacion Ambiente</h1>");
//convertir lectura del sensor temperatura de float a string
float Temp = dht.readTemperature(); //Guardamos la lectura de temperatura del sensor en una variable tipo float
char valtemp[10]; //Creamos un array de 10 elementos tipo char
dtostrf(Temp,4,2,valtemp); //Convertimos la variable Temp en tipo char y la guardamos en el array valTemp,
//el primer valor de la funcion dtostrf es que convertir de float a char en este caso la variable Temp,
//el segundo valor es un entero que indica el numero de caracteres minimo, incluyendo el punto decimal,en este caso 4
//el tercer valor es la precisión, el numero de decimales detras del punto en este caso 2
//el cuarto valor es donde almacenar el resultado, en este caso en el array tipo char valtemp
//convertir lectura del sensor humedad de float a string
float Hum = dht.readHumidity();
char valhum[10];
dtostrf(Hum,4,2,valhum); //Convertimos la variable Temp en tipo char y la guardamos en el array valTemp,
//el primer valor de la funcion dtostrf es que convertir de float a char en este caso la variable Hum,
//el segundo valor es un entero que indica el numero de caracteres minimo, incluyendo el punto decimal, en este caso 4
//el tercer valor es la precisión, el numero de decimales detras del punto en este caso 2
//el cuarto valor es donde almacenar el resultado, en este caso en el array tipo char valhum
//Escribe los valores del senor en el navegador
http("Sensor ");
http( String("DHT22"));
http(" temperatura ");
http(String(valtemp));
http("<br />");
http("Sensor ");
http( String("DHT22"));
http(" Humedad ");
http(String(valhum));
http("<br />");
http("<p><em> La página se actualiza cada 15 segundos.</em></p></body></html>");
delay(1);
Serial3.println("AT+CIPCLOSE=0");
//delay(500);
}
String GetLineWIFI()
{ String S = "" ;
if (Serial3.available())
{ char c = Serial3.read(); ;
while ( c != '\n' ) //Hasta que el caracter sea intro
{ S = S + c ;
delay(25) ;
c = Serial3.read();
}
return( S ) ;
}
}
Ahora me queda conseguir que no deje de transmitir al de un periodo corto de tiempo y conseguir que no me haga falta tener conectado el arduino al ordenador con el cable serie, ya que si lo desconectas aunque este alimentado deja de funcionar al no tener comunicación serial
Hay va el codigo por si os sirve
#include "DHT.h"
#define DHTPIN 12 // Establecemos la entrada digital en la que tenemos
// conectada la salida data del sensor.
#define DHTTYPE DHT22 // Definimos el sensor que vamos a usar DHT 11
DHT dht(DHTPIN, DHTTYPE); // Configuramos la entrada y el sensor
String ordenes[]=
{ //"AT+RST", // Resetea el modulo esta comentado porque no funciona no se porque
"AT+CWMODE=3", // Para poner el modulo en modo 3
"AT+CIFSR" , // Consulta la dirección IP del modulo
"AT+CIPMUX=1", // Habilita varias conexiones simultaneas
"AT+CIPSERVER=1,80", // Arranca un servidor web con el numero de servicio = 1 en el puerto 80
"END" // Para reconocer el fin de los comandos AT
};
void setup()
{ Serial3.begin(19200);
Serial.begin(19200);
dht.begin();
delay (1000);
int index = 0;
while(ordenes[index] != "END")
{ Serial3.println(ordenes[index++]);
while ( true)
{ String s = GetLineWIFI();
if ( s!= "") Serial.println(s);
if ( s.startsWith("no change"))
break;
if ( s.startsWith("OK"))
break;
if ( s.startsWith("ready"))
break;
// if (millis()-T >10000) break;
}
Serial.println("....................");
}
}
void loop()
{ while (Serial3.available() >0 )
{ char c = Serial3.read();
if (c == 71)
{ Serial.println("Enviada Web Request");
webserver();
delay(500);
}
}
}
void http(String output)
{
Serial3.print("AT+CIPSEND=0,"); // AT+CIPSEND=0, num
Serial3.println(output.length());
if (Serial3.find(">")) // Si recibimos la peticion del mensaje
{ Serial.println(output);
Serial3.println(output); //Aqui va el string hacia el WIFI
delay(10);
while ( Serial3.available() > 0 )
{ if ( Serial3.find("SEND OK") ) // Busca el OK en la respuesta del wifi
break;
}
}
}
void webserver(void)
{ http("<!DOCTYPE HTML>");
http("<html>");
http("<head><title>LECTURAS ANALOGICAS.</title>");
http("<meta http-equiv=\"refresh\" content=\"15\"></head>");
http("<body><h1> Situacion Ambiente</h1>");
//convertir lectura del sensor temperatura de float a string
float Temp = dht.readTemperature(); //Guardamos la lectura de temperatura del sensor en una variable tipo float
char valtemp[10]; //Creamos un array de 10 elementos tipo char
dtostrf(Temp,4,2,valtemp); //Convertimos la variable Temp en tipo char y la guardamos en el array valTemp,
//el primer valor de la funcion dtostrf es que convertir de float a char en este caso la variable Temp,
//el segundo valor es un entero que indica el numero de caracteres minimo, incluyendo el punto decimal,en este caso 4
//el tercer valor es la precisión, el numero de decimales detras del punto en este caso 2
//el cuarto valor es donde almacenar el resultado, en este caso en el array tipo char valtemp
//convertir lectura del sensor humedad de float a string
float Hum = dht.readHumidity();
char valhum[10];
dtostrf(Hum,4,2,valhum); //Convertimos la variable Temp en tipo char y la guardamos en el array valTemp,
//el primer valor de la funcion dtostrf es que convertir de float a char en este caso la variable Hum,
//el segundo valor es un entero que indica el numero de caracteres minimo, incluyendo el punto decimal, en este caso 4
//el tercer valor es la precisión, el numero de decimales detras del punto en este caso 2
//el cuarto valor es donde almacenar el resultado, en este caso en el array tipo char valhum
//Escribe los valores del senor en el navegador
http("Sensor ");
http( String("DHT22"));
http(" temperatura ");
http(String(valtemp));
http("<br />");
http("Sensor ");
http( String("DHT22"));
http(" Humedad ");
http(String(valhum));
http("<br />");
http("<p><em> La página se actualiza cada 15 segundos.</em></p></body></html>");
delay(1);
Serial3.println("AT+CIPCLOSE=0");
//delay(500);
}
String GetLineWIFI()
{ String S = "" ;
if (Serial3.available())
{ char c = Serial3.read(); ;
while ( c != '\n' ) //Hasta que el caracter sea intro
{ S = S + c ;
delay(25) ;
c = Serial3.read();
}
return( S ) ;
}
}