Gráficas en la nube con Thingspeak
Thingspeak es una plataforma que nos permite tener gráficas de nuestros datos actualizables en tiempo real y accesibles desde Internet de forma pública o privada. Podemos controlar de forma gratuita hasta ocho parámetros analógicos o digitales con varios tipos de gráficas. Enviaremos los datos que queramos (temperatura, presión, luminosidad, voltaje, etc) a través de Internet con un ESP8266, Arduino, Raspberry, etc. Cada dato irá a un campo determinado que generará la correspondiente gráfica.
Primero nos daremos de alta en Thingspeak pulsando Get Started For Free y rellenaremos los campos que se nos piden. Después definiremos cuantos campos vamos a necesitar hasta un máximo de 8. En cada gráfica generada podemos ajustar varias cosas, valores max y min, color, etc.
En el proceso de alta, debemos tomar nota de nuestro
Channel ID que nos permitirá accedera a nuestras gráficas desde Internet con el formato: https://thingspeak.com/channels/xxxxxx/private_show
Y también de nuestro
Write API Key que nos permitirá subir los datos desde nuestro programa.
En la propia página de Thingspeak hay ayuda contextual y ejemplos de código.
Como ejemplo he usado un circuito muy sencillo con un esp8266 Nodemcu.
Un divisor resistivo R1 y R2 que garantizan que aún con máxima luminosidad no se sobrepasará 1 voltio en la entrada ADC del esp8266. El LDR hará variar dentro de esos limites el voltaje en esa entrada analógica.
#include <ESP8266WiFi.h>
const char* ssid = "Jopapa";
const char* password = "xxxxxxxxxxxxxxxx";
const char* host = "api.thingspeak.com";
String api_key = "tu Write API Key"; // Tu API Key proporcionada por thingspeak
unsigned long previousMillis = 0;
const long interval = 300000; // intervalo de 5 minutos o lo que sea
int val=0;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
IPAddress ip(192, 168, 1, 71); //Fuerzo IP estática al esp8266
IPAddress gateway(192,168,1,1);
IPAddress subnet (255,255,255,0);
Serial.print("Conectando a ");
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 conectada");
Serial.println("Dirección IP: ");
Serial.println(WiFi.localIP());
server.begin();
pinMode(A0, INPUT); //Entrada analógica del esp8266 conectada a una LDR
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) { //Llama cada 5 minutos
previousMillis = currentMillis;
val = analogRead(A0);
Serial.print("Analog: ");
Serial.println(val);
// llama a funcion para enviar datos a Thingspeak
Send_Data();
}
}
void Send_Data()
{
Serial.println("Preparando para enviar datos");
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("conexion fallida");
return;
}
else
{
String data_to_send = api_key;
data_to_send += "&field1=";
data_to_send += String(val);
//data_to_send += "&field2="; //Si se habilitan mas campos
//data_to_send += String(temp);
// data_to_send += "&field3=";
// data_to_send += String(pressure);
data_to_send += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + api_key + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(data_to_send.length());
client.print("\n\n");
client.print(data_to_send);
delay(1000);
}
client.stop();
}