miércoles, 28 de septiembre de 2016

[Arduino 18] TIC/Picaro (Arduino Leonarod UNO) + Wifibee (ESP8266) +Ubidots

En este tutorial mostraré como enviar el valor de una variable a Ubidots usando una tarjeta TIC (Compatible con arduino Leonardo) y también con un Arduino Pícaro (Arduino UNO).

¿Que es ubidots?

Para quienes no saben ni conocen, Ubidots es un servicio en la nube que permite almacenar y analizar información de sensores en tiempo real. Se pueden crear aplicaciones para el internet de las cosas sin necesidad de tener conocimientos en programación web o bases de datos. Ubidots cuenta cuenta con bases de datos, desarrollo web/móvil, diseño de gráficos, APIs, se pueden enviar datos vía wifi, Blueetooth, Zigbee  o red celular y ademas se pueden integrar sensores y microcontroladores.

Como enviar datos a Ubidots

Veremos dos formas de enviar datos, primero utilizaremos la TIC basada en Arduino Leonardo y luego usaremos Arduino Picaro basada en Arduino UNO. Es importante tener en cuenta que se deben crear una cuenta primero que nada y crear una variable en Ubidots y su respectivo widget. Con esto podremos cambia

Enviar datos a Ubidots con TIC (Arduino Leonardo) + WifiBee

Materiales 1
  • TIC (Arduino Leonardo)
  • WifiBee Flasheada para usar con comandos AT a 9600bps (Puedes ver el tutorial como flashear tu Wifibee)
  • Cable USB mini B para TIC
  • Sensor analógico cualquiera
Conexiones 1
Solo se debe poner la WifiBee en la dirección correcta con la tarjeta TIC
Si es un arduino leonardo se debe conectar como lo se realiza en la conexion  Arduino UNO + WifiBee (ESP8266)

Código 1 (TIC+Wifibee+Ubidots)

El código que hay que cargar a la TIC o Arduino Leonardo es el siguiente, antes de cargarlo a su tarjeta debe estar seleccionado el puerto COM y la placa "Arduino Leonardo"


#define SSID "SebaElectronic"
#define PASS "LABs"
#define TOKEN "Token"    //<--Reemplazar con su TOken de ubidots (NO usar el API key)
#define ID "Variable ID" //<--Reemplazar con su variabale ID
int sensorPin = A5;      //<--Conectar el sensor en el pin análogo 5
int sensorValue = 0;
int len=300;
int len2;

void setup() {
  Serial.begin(9600);   //Usb Leonardo
  Serial1.begin(9600);  //Pines Tx/Rx Arduino Leonardo

  delay(3000);
  //preconfig();
  preconfig();
}

void loop() {
  sensorValue = analogRead(sensorPin);
  conexiontcp();
  delay(1000);
}




void preconfig() {
  //-----------Set Up------------------------
  Serial1.println("AT");                         //para comunicar con tajreta usar   Serial.write();
  delay(2000);
  Serial1.println("AT+RST");
  delay(2000);
  Serial1.println("AT+GMR");
  delay(2000);
  Serial1.println("AT+CWMODE=3");
  delay(2000);
  //------------Conexion a wifi---------------
  String cmd = "AT+CWJAP=\"";
  cmd += SSID;
  cmd += "\",\"";
  cmd += PASS;
  cmd += "\"";
  Serial1.println(cmd);
  delay(10000);
  //------------------------------------------
  Serial1.println("AT+CIPMODE=1");
  delay(2000);
  Serial1.println("AT+CIPMUX=0");
  delay(2000);
}




void conexiontcp() {
  //------------Conexion TCP/IP--------------
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += "things.ubidots.com";
  cmd += "\",8080";
  Serial1.println(cmd);
  delay(1500);  
  
  //---------Algoritmo contador-------
    
    //---Medimos el Content-Length:-----
    String SensorVal =String (sensorValue);
    cmd = "xxxxxxxxxx";
    len2 = SensorVal.length() +cmd.length();

    //---Medimos el largo del mensaje Total     
    cmd = "POST /api/v1.6/variables/";
    String cmd1 = ID;
    String cmd2 = "/values HTTP/1.1";
    String cmd3 = "Host: things.ubidots.com";
    String cmd4 = "User-Agent: Arduino-ESP8266/1.0";
    String cmd5 = "X-Auth-Token: ";
    String cmd6 = TOKEN;
    String cmd7 = "Content-Type: application/json";
    String cmd8 = "Content-Length: ";
    String cmd9 = String (len2);
    String cmd10 = "+++++++++++++++++++++++++++++";           //hacer cuadrar el mensaje (NO MODIFICAR)
    len = cmd.length() + cmd1.length() + cmd2.length() + cmd3.length() + cmd4.length() + cmd5.length() + cmd6.length() + cmd7.length() + cmd8.length() + cmd9.length() + cmd10.length();
    Serial1.println(len);
    
  //------Envio de informacion a Ubidots---------
  Serial1.print("AT+CIPSEND=");
  Serial1.println (len);                             //cambiar "241" por len
  delay(1500);

  Serial1.print ("POST /api/v1.6/variables/");
  Serial1.print (ID);
  Serial1.println ("/values HTTP/1.1");
  delay(80);
  Serial1.println ("Host: things.ubidots.com");
  delay(80);
  Serial1.println ("User-Agent: Arduino-ESP8266/1.0");
  delay(80);
  Serial1.print ("X-Auth-Token: ");
  Serial1.println (TOKEN);
  delay(80);
  Serial1.println ("Content-Type: application/json");
  delay(80);  
  Serial1.print ("Content-Length: ");
  Serial1.println (len2);                              //longutud de {"value":<variable>}
  delay(80);
  Serial1.println ();
  delay(80);
  cmd = "{\"value\":";
  cmd += sensorValue;                                  
  cmd += "}";
  Serial1.println (cmd);
  delay(80);
  Serial1.println ();
  delay(80);
  Serial1.println ("+++");
  delay(80);
  Serial1.println("+++");
  Serial1.println("+++");
  Serial1.println("---------------------------------------");
}

---------------------------------------------------------------------------------------------------------

Enviar datos a Ubidots con Arduino UNO + WifiBee

Materiales 2
  • Arduino Picaro (Arduino UNO)
  • WifiBee Flasheada para usar con comandos AT a 9600bps (Puedes ver el tutorial como flashear tu Wifibee)
  • Cable USB para Arduino UNO
  • Sensor analogico cualquiera
Conexiones 2
Conexiones Arduino UNO + WifiBee (ESP8266)
  • Tx (1) de Arduino a Rx de la WifiBee
  • Rx (0) de Arduino a Tx de la WifiBee (Al programar cuando se cargue el Skecth del Arduino IDE no debe estar conectado este pin)
  • Pin 3,3V de arduino UNO a Vcc de Wifibee (Si conectan mal aqui pueden quemar la WifiBee)
  • Gnd de Arduino a Gnd de WifiBee (ESP8266)

Código 2 (Picaro+Wifibee+Ubidots)

El código que hay que cargar a Arduino es el siguiente, antes de cargarlo a su tarjeta debe estar seleccionado el puerto COM y la placa "Arduino UNO"

#define SSID "SebaLabs"
#define PASS "Electronic"
#define TOKEN "token"    //<--Reemplazar con su TOken de ubidots (NO usar el API key)
#define ID "Variable ID" //<--Reemplazar con su variabale ID
int sensorPin = A5;      //<--Conectar el sensor en el pin análogo 5
int sensorValue = 0;
int len=300;
int len2;

void setup() {
  Serial.begin(9600);
  delay(3000);
  preconfig();
}

void loop() {
  sensorValue = analogRead(sensorPin);
  conexiontcp();
  delay(1000);
}




void preconfig() {
  //-----------Set Up------------------------
  Serial.println("AT");                         
  delay(2000);
  Serial.println("AT+RST");
  delay(2000);
  Serial.println("AT+GMR");
  delay(2000);
  Serial.println("AT+CWMODE=3");
  delay(2000);
  //------------Conexion a wifi---------------
  String cmd = "AT+CWJAP=\"";
  cmd += SSID;
  cmd += "\",\"";
  cmd += PASS;
  cmd += "\"";
  Serial.println(cmd);
  delay(10000);
  //------------------------------------------
  Serial.println("AT+CIPMODE=1");
  delay(2000);
  Serial.println("AT+CIPMUX=0");
  delay(2000);
}




void conexiontcp() {
  //------------Conexion TCP/IP--------------
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += "things.ubidots.com";
  cmd += "\",8080";
  Serial.println(cmd);
  delay(1500);  
  
  //---------Algoritmo contador-------
    
    //---Medimos el Content-Length:-----
    String SensorVal =String (sensorValue);
    cmd = "xxxxxxxxxx";
    len2 = SensorVal.length() +cmd.length();

    //---Medimos el largo del mensaje Total     
    cmd = "POST /api/v1.6/variables/";
    String cmd1 = ID;
    String cmd2 = "/values HTTP/1.1";
    String cmd3 = "Host: things.ubidots.com";
    String cmd4 = "User-Agent: Arduino-ESP8266/1.0";
    String cmd5 = "X-Auth-Token: ";
    String cmd6 = TOKEN;
    String cmd7 = "Content-Type: application/json";
    String cmd8 = "Content-Length: ";
    String cmd9 = String (len2);
    String cmd10 = "+++++++++++++++++++++++++++++";           //hacer cuadrar el mensaje (NO MODIFICAR)
    len = cmd.length() + cmd1.length() + cmd2.length() + cmd3.length() + cmd4.length() + cmd5.length() + cmd6.length() + cmd7.length() + cmd8.length() + cmd9.length() + cmd10.length();
    Serial.println(len);
    
  //------Envio de informacion a Ubidots---------
  Serial.print("AT+CIPSEND=");
  Serial.println (len);                           
  delay(1500);

  Serial.print ("POST /api/v1.6/variables/");
  Serial.print (ID);
  Serial.println ("/values HTTP/1.1");
  delay(80);
  Serial.println ("Host: things.ubidots.com");
  delay(80);
  Serial.println ("User-Agent: Arduino-ESP8266/1.0");
  delay(80);
  Serial.print ("X-Auth-Token: ");
  Serial.println (TOKEN);
  delay(80);
  Serial.println ("Content-Type: application/json");
  delay(80);  
  Serial.print ("Content-Length: ");
  Serial.println (len2);                              
  delay(80);
  Serial.println ();
  delay(80);
  cmd = "{\"value\":";
  cmd += sensorValue;                                  
  cmd += "}";
  Serial.println (cmd);
  delay(80);
  Serial.println ();
  delay(80);
  Serial.println ("+++");
  delay(80);
  Serial.println("+++");
  Serial.println("+++");
  Serial.println("---------------------------------------");
}

-------------------------------------------------------------------------------------------

lunes, 26 de septiembre de 2016

[Arduino 17] Programar wifibee con comandos AT

Es importante saber como se comunica la WifiBee con los demás servicios para saber como programar arduino después y hacer que este envié los comandos que necesitamos enviar de manera correcta.

Comandos AT

Dejo a su disposición algunos documentos donde se explica la función de cada comando AT.

Ejemplos de programación WifiBee

Para comunicarnos con la wifi bee tendremos que conectarnos por medio de la xbee explorer al PC y abrir el puerto de comunicación serial de arduino. Enviaremos los mensajes por consola y veremos la respuesta en esta misma.

Ejemplo 1: Pequeño servidor web

En este primer ejemplo crearemos un pequeño servidor web con el cual podremos recibir informacion de algunas variables.

Lista de comandos

  • AT
  • AT+RST
  • AT+CWMODE?
  • AT+CWMODE=3
  • AT+CWLAP              (nos dice las redes wifi que estan dentro de alcance)
  • AT+CWJAP="SSID","Password"       (nos conectamos a la red wifi SEBALABS)
    AT+CWJAP="SEBALABS","Electronics"
  • AT+CIFSR (nos dice la ip que tiene nuestro servidor, a mi me entrega la ip 192.168.4.1)
  • AT+CIPMUX=1
  • AT+CIPSERVER=1,80
    Si da error probar con AT+CIPMUX=0, luego AT+CIPMUX=1 y finalmente enviar AT+CIPSERVER=1,80

Ahora que esta creado este pequeño servidor podemos enviar información por medio de la direccion siguiente en el navegador web, como por ejemplo http://192.168.4.1/X=1,Y=2,Z=6

  • AT+CIOBAUD=?          nos dice las velocidades de trabajo de la wifibee
  • AT+CIOBAUD?            nos dice a que velocidad esta trabajando actualmente
  • AT+CIOBAUD=9600   podemos establecer una velocidad de trabajo (9600 bps)

Ejemplo 2: como enviar datos a Ubidots con Wifibee

Primero que nada deben crearse una cuenta en Ubidots.
Luego deben conseguir su TOKEN (NO el API KEY)
Crear una variable en la parte que dice Sources y conseguir el Variable ID
Con esto ya pueden crear un grafico para los valores que vamos a enviar en Dashboard>> AddWidget>> Chart>> Line Chart>> Seleccionamos nuestra variable y damos en finish. No aparecerá nada en nuestro gráfico hasta que hayamos enviado información
Para probar enviar información a nuestro grafico podemos usar el siguiente enlace y vamos a la parte donde dice "Send one value to Ubidots", a continuación completamos con el TOKEN, Variable ID y le asignamos un valor a nuestra variable, para luego presionar "Send Request"

Ahora si deseamos probar la WifiBee ESP8266 y queremos enviar un mensaje de forma manual debemos conectar la wifibee al pc por medio del Xbee explorer, seleccionar el puerto COM y abrir la consola del puesto serial de Arduino IDE para poder enviar y recibir mensajes de la Wifibee.

Preconfiguración

Enviamos por consola los siguiente comandos AT

  • AT
  • AT+RST
  • AT+GMR
  • AT+CWMODE=3
  • AT+CWJAP="SEBALABS","Electronics"
  • AT+CWJAP?
  • AT+CIFSR
  • AT+CIPMODE=1
  • AT+CWJAP?
  • AT+CIPMUX=0

Conexión TCP 

Aquí una vez realizada la conexion AT+CIPSTART="TCP","things.ubidots.com",8080 tenemos unos segundos para enviar toda la info, por lo que hay que se muy rápidos copiando y pegando las lines siguientes jaja
  • AT+CIPSTART="TCP","things.ubidots.com",8080
  • AT+CIPSEND=240   (avisamos que se envía un mensaje de 240 caracteres)
Ahora debemos enviar el siguiente mensaje

  • POST /api/v1.6/variables/IP/values HTTP/1.1
  • Host: things.ubidots.com
  • User-Agent: Arduino-ESP8266/1.0
  • X-Auth-Token: TOKEN
  • Content-Type: application/json
  • Content-Length: 14

  • {"value":1000}

  • +++
Nota: Content-Length: 14 corresponde a la longitud del mensaje {"value":1000}

Enlaces relacionados


[Arduino 16] Flashear Wifibee (Esp8266)

En este tutorial mostraré como cambiar el firmware de la wifibee (ESP8266). Es importante saber que firmware tiene nuestra tarjeta wifi ya que si deseamos programarla con comandos AT y esta tiene un fimware que lee lenguaje LUA o lenguaje de programación Arduino no funcionara como queremos y no leera el lenguaje que deseamos.

Alternativas de programacion

  1. Comandos AT
  2. Lenguaje LUA
  3. Utilizando Arduino IDE

Materiales requeridos

  • Wifibee ESP8266
  • Xbee Explorer
  • Cable USB para Xbee Explorer

Como cambiar el firmware (flashear) del wifibee ESP8266

Primero debemos encontrar el firmware de extensión .bin que deseas instalar en la wifibee. Este debe ser escogido de acuerdo a la velocidad de transmisión que utiliza, estabilidad (hay algunas versiones que se reinician muchas veces mientras lo estas programando) y el lenguaje que utiliza para comunicarse.

Aquí dejo algunas versiones que utilizo para los tutoriales que haré próximamente. Estos firmware funcionan con comandos AT.
  • Pueden descargar algunos de los firmware para comandos AT aqui (Algunos de estos están a 9600bps y otro a 115200, de todos modos se puede modificar la velocidad de transmision de datos con un comando AT)
Ahora deben descargar el flasher.exe, este software se encarga de traspasar los datos binarios a la wifibee

Conectar la wifibee al  Xbee Explorer y conectar al PC con el cable USB

Abrir el flasher.exe

Presionar en Bin y seleccionar el firmware que se desea cargar a la wifibee

Ahora se debe seleccionar el puerto COM al que esta coenctada el Xbee Explorer y presinar en download. Si todo va bien veremos que carga desde 0 a 99%. Usualmente marca el error "Failed to leave Flash mode" pero no es importante ya que con eso ya hemos cambiado el firmware.

Descargas y enlaces relacionados