Guardar datos desde esp8266 en MySQL de NAS Synology
Tengo un NAS desde hace muchos años. Todo han sido satisfacciones por variedad de opciones y posibilidades que proporciona. Por supuesto compartir tus videos, películas, fotos, ficheros desde cualquier parte en tu casa y fuera de ella, comprando un dominio por pocos euros anuales puedes poner tu página web en él, servicio DDNS gratuito, etc. Mi NAS es un Synology.
Y como no, permite php y MySQL (instalando el paquete Mariadb) y su control con phpMyAdmin.
Este tutorial es lo más simplificado posible. Enviar dos variables desde un esp8266 Nodemcu conectado por wifi a una base de datos alojada en nuestro NAS.
Lo primero es instalar en el NAS los paquetes Mariadb 5, PHP 7 y phpMyAdmin. También Web Station que nos permitirá entrar en la configuración de PHP y activar las opciones curl y mysqli.
Lo siguiente fue crear una base de datos con phpMyAdmin "example_esp_data" y dentro de ella una tabla "ramdon" con la siguiente estructura.
Muy importante, a la tabla debemos darle un nombre de usuario (Que no sea root) y un password.
Seguidamente creamos un fichero php (insertar-ram.php) que recoge los datos que envía el esp8266 y los inserta en la tabla. Este fichero lo ponemos en raíz del NAS o en la carpeta que queramos (el mio en /SQL)
<?php
$servername = "192.168.1.100"; //IP del NAS
// REPLACE with your Database name
$dbname = "example_esp_data";
// REPLACE with Database user
$username = "Jopapa";
// REPLACE with Database user password
$password = "11ximojpp";
$ra = $_GET['ram']; //captura los valores enviados por esp8266
$re = $_GET['rem'];
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
//Inserta los valores recibidos en la tabla ramdon
$sql = "INSERT INTO `ramdon` (`id`, `aleatorio`, `aleatorio2`, `fecha`) VALUES (NULL, '$ra', '$re', NULL)";
if ($conn->query($sql) === TRUE) {
echo "new record created successfully";
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
Podemos ver que todo funciona lanzando una URL desde nuestro navegador tal que así
http://192.168.1.100/SQL/insertar-ram.php?ram=249&rem=250
Seguidamente el código del esp8266. Conecta con nuestra wifi y cada 10'' envía dos números aleatorios a insertar-ram.php
Nada más fácil que sustituir estos datos por otros auténticos de temperatura, humedad, voltajes, etc
#include <ESP8266WiFi.h>
const char* ssid = "Jopapa";
const char* password = "xxxxxxxxxxxxx";
const char* host = "192.168.1.100";
unsigned long previousMillis = 0;
const long interval = 10000; // intervalo de 10''
int valor=0; int valor2=0;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
IPAddress ip(192, 168, 1, 167);
IPAddress gateway(192,168,1,1);
IPAddress subnet (255,255,255,0);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
WiFi.config(ip,gateway,subnet);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
server.begin();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) { //Llama 10''
previousMillis = currentMillis;
//Generar dos valores aleatorios
valor = random(999);
delay(10);
valor2 = random(999);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// Creamos una URL
String url = "";
url +="/SQL/insertar-ram.php?";
url += "ram=";
url += valor;
url += "&rem=";
url += valor2;
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
}
}
Por último podemos ver los datos guardados desde phpMyAdmin y con este otro php en el navegador.
<!DOCTYPE html>
<html><body>
<?php
$servername = "192.168.1.100"; //IP de mi NAS Synology
// REPLACE with your Database name
$dbname = "example_esp_data";
// REPLACE with Database user
$username = "Jopapa";
// REPLACE with Database user password
$password = "11ximojpp";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, aleatorio, aleatorio2, fecha FROM ramdon ORDER BY id DESC";
echo '<table cellspacing="5" cellpadding="5">
<tr>
<td>ID</td>
<td>Aleatorio</td>
<td>Aleatorio2</td>
<td>Fecha</td>
</tr>';
if ($result = $conn->query($sql)) {
while ($row = $result->fetch_assoc()) {
$row_id = $row["id"];
$row_aleatorio = $row["aleatorio"];
$row_aleatorio2 = $row["aleatorio2"];
$row_fecha = $row["fecha"];
echo '<tr>
<td>' . $row_id . '</td>
<td>' . $row_aleatorio . '</td>
<td>' . $row_aleatorio2 . '</td>
<td>' . $row_fecha . '</td>
</tr>';
}
$result->free();
}
$conn->close();
?>
</table>
</body>
</html>
