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();
}


Menu