ESP8266 Subiendo Datos a la Nube

INTRODUCCIÓN:

Esta es la tercera entrega sobre un proyecto anterior, que consistía en pasar los datos de temperatura desde un arduino nano a un ESP8266, utilizando el protocolo I2C.
Ahora mostrare la adaptación del código para que los datos de temperatura se guarden en una nube
En este proyecto he creado mi propia nube con un servidor PHP, desde mi ordenador.
Dato a destacar es que en este proyecto inicia la posibilidad de controlar el ESP8266 desde la propia nube realizando  acciones sobre el , dependiendo de los datos recibidos.
En este caso paso a encender un ventilador si la temperatura alcanza cierto valor.

Conceptos Básicos

Que es la Nube?
Técnicamente la nube, que viene del inglés Cloud computing, es el nombre que se le dio al procesamiento y almacenamiento masivo de datos en servidores que alojen la información del usuario.

Mas informacion

Que es PHP?
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de código abierto muy popular especialmente adecuado para el desarrollo web y que puede ser incrustado en HTML.

Mas informacion

Que es HTML5?
HTML5 es un lenguaje markup (de hecho, las siglas de HTML significan Hyper Text Markup Language) usado para estructurar y presentar el contenido para la web.

Mas informacion

 De post anteriores

Sensor utilizado.

Sensor DS18B20, nube

 

 

 

 

 

 

2. conexión

Como la conexión a la nube es a través de la WIFI la conexión no tiene cambio.

nube.Conexion arduino

 

 

 

 

Para mas información ir a los post:

1- Conectando el NODEMCU y Arduino “I2C”

2-Conectando ESP8266 con Arduino nano “I2C” 2da parteç

Video explicativo

Aqui podran ver y oir la explicación con mas detalle.

Empezamos con el codigo

En el código solo explicare la parte de subir a la nube y la de encender el ventilador cuando la temperatura alcance los 26 grados.

Como el esclavo en este caso el Arduino nano, quien lee del sensor, no tiene ningún cambio pues solo explico la parte del maestro.

Configurando la nube

POST

1- datos para conectarse a la nube en mi caso es mi PC que actúa como servidor.

char serverAddress[] = "192.168.1.40"; // server address
//Port definition
int port = 80;
//Connect to cloud
HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS;
Connecting to cloud

2- Una vez conectado con el servidor, iniciamos las variables que queremos subir y construimos el método “POST”
Para hacerlo mas legible lo he metido dentro de una sub rutina que es llamada cada 5 min para subir los datos, de momento el tiempo de subido lo realizo con un simple delay, personalmente no me gusta usar los delay, en la próxima entrega lo sustituirse por otro delay mas eficiente.

void SendToServer(){
String temp3 = String(temp2,1);
String Temperature = String(Temp1);
Serial.println("making POST request");
String contentType = "application/x-www-form-urlencoded"; 
String postData = "TempAcuario="+TempAcuario+"&age=44&temp="+Temperature;
client.post("/Arduino/arduino.php", contentType, postData);
// read the status code and body of the response
statusCode = client.responseStatusCode();
response = client.responseBody();

No mencione que como prueba definí la variable temp2 como entero, para poder convertirlo luego a string y poderlo enviar en el POST.
Si todo es correcto entonces estatus code debe ser 200
y la respuesta como esta:
making POST request
Response: Fan: OFF
New record created successfully
La temperatura es:25

Accion Requerida

3- ya con la respuesta de que la temperatura fue leída y guardada correctamente, extraigo el dato de la respuesta del servidor

String fan1 = response.substring(response.indexOf(':')+2,response.length()-5);

4- Si la temperatura supera los 25 encendera el ventilador en caso contrario no hace nada.

if(fan1 == "ON"){analogWrite(FanPin,255);}

Esto no tendría sentido si no muestro un poco la parte del servidor

Parte Servidor

El servidor esta construido en PHP y la base da datos MYSQL, de momento esta corriendo todo en mi pc utilizando la aplicación XAMP, luego lo pasare a un HOST. De momento el servidor hacer cosas básicas que ire complicando según avance en el proyecto, todo esto e nuevo para mi por lo que me tomo mi tiempo para buscar la solución mas adecuada, si alguno de ustedes tiene una solución mas practica y eficiente les agradecería me envíen un comentario sobre como hacerlo.
La parte de servidor la he dividido en dos, la parte de conexión y la parte interfaz que es la que se comunica con el ESP8266.La idea de separar es que luego quiero hacer un cliente que acceda a los datos y lo muestre gráficamente para evitar tener que escribir el código de conexión a la DB lo he separado y solo tengo que llamar esa función.

Como veran es muy sencilla.

?php
$conn = mysqli_connect("localhost","root","","acuario_database");
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
	}

La parte que mas me ha gustado por el potencial que representa para mi proyeto, tambien disfrute mucho aprendiendo un poco de PHP, y lo que falta.

<?php

foreach ($_REQUEST as $key => $value)
{
if ($key == "temp_Acuario") {
$light = $value;
}
if ($key == "age") {
$age = $value;
}
if ($key == "temp") {
$temp = $value;
}
}
if ($temp > 28) {
	
	//Turn on the FAN
echo "Fan: ON \n";
 
}
 else {
echo "Fan: OFF \n";
 }
  
include 'connect_data_base.php';
 $sql = "INSERT INTO reporte (temperature,hora,fecha) VALUES ($temp,CURTIME(),CURDATE())"; 
if (mysqli_query($conn, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn); 
?>

El código de momento se divide en tres partes la primer recolección de datos, la segunda realiza una acción sobre el ESP8266, tercera introduce los datos a la DB.

Como esto es provisional porque pienso complicarlo un poco mas no lo explico mucho, si alguien tiene alguna duda dejarme un comentario con la duda.

Como siempre dejo los códigos para descargar aquí:

HTTP_Post_PHP_I2C.zip (3 descargas)

 

Deja un comentario