This project shows how to read an Ubidots variable using an HTTP GET request and the chipKIT Uno board.
This serves as an example of how data can be read from an embedded system using the short polling technique. There are other methods and protocols to talk to a remote device which can help you achieve real time push notifications; long polling, MQTT or CoAP. For more information about these methods, check out our article "Choosing the Right Protocol to Send Data to Remote Devices".
Materials
Wiring
To get started you'll only need five wires. Please keep in mind that an external power source will be needed if handling more than two (2) LED Matrix:
Coding
This is a modification of the LED Matrix code provided by JolliFactory. Please remember to put the corresponding TOKEN and Variable ID of your Ubidots account.
Also, refer to our chipKIT WiFi Shield example to download the required networking libraries so the code can compile.
#include <Wprogram.h>#include <Wire.h>#include <WiFiShieldOrPmodWiFi_G.h> #include <DNETcK.h>#include <DWIFIcK.h>#include <LedControl.h>//------------------------------End Libraries----------------------------------#define GREEN 0 #define RED 1 #define offREDoffGREEN 0#define offREDonGREEN 1#define onREDoffGREEN 2int MAXbrightnessCount = 0;int maxInShutdown=RED; // indicates which LED Matrix color is currently offint colorMode = '2'; // default color (1 = RED, 2 = GREEN, 3 = ORANGE, 4 = blank off)int lastcolorMode = '0'; int temp_colorMode = '2'; int brightnessLevel = '9'; // default brightness level (1 to 9)int SetbrightnessValue = (15 * (brightnessLevel-48))/9; //Re-adjust values to meet MAX7219 Brightness Level range between 0 to 15int MAX72xxbrightnessValue = 0;int scrollDelay = 30; // default scroll delay boolean newMsg = false;boolean newCmd = false;boolean fadeInFlag = true;// You may change the pin assignments according to your requirements below// First set of 4 Bi-color LED Matricesint devices;int lc1_DataIn_Pin = 7;int lc1_CLK_Pin = 6;int lc1_Load_Pin = 5;int lc1_LEDMatrixQty = 4; // No. of Bi-color LED Matrices daisy-chained//Create a new LedControl for first set of 4 Bi-color LED Matrices with 2 MAX7219 chips eachLedControl 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);// The character set courtesy of 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;//---------------------------End initialization Matrix-------------------------------------char * szIPServer = "industrial.api.ubidots.com"; // server to connect tounsigned short portServer = 80; // port serverconst char * szSsid = "Atom House Medellin"; // SSIDconst char * szPassPhrase = "atommed2014"; // passphrase#define WiFiConnectMacro() DWIFIcK::connect(szSsid, szPassPhrase, &status) String token="pSZJt9W7v5W3fpUsRYNKiDMgJ770NK"; // your tokenString idvariable="53e262127625421973e7cdb5"; // your variable IDunsigned tStart = 0;unsigned tWait = 5000;byte rgbRead[1024]; int cbRead = 0;char t[1024];String v = " PEOPLE "; // concatenated phrasetypedef enum // States of the state machine{ NONE = 0, CONNECT, TCPCONNECT, WRITE, READ, CLOSE, DONE,} STATE;STATE state = CONNECT;TcpClient tcpClient;//--------------------------//**********************************************************************************************************************************************************void setup(){ Serial.begin (9600); //we have already set the number of devices when we created the LedControl devices=lc1.getDeviceCount(); //we have to init all devices in a loop for(int address=0;address<devices;address++) { //The MAX72XX is in power-saving mode on startup, we have to do a WAKEUP call lc1.shutdown(address,false); // Set the brightness values (0 to 15) lc1.setIntensity(address,MAX72xxbrightnessValue); // and clear the display 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; } //********************************************************************************************************************************************************** //Start of Serial available Check //Change message via serial comm //********************************************************************************************************************************************************** //End of Serial available Check curcharixsave2 = curcharix; curcharbitsave2 = curcharbit; for (i=7;i>=0;i=i-2) // Loop through our 4 Bi-color LED Matrices { //If ISR not used - just have the following instructions below to alternate shutdown of MAX7219 chips for RED and GREEN LEDs to prevent 'ghosting' display altShutDown(); for (j=0;j<8;j++) // Set up rows on current display { byte outputbyte = 0; curchar = msg[curcharix]; curcharixsave = curcharix; curcharbitsave = curcharbit; for (k=7;k>=0;k--) // Copy over data for 8 columns to current row and send it to current display - scroll from right to left { byte currentcharbits; // This byte is the bitmap of the current character for the current row currentcharbits = Font8x5[((curchar-32)*8)+j]; if (currentcharbits & (1<<curcharbit)) outputbyte |= (1<<k); // advance the current character bit of current character curcharbit ++; if (curcharbit > lentbl_S[curchar-32]) // we are past the end of this character, so advance. { curcharbit = 0; curcharix += 1; if (curcharix+1 > msgsize) curcharix=0; curchar = msg[curcharix]; } } if (i<8) //First Set of 4 x Bi-color LED Matrix (need 8 x MAX7219) { if (colorMode == '1') //Red { lc1.setRow(i-1, j, outputbyte); //Even number devices - Red } else if (colorMode == '2') //Green { lc1.setRow(i, j, outputbyte); //Odd number devices - Green } else if (colorMode == '3') //Orange { lc1.setRow(i-1, j, outputbyte); //Even number devices - Red lc1.setRow(i, j, outputbyte); //Odd number devices - Green } } if (j != 7) // if this is not the last row, roll back advancement, if it is, leave the counters advanced. { curcharix = curcharixsave; curcharbit = curcharbitsave; } } } curcharix = curcharixsave2; curcharbit = curcharbitsave2; // Prepare new text message if (newMsg == true) { newMsg = false; MAXbrightnessCount = 0; MAX72xxbrightnessValue = 0; if (newCmd == true) { newCmd = false; if (temp_msg[5]=='*') // To use current text message { //do Nothing } else { for (j=0;j<temp_msgsize;j++) // Discard command part from message data 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]; // advance the current character bit of current character curcharbit ++; if (curcharbit > lentbl_S[curchar-32]) // we are past the end of this character, so advance. { curcharbit = 0; curcharix += 1; if (curcharix+1 > msgsize) curcharix=0; { curchar = msg[curcharix]; } } if (colorMode == '3') //ORANGE Display delay(scrollDelay/10); //Scrolling in ORANGE is much slower than in RED and GREEN due to alternate shutdown of MAX 7219 chips required else delay(scrollDelay); // Fade-in effect for new text message 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; //shutdown false byte col2 = 0x00; //shutdown true 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);// specify register putByte(col2);//((data & 0x01) * 256) + data >> 1); // put data putByte(reg);// specify register putByte(col2);//((data & 0x01) * 256) + data >> 1); // put data }}else if (cmd == offREDonGREEN){ //for ( c =1; c<= maxInUse; c++) { for ( c =1; c<= 4; c++) { putByte(reg);// specify register putByte(col);//((data & 0x01) * 256) + data >> 1); // put data putByte(reg);// specify register putByte(col2);//((data & 0x01) * 256) + data >> 1); // put data }}else if (cmd == onREDoffGREEN){ //for ( c =1; c<= maxInUse; c++) { for ( c =1; c<= 4; c++) { putByte(reg);// specify register putByte(col2);//((data & 0x01) * 256) + data >> 1); // put data putByte(reg);// specify register putByte(col);//((data & 0x01) * 256) + data >> 1); // put data }} 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); // get bitmask digitalWrite(lc1_CLK_Pin, LOW); // tick if (data_1 & mask) // choose bit { digitalWrite(lc1_DataIn_Pin, HIGH);// send 1 } else { digitalWrite(lc1_DataIn_Pin, LOW); // send 0 } digitalWrite(lc1_CLK_Pin, HIGH); // tock --i; // move to lesser bit }}//**********************************************************************************************************************************************************void altShutDown() //Simple but not ideal method for alternate shutdown of MAX7219 chips for RED and GREEN LEDs if ISR Timer method is not employed { if (colorMode == '3') //Scrolling in ORANGE { lastcolorMode = '3'; if(maxInShutdown==RED){ maxAll(onREDoffGREEN); maxInShutdown=GREEN; } else { maxAll(offREDonGREEN); maxInShutdown=RED; } } else if ((colorMode == '2') and (lastcolorMode != '2')) //Scrolling in GREEN { lastcolorMode = '2'; maxAll(offREDonGREEN); maxInShutdown=RED; } else if ((colorMode == '1') and (lastcolorMode != '1')) //Scrolling in RED { lastcolorMode = '1'; maxAll(onREDoffGREEN); maxInShutdown=GREEN; } else if (colorMode == '4') //Blank Display { lastcolorMode = '4'; maxAll(offREDoffGREEN); maxInShutdown=GREEN; }} boolean get_value(String idvariable)//Send value to 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)//Handle the TCP connection{ 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("Connection Created, ConID = "); Serial.println(conID, DEC); state = TCPCONNECT; } else { Serial.print("Unable to connection, status: "); 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("Got Connection"); tcpClient.writeStream(rgbWriteStream, cbWriteStream); //Serial.println("Bytes Read Back:"); state = READ; tStart = (unsigned) millis(); } break; case READ: // see if we got anything to read 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; } // give us some time to get everything echo'ed back break; case CLOSE: state = DONE; break; case DONE: state = CONNECT; tcpClient.close(); tcpClient.discardReadBuffer(); DNETcK::end(); DWIFIcK::disconnect(status); rap = 0; break; default: break; } // keep the stack alive each pass through the 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; } }}
This article was originally published on Ubidots' Blog on September 17, 2015.