Este proyecto muestra cómo leer una variable de Ubidots utilizando una solicitud HTTP GET y la placa chipKIT Uno.
Esto sirve como un ejemplo de cómo se pueden leer datos de un sistema embebido utilizando la técnica de sondeo corto. Existen otros métodos y protocolos para comunicarse con un dispositivo remoto que pueden ayudarte a lograr notificaciones push en tiempo real; sondeo largo, MQTT o CoAP. Para más información sobre estos métodos, consulta nuestro artículo "Elegir el Protocolo Correcto para Enviar Datos a Dispositivos Remotos".
Materiales
Cableado
Para comenzar, solo necesitarás cinco cables. Ten en cuenta que se necesitará una fuente de alimentación externa si manejas más de dos (2) matrices LED:
Codificación
Esta es una modificación del código de la matriz LED proporcionado por JolliFactory. Recuerda poner el TOKEN correspondiente y el ID de variable de tu cuenta de Ubidots.
Además, consulta nuestro ejemplo de chipKIT WiFi Shield para descargar las bibliotecas de red requeridas para que el código pueda compilar.
#include <Wprogram.h>#include <Wire.h>#include <WiFiShieldOrPmodWiFi_G.h> #include <DNETcK.h>#include <DWIFIcK.h>#include <LedControl.h>//------------------------------Fin de Bibliotecas----------------------------------#define GREEN 0 #define RED 1 #define offREDoffGREEN 0#define offREDonGREEN 1#define onREDoffGREEN 2int MAXbrightnessCount = 0;int maxInShutdown=RED; // indica qué color de la matriz LED está actualmente apagadoint colorMode = '2'; // color predeterminado (1 = ROJO, 2 = VERDE, 3 = NARANJA, 4 = apagado)int lastcolorMode = '0'; int temp_colorMode = '2'; int brightnessLevel = '9'; // nivel de brillo predeterminado (1 a 9)int SetbrightnessValue = (15 * (brightnessLevel-48))/9; //Reajustar valores para cumplir con el rango de nivel de brillo MAX7219 entre 0 y 15int MAX72xxbrightnessValue = 0;int scrollDelay = 30; // retraso de desplazamiento predeterminado boolean newMsg = false;boolean newCmd = false;boolean fadeInFlag = true;// Puedes cambiar las asignaciones de pines según tus requisitos a continuación// Primer conjunto de 4 matrices LED bicolorint devices;int lc1_DataIn_Pin = 7;int lc1_CLK_Pin = 6;int lc1_Load_Pin = 5;int lc1_LEDMatrixQty = 4; // No. de matrices LED bicolor en cadena//Crear un nuevo LedControl para el primer conjunto de 4 matrices LED bicolor con 2 chips MAX7219 cada unoLedControl lc1=LedControl(lc1_DataIn_Pin, lc1_CLK_Pin, lc1_Load_Pin, lc1_LEDMatrixQty * 2); char msg[1024];int msgsize = strlen(msg);char temp_msg[255];int temp_msgsize = strlen(temp_msg);// El conjunto de caracteres cortesía de cosmicvoid.byte Font8x5[104*8] ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x0A, 0x00, 0x0E, 0x15, 0x05, 0x0E, 0x14, 0x15, 0x0E, 0x00, 0x13, 0x13, 0x08, 0x04, 0x02, 0x19, 0x19, 0x00, 0x06, 0x09, 0x05, 0x02, 0x15, 0x09, 0x16, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x04, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x0A, 0x15, 0x0E, 0x15, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x00, 0x0E, 0x11, 0x19, 0x15, 0x13, 0x11, 0x0E, 0x00, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x0E, 0x00, 0x0E, 0x11, 0x10, 0x0C, 0x02, 0x01, 0x1F, 0x00, 0x0E, 0x11, 0x10, 0x0C, 0x10, 0x11, 0x0E, 0x00, 0x08, 0x0C, 0x0A, 0x09, 0x1F, 0x08, 0x08, 0x00, 0x1F, 0x01, 0x01, 0x0E, 0x10, 0x11, 0x0E, 0x00, 0x0C, 0x02, 0x01, 0x0F, 0x11, 0x11, 0x0E, 0x00, 0x1F, 0x10, 0x08, 0x04, 0x02, 0x02, 0x02, 0x00, 0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E, 0x00, 0x0E, 0x11, 0x11, 0x1E, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x01, 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01, 0x00, 0x0E, 0x11, 0x10, 0x08, 0x04, 0x00, 0x04, 0x00, 0x0E, 0x11, 0x1D, 0x15, 0x0D, 0x01, 0x1E, 0x00, 0x04, 0x0A, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00, 0x0F, 0x11, 0x11, 0x0F, 0x11, 0x11, 0x0F, 0x00, 0x0E, 0x11, 0x01, 0x01, 0x01, 0x11, 0x0E, 0x00, 0x07, 0x09, 0x11, 0x11, 0x11, 0x09, 0x07, 0x00, 0x1F, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x1F, 0x00, 0x1F, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x01, 0x00, 0x0E, 0x11, 0x01, 0x0D, 0x11, 0x19, 0x16, 0x00, 0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11, 0x00, 0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00, 0x1C, 0x08, 0x08, 0x08, 0x08, 0x09, 0x06, 0x00, 0x11, 0x09, 0x05, 0x03, 0x05, 0x09, 0x11, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x00, 0x11, 0x1B, 0x15, 0x15, 0x11, 0x11, 0x11, 0x00, 0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x0F, 0x11, 0x11, 0x0F, 0x01, 0x01, 0x01, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x15, 0x09, 0x16, 0x00, 0x0F, 0x11, 0x11, 0x0F, 0x05, 0x09, 0x11, 0x00, 0x0E, 0x11, 0x01, 0x0E, 0x10, 0x11, 0x0E, 0x00, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0A, 0x0A, 0x04, 0x00, 0x41, 0x41, 0x41, 0x49, 0x2A, 0x2A, 0x14, 0x00, 0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11, 0x00, 0x11, 0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x00, 0x1F, 0x10, 0x08, 0x04, 0x02, 0x01, 0x1F, 0x00, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00, 0x04, 0x0A, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x08, 0x0E, 0x09, 0x0E, 0x00, 0x01, 0x01, 0x0D, 0x13, 0x11, 0x13, 0x0D, 0x00, 0x00, 0x00, 0x06, 0x09, 0x01, 0x09, 0x06, 0x00, 0x10, 0x10, 0x16, 0x19, 0x11, 0x19, 0x16, 0x00, 0x00, 0x00, 0x06, 0x09, 0x07, 0x01, 0x0E, 0x00, 0x04, 0x0A, 0x02, 0x07, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x06, 0x09, 0x09, 0x06, 0x08, 0x07, 0x01, 0x01, 0x0D, 0x13, 0x11, 0x11, 0x11, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x04, 0x00, 0x06, 0x04, 0x04, 0x04, 0x04, 0x03, 0x01, 0x01, 0x09, 0x05, 0x03, 0x05, 0x09, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x15, 0x2B, 0x29, 0x29, 0x29, 0x00, 0x00, 0x00, 0x0D, 0x13, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x06, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x0D, 0x13, 0x13, 0x0D, 0x01, 0x01, 0x00, 0x00, 0x16, 0x19, 0x19, 0x16, 0x10, 0x10, 0x00, 0x00, 0x0D, 0x13, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x06, 0x08, 0x07, 0x00, 0x00, 0x02, 0x07, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x19, 0x16, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A, 0x00, 0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00, 0x00, 0x00, 0x09, 0x09, 0x09, 0x0E, 0x08, 0x06, 0x00, 0x00, 0x0F, 0x08, 0x06, 0x01, 0x0F, 0x00, 0x04, 0x02, 0x02, 0x01, 0x02, 0x02, 0x04, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x2A, 0x49, 0x49, 0x41, 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x51, 0x49, 0x41, 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x41, 0x79, 0x41, 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x41, 0x49, 0x51, 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x41, 0x49, 0x49, 0x2A, 0x1C, 0x00, 0x1C, 0x22, 0x41, 0x49, 0x45, 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x41, 0x4F, 0x41, 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x45, 0x49, 0x41, 0x22, 0x1C, 0x00};byte lentbl_S[104] ={ 2, 2, 3, 5, 5, 5, 5, 2, 3, 3, 5, 5, 2, 5, 1, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 1, 2, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 3, 5, 3, 5, 5, 2, 4, 5, 4, 5, 4, 4, 4, 5, 2, 3, 4, 2, 6, 5, 4, 5, 5, 5, 4, 3, 5, 5, 5, 5, 4, 4, 3, 2, 3, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7};int curcharix = 0;int curcharbit = 0;int curcharixsave = 0;int curcharbitsave = 0;int curcharixsave2 = 0;int curcharbitsave2 = 0;char curchar;//---------------------------Fin de inicialización de la matriz-------------------------------------char * szIPServer = "industrial.api.ubidots.com"; // servidor al que conectarseunsigned short portServer = 80; // puerto del servidorconst char * szSsid = "Atom House Medellin"; // SSIDconst char * szPassPhrase = "atommed2014"; // frase de contraseña#define WiFiConnectMacro() DWIFIcK::connect(szSsid, szPassPhrase, &status) String token="pSZJt9W7v5W3fpUsRYNKiDMgJ770NK"; // tu tokenString idvariable="53e262127625421973e7cdb5"; // tu ID de variableunsigned tStart = 0;unsigned tWait = 5000;byte rgbRead[1024]; int cbRead = 0;char t[1024];String v = " PEOPLE "; // frase concatenadatypedef enum // Estados de la máquina de estados{ NONE = 0, CONNECT, TCPCONNECT, WRITE, READ, CLOSE, DONE,} STATE;STATE state = CONNECT;TcpClient tcpClient;//--------------------------//**********************************************************************************************************************************************************void setup(){ Serial.begin (9600); //ya hemos establecido el número de dispositivos cuando creamos el LedControl devices=lc1.getDeviceCount(); //tenemos que inicializar todos los dispositivos en un bucle for(int address=0;address<devices;address++) { //El MAX72XX está en modo de ahorro de energía al inicio, tenemos que hacer una llamada WAKEUP lc1.shutdown(address,false); // Establecer los valores de brillo (0 a 15) lc1.setIntensity(address,MAX72xxbrightnessValue); // y limpiar la pantalla lc1.clearDisplay(address); }}//**********************************************************************************************************************************************************void loop(){ int i,j,k,second=0; char va[20]; get_value(idvariable); check(); strcpy(va, v.c_str()); for(i=0;i<20;i++) { if ((va[i] > 32) or (va[i] < 122)) { msg[i] = va[i]; } else { break; } } msgsize = strlen(msg); while(1) { second++; if (second>1000) { get_value(idvariable); check(); strcpy(va, v.c_str()); for(i=0;i<20;i++) { if ((va[i] > 32) or (va[i] < 122)) { msg[i] = va[i]; } else { break; } } msgsize = strlen(msg); second=0; } //********************************************************************************************************************************************************** //Inicio de la verificación de Serial disponible //Cambiar mensaje a través de comunicación serial //********************************************************************************************************************************************************** //Fin de la verificación de Serial disponible curcharixsave2 = curcharix; curcharbitsave2 = curcharbit; for (i=7;i>=0;i=i-2) // Bucle a través de nuestras 4 matrices LED bicolor { //Si no se usa ISR - solo tener las siguientes instrucciones a continuación para alternar el apagado de los chips MAX7219 para LEDs ROJOS y VERDES para evitar la visualización de 'fantasmas' altShutDown(); for (j=0;j<8;j++) // Configurar filas en la pantalla actual { byte outputbyte = 0; curchar = msg[curcharix]; curcharixsave = curcharix; curcharbitsave = curcharbit; for (k=7;k>=0;k--) // Copiar datos para 8 columnas a la fila actual y enviarlo a la pantalla actual - desplazarse de derecha a izquierda { byte currentcharbits; // Este byte es el mapa de bits del carácter actual para la fila actual currentcharbits = Font8x5[((curchar-32)*8)+j]; if (currentcharbits & (1<<curcharbit)) outputbyte |= (1<<k); // avanzar el bit del carácter actual del carácter actual curcharbit ++; if (curcharbit > lentbl_S[curchar-32]) // hemos pasado el final de este carácter, así que avanza. { curcharbit = 0; curcharix += 1; if (curcharix+1 > msgsize) curcharix=0; curchar = msg[curcharix]; } } if (i<8) //Primer conjunto de 4 x matriz LED bicolor (necesita 8 x MAX7219) { if (colorMode == '1') //Rojo { lc1.setRow(i-1, j, outputbyte); //Número par de dispositivos - Rojo } else if (colorMode == '2') //Verde { lc1.setRow(i, j, outputbyte); //Número impar de dispositivos - Verde } else if (colorMode == '3') //Naranja { lc1.setRow(i-1, j, outputbyte); //Número par de dispositivos - Rojo lc1.setRow(i, j, outputbyte); //Número impar de dispositivos - Verde } } if (j != 7) // si esta no es la última fila, retroceder el avance, si lo es, dejar los contadores avanzados. { curcharix = curcharixsave; curcharbit = curcharbitsave; } } } curcharix = curcharixsave2; curcharbit = curcharbitsave2; // Preparar nuevo mensaje de texto if (newMsg == true) { newMsg = false; MAXbrightnessCount = 0; MAX72xxbrightnessValue = 0; if (newCmd == true) { newCmd = false; if (temp_msg[5]=='*') // Para usar el mensaje de texto actual { //no hacer nada } else { for (j=0;j<temp_msgsize;j++) // Descartar la parte del comando de los datos del mensaje temp_msg[j]=temp_msg[j+5]; temp_msgsize = strlen(temp_msg); for (j=0;j<temp_msgsize;j++) msg[j]=temp_msg[j]; msgsize = strlen(temp_msg); } } else { for (j=0;j<temp_msgsize;j++) msg[j]=temp_msg[j]; msgsize = strlen(temp_msg); } colorMode = temp_colorMode; } curchar = msg[curcharix]; // avanzar el bit del carácter actual del carácter actual curcharbit ++; if (curcharbit > lentbl_S[curchar-32]) // hemos pasado el final de este carácter, así que avanza. { curcharbit = 0; curcharix += 1; if (curcharix+1 > msgsize) curcharix=0; { curchar = msg[curcharix]; } } if (colorMode == '3') //Visualización NARANJA delay(scrollDelay/10); //El desplazamiento en NARANJA es mucho más lento que en ROJO y VERDE debido al apagado alterno de los chips MAX 7219 requerido else delay(scrollDelay); // Efecto de desvanecimiento para el nuevo mensaje de texto if (fadeInFlag == true) { if (MAXbrightnessCount < 6) { MAXbrightnessCount = MAXbrightnessCount+1; for(int address=0;address<devices;address++) lc1.setIntensity(address,MAX72xxbrightnessValue); } else if (MAX72xxbrightnessValue < SetbrightnessValue) { MAX72xxbrightnessValue = MAX72xxbrightnessValue+1; if (MAX72xxbrightnessValue > SetbrightnessValue) MAX72xxbrightnessValue = SetbrightnessValue; for(int address=0;address<devices;address++) lc1.setIntensity(address,MAX72xxbrightnessValue); } } }}//********************************************************************************************************************************************************** void maxAll(int cmd) { byte reg = 0x0c; //max7219_reg_shutdown byte col = 0x01; //apagado falso byte col2 = 0x00; //apagado verdadero int c = 0; digitalWrite(lc1_Load_Pin, LOW); if (cmd == offREDoffGREEN){ //for ( c =1; c<= maxInUse; c++) { for ( c =1; c<= 4; c++) { putByte(reg);// especificar registro putByte(col2);//((data & 0x01) * 256) + data >> 1); // poner datos putByte(reg);// especificar registro putByte(col2);//((data & 0x01) * 256) + data >> 1); // poner datos }}else if (cmd == offREDonGREEN){ //for ( c =1; c<= maxInUse; c++) { for ( c =1; c<= 4; c++) { putByte(reg);// especificar registro putByte(col);//((data & 0x01) * 256) + data >> 1); // poner datos putByte(reg);// especificar registro putByte(col2);//((data & 0x01) * 256) + data >> 1); // poner datos }}else if (cmd == onREDoffGREEN){ //for ( c =1; c<= maxInUse; c++) { for ( c =1; c<= 4; c++) { putByte(reg);// especificar registro putByte(col2);//((data & 0x01) * 256) + data >> 1); // poner datos putByte(reg);// especificar registro putByte(col);//((data & 0x01) * 256) + data >> 1); // poner datos }} digitalWrite(lc1_Load_Pin, LOW); digitalWrite(lc1_Load_Pin,HIGH);} //**********************************************************************************************************************************************************void putByte(byte data_1) { byte i = 8; byte mask; while(i > 0) { mask = 0x01 << (i - 1); // obtener máscara de bits digitalWrite(lc1_CLK_Pin, LOW); // tick if (data_1 & mask) // elegir bit { digitalWrite(lc1_DataIn_Pin, HIGH);// enviar 1 } else { digitalWrite(lc1_DataIn_Pin, LOW); // enviar 0 } digitalWrite(lc1_CLK_Pin, HIGH); // tock --i; // mover a un bit menor }}//**********************************************************************************************************************************************************void altShutDown() //Método simple pero no ideal para el apagado alterno de los chips MAX7219 para LEDs ROJOS y VERDES si no se emplea el método de temporizador ISR { if (colorMode == '3') //Desplazamiento en NARANJA { lastcolorMode = '3'; if(maxInShutdown==RED){ maxAll(onREDoffGREEN); maxInShutdown=GREEN; } else { maxAll(offREDonGREEN); maxInShutdown=RED; } } else if ((colorMode == '2') and (lastcolorMode != '2')) //Desplazamiento en VERDE { lastcolorMode = '2'; maxAll(offREDonGREEN); maxInShutdown=RED; } else if ((colorMode == '1') and (lastcolorMode != '1')) //Desplazamiento en ROJO { lastcolorMode = '1'; maxAll(onREDoffGREEN); maxInShutdown=GREEN; } else if (colorMode == '4') //Pantalla en blanco { lastcolorMode = '4'; maxAll(offREDoffGREEN); maxInShutdown=GREEN; }} boolean get_value(String idvariable)//Enviar valor a Ubidots{ String message = "GET /api/v1.6/variables/"+idvariable+" HTTP/1.1\nX-Auth-Token: "+token+"\nHost: things.ubidots.com\n\n"; byte rgbWriteStream[message.length()] ; message.getBytes(rgbWriteStream,message.length() + 1); int cbWriteStream = sizeof(rgbWriteStream); state_machine(rgbWriteStream,cbWriteStream); return true;} boolean state_machine(byte rgbWriteStream[], int cbWriteStream)//Manejar la conexión TCP{ int conID = DWIFIcK::INVALID_CONNECTION_ID; int rap = 1; DNETcK::STATUS status; while(rap>0) { switch(state) { case CONNECT: if((conID = WiFiConnectMacro()) != DWIFIcK::INVALID_CONNECTION_ID) { Serial.print("Conexión creada, ConID = "); Serial.println(conID, DEC); state = TCPCONNECT; } else { Serial.print("No se pudo conectar, estado: "); Serial.println(status, DEC); state = CLOSE; } break; case TCPCONNECT: Serial.print("H1"); DNETcK::begin(); Serial.print("H2"); tcpClient.connect(szIPServer, portServer); Serial.print("H3"); state = WRITE; break; case WRITE: Serial.print("H4"); if(tcpClient.isConnected()) { Serial.print("H5"); //Serial.println("Conexión establecida"); tcpClient.writeStream(rgbWriteStream, cbWriteStream); //Serial.println("Bytes leídos de vuelta:"); state = READ; tStart = (unsigned) millis(); } break; case READ: // ver si tenemos algo que leer if((cbRead = tcpClient.available()) > 0) { cbRead = cbRead < sizeof(rgbRead) ? cbRead : sizeof(rgbRead); cbRead = tcpClient.readStream(rgbRead, cbRead); for(int i=0; i < cbRead; i++) { t[i] = (char)rgbRead[i]; //Serial.print(t[i]); } } else if( (((unsigned) millis()) - tStart) > tWait ) { Serial.println(""); state = CLOSE; } // darnos algo de tiempo para que todo se ecoe de vuelta break; case CLOSE: state = DONE; break; case DONE: state = CONNECT; tcpClient.close(); tcpClient.discardReadBuffer(); DNETcK::end(); DWIFIcK::disconnect(status); rap = 0; break; default: break; } // mantener la pila viva en cada paso a través del loop() }}void check(){ char TOKEN[9]={'"','v','a','l','u','e','"',':',' '}; int flag=0; v = " PEOPLE "; for(int i=0; i < 1000; i++) { if((TOKEN[flag]==t[i])&&(flag<9)) { flag++; } else if(((t[i]>47)&&(t[i]<58)||(t[i]=='.')||(t[i]=='}'))&&(flag>8)) { if(t[i]=='}') { break; } else { v+=t[i]; temp_msg[i] = t[i]; msg[i] = t[i]; flag++; } } else { flag=0; } }}
Este artículo fue publicado originalmente en el Blog de Ubidots el 17 de septiembre de 2015.