Plotly: El servicio web para visualizar datos en tiempo real [Arduino IoT]

Para los que no conozcan Plot.ly, es un servicio web con API para varios dispositivos y entornos con las que podemos conectar nuestros dispositivos y visualizar los datos en la nube de forma instantánea. Los entornos en los que podemos utilizar Plot.ly son los siguientes:

plot.ly

 

En mi caso utilizo Plotly con Arduino para registrar los datos de temperatura en mi casa, calcular la media de estos y visualizar todo en tiempo real en mi ordenador, smartphone y tablet. He de decir que la interfaz para smartphone o tablet no es muy amigable para la visualización de datos, pero es suficiente si queremos conocer en algún momento que esta pasando en nuestro hogar.

A continuación podéis ver el código. En mi caso, he añadido un led para mostrar si hay algún problema con la conexión, ya que después de mucho tiempo funcionando repentinamente ha acabado por no funcionar.

 

#include <Adafruit_CC3000.h>
#include <ccspi.h>
#include <SPI.h>
#include <plotly_streaming_cc3000.h>

#define WLAN_SSID       "Red NuiFi"           // cannot be longer than 32 characters!
#define WLAN_PASS       "Na09111988Lu01071989"
#define WLAN_SECURITY   WLAN_SEC_WPA2

// Sign up to plotly here: https://plot.ly
// View your API key and streamtokens here: https://plot.ly/settings
//#define nTraces 2
#define nTraces 2
// View your tokens here: https://plot.ly/settings
// Supply as many tokens as data traces
// e.g. if you want to ploty A0 and A1 vs time, supply two tokens
char *tokens[nTraces] = {"j4vk2xofk1", "2w5k459nw2"};
// arguments: username, api key, streaming token, filename
plotly graph = plotly("luis_diaz", "xovxs346sm", tokens, "Temperatura Madrid", nTraces);


float temp, tempMedia, auxTemp = 0;
int pinTemp = A5, cont = 0;
float time;
int pinLed = 6;

float nextTime,intervalo=3600000; // 1 Hora
int tiempoDelay=2000;

void wifi_connect() {
  /* Initialise the module */
  Serial.println(F("n... Initializing..."));
  if (!graph.cc3000.begin())
  {
    Serial.println(F("... Couldn't begin()! Check your wiring?"));
    while (1);
  }

  // Optional SSID scan
  // listSSIDResults();

  if (!graph.cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
    Serial.println(F("Failed!"));
    while (1);
  }

  Serial.println(F("... Connected!"));

  /* Wait for DHCP to complete */
  Serial.println(F("... Request DHCP"));
  while (!graph.cc3000.checkDHCP())
  {
    delay(100); // ToDo: Insert a DHCP timeout!
  }
}


void setup() {

  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  pinMode(pinLed, OUTPUT);
  delay(50);
  digitalWrite(pinLed, HIGH);
  delay(1000);
  digitalWrite(pinLed, LOW);
  delay(1000);
  digitalWrite(pinLed, HIGH);
  delay(1000);
  digitalWrite(pinLed, LOW);
  
  wifi_connect();
  graph.maxpoints = 200000;
  graph.convertTimestamp = true;
  graph.timezone = "Europe/Madrid";

  graph.fileopt = "extend"; // See the "Usage" section in https://github.com/plotly/arduino-api for details
  //graph.fileopt = "overwrite";
   
  bool success;
  success = graph.init();
  if (!success) {
    while (true) {}
  }
  graph.openStream();
  
  nextTime= millis() + intervalo;
  
}

void loop() {

  temp = temperatura();

  if (cont == 0) {
    tempMedia = temp;
  } else {
    auxTemp += temp;
    tempMedia = auxTemp / cont;
  }


  if (graph.cc3000.checkConnected() ) {
    time = millis();
    graph.plot(time, temp, tokens[0]);
    graph.plot(time, tempMedia, tokens[1]);    
    digitalWrite(pinLed, LOW);
  } else {
    wifi_connect();
    digitalWrite(pinLed, HIGH);
  }
  
  cont++;

  if (nextTime<millis()){
      tempMedia=0;
      auxTemp=0;
      cont=0;
      nextTime=millis()+intervalo;
  }

  //delay(tiempoDelay); 

}

float temperatura() {

  float Vout, acumTemp;
  float res = 0.010; // en V/ºC
  int muestras = 100;
  int i = 0;
  float temp;

  for (i = 0; i < muestras; i++) {
    Vout = analogRead(pinTemp) * 0.00488758553275; // step * V/step = V
    temp = (Vout / res ) - 2.5; // V/(V/ºC) = ºC
    acumTemp += temp;
    delay(10);
  }
  temp = acumTemp / muestras;
  return temp;

}

Y como siempre con Arduino, un video explicativo del código y además una explicación de la interfaz web de Plotly:

7 comentarios


  1. Luis

    Cordial Saludo

    De antemano quiero agradecer que se tome el trabajo de realizar estos tutoriales tan interesantes, amenos y sobre todo, muy bien explicados.
    Mi pregunta es la siguiente: Puedo visualizar datos en plot.ly utilizando la shield ethernet de Arduino?

    Gracias por su respuesta

    Saludos

    Omar

    Responder

    1. Buenos días Omar,

      Gracias por tu comentario, realmente anima a seguir realizando los tutoriales.

      Claro, tienes que utilizar la parte de la libreria correspondiente al shield ethernet. Descarga la libreria en el link, descomprime el archivo, busca el archivo de nombre plotly_streaming_ethernet, y comprimelo de nuevo.

      Una vez que tengas el archivo, solo tienes que instalarlo como una librería más en el IDE de Arduino.

      Saludos Omar!

      Responder

      1. Luis

        Muchas gracias por su ayuda, ya esta funcionando, al final comparto el código para que por favor me de su opinion.

        Gracias nuevamente.

        Saludos

        Omar.

        #include
        #include
        #include
        // Sign up to plotly here: https://plot.ly
        // View your API key and streamtokens here: https://plot.ly/settings
        //#define nTraces 2
        #define nTraces 2
        // View your tokens here: https://plot.ly/settings
        // Supply as many tokens as data traces
        // e.g. if you want to ploty A0 and A1 vs time, supply two tokens
        char *tokens[nTraces] = {“bty41tcjcs”, “90lz03dhvr”};
        // arguments: username, api key, streaming token, filename
        plotly graph = plotly(“totalnet”, “lljk3b96vx”, tokens, “Temperatura Zipaquirá”, nTraces);

        byte mac[] = {
        0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
        IPAddress ip(192,168,1,107);
        EthernetServer server(80);

        float temp, tempMedia, auxTemp = 0;
        int pinTemp = A5, cont = 0;
        float time;
        int pinLed = 6;

        float nextTime,intervalo=3600000; // 1 Hora
        int tiempoDelay=2000;

        void setup() {
        // Open serial communications and wait for port to open:
        Serial.begin(9600);
        while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
        }

        // start the Ethernet connection and the server:
        Ethernet.begin(mac, ip);
        server.begin();
        Serial.print(“server is at “);
        Serial.println(Ethernet.localIP());
        graph.maxpoints = 200000;
        graph.convertTimestamp = true;
        graph.timezone = “America/Bogota”;
        graph.fileopt = “extend”; // See the “Usage” section in https://github.com/plotly/arduino-api for details
        //graph.fileopt = “overwrite”;
        bool success;
        success = graph.init();
        if (!success) {
        while (true) {}
        }
        graph.openStream();

        nextTime= millis() + intervalo;
        }

        void loop() {

        temp = temperatura();

        if (cont == 0) {
        tempMedia = temp;
        } else {
        auxTemp += temp;
        tempMedia = auxTemp / cont;
        }

        //if (graph.cc3000.checkConnected() ) {
        time = millis();
        graph.plot(time, temp, tokens[0]);
        graph.plot(time, tempMedia, tokens[1]);
        //digitalWrite(pinLed, LOW);
        //} else {
        //wifi_connect();
        //digitalWrite(pinLed, HIGH);
        //}

        cont++;

        if (nextTime<millis()){
        tempMedia=0;
        auxTemp=0;
        cont=0;
        nextTime=millis()+intervalo;
        }

        //delay(tiempoDelay);

        }

        float temperatura() {

        float Vout, acumTemp;
        float res = 0.010; // en V/ºC
        int muestras = 100;
        int i = 0;
        float temp;

        for (i = 0; i < muestras; i++) {
        Vout = analogRead(pinTemp) * 0.00488758553275; // step * V/step = V
        temp = (Vout / res ) – 2.5; // V/(V/ºC) = ºC
        acumTemp += temp;
        delay(10);
        }
        temp = acumTemp / muestras;
        return temp;

        }

        Responder

  2. En primer lugar, agradecerte estos tutoriales y lo bien explicados que están. Gracias a tu trabajo aprendemos muchos.
    Te quería preguntar que estoy intentando hacerlo pero me sale el mensaje de error ” fatal error avr/dtostrf.h:” . ¿Sabes como solucionarlo?
    Muchas garcias

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *