Hi ,
I changed the code based on your inputs but I am still missing every 10th data point.
This is the updated code.
// Buffers and Constants
const size_t READ_BUF_SIZE=512;
char readBuf[READ_BUF_SIZE];
size_t readBuffOffset=0;
//Time Variables
unsigned long lasttime=0;
unsigned int lastpublish=0;
unsigned long now;
int ts;
//Battery Variables
int batteryLife=0;
FuelGauge fuel;
//Global variables
int ctr=0;
int good_data_counter=0;
long int bavg[16]={0};
long int bavg_ctr[16]={0};
//Thingspeak
char msg1[128];
char msg2[128];
char msg3[128];
const char * eventName1 = "thingSpeakWrite_All";
const char * eventName2 = "thingSpeakWrite_Slave";
const char * eventName3 = "thingSpeakWrite_extra";
const char * key1 = "XXXXXXXXXXXXXX"; //
const char * key2 = "XXXXXXXXXXXXXX"; // slave for bins 8-15
const char * key3 = "XXXXXXXXXXXXXX";
// Forward declarations
void processBuffer();
void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
//Particle cloud variables
Particle.variable("Bin0",bavg[0]);
Particle.variable("Bin1",bavg[1]);
Particle.variable("Bin2",bavg[2]);
Particle.variable("Bin3",bavg[3]);
Particle.variable("Bin4",bavg[4]);
Particle.variable("Bin5",bavg[5]);
Particle.variable("Bin6",bavg[6]);
Particle.variable("Bin7",bavg[7]);
Particle.variable("Bin8",bavg[8]);
Particle.variable("Bin9",bavg[9]);
Particle.variable("Bin10",bavg[10]);
Particle.variable("Bin11",bavg[11]);
Particle.variable("Bin12",bavg[12]);
Particle.variable("Bin13",bavg[13]);
Particle.variable("Bin14",bavg[14]);
Particle.variable("Bin15",bavg[15]);
Particle.variable("Time_unix",ts);
Particle.variable("BatL",batteryLife);
}
void loop()
{
now=millis();
if (now-lasttime>750) //Read every second
{
while(Serial1.available())
{
if(readBuffOffset < READ_BUF_SIZE)
{
char c=Serial1.read();
if(c !='\n')
{
readBuf[readBuffOffset++]=c;
}
else
{
readBuf[readBuffOffset] = 0; // End of line character found, process line
processBuffer();
readBuffOffset = 0;
lasttime=now;
}
}
else
{
readBuffOffset=0;
lasttime=now;
}
}
}
}
//Processing the input data
void processBuffer()
{
//Constants
int i=0;int j;int z;
int num[16]={0};
char *p;
int num_v1[16];
const char* startpoint="512,";
p=strstr(readBuf,startpoint);
z=(int) (p-readBuf);
char *rawdata=readBuf+z+4;
//Serial.println(readBuf);
//Serial.println(rawdata);
char *token=strtok(rawdata,",");
while (token!=NULL && i<=16)
{
num[i]=atoi(token);
token=strtok(NULL,",");
i++;
}
for(i=0;i<=15;i++)
{
num_v1[i]=num[i];
}
if((0<num_v1[0]<=10000) && (0<num_v1[1]<=10000) && (0<num_v1[2]<=10000) && (0<num_v1[3]<=10000) && (0<=num_v1[4]<=10000) && (0<=num_v1[5]<=10000) && (0<=num_v1[6]<=10000) && (0<=num_v1[7]<=10000) && (0<=num_v1[8]<=10000) && (0<=num_v1[9]<=10000) && (0<=num_v1[10]<=10000) && (0<=num_v1[11]<=10000) && (0<=num_v1[12]<=10000) && (0<=num_v1[13]<=10000) && (0<=num_v1[14]<=10000) && (0<=num_v1[15]<=10000) )
{
for (i=0;i<=15;i++)
{
bavg_ctr[i]=bavg_ctr[i]+num_v1[i];
}
good_data_counter=good_data_counter+1;
}
if((now-lastpublish)>=60000||good_data_counter==60)
{
ts = Time.now();
ts=ts-60;
//batteryLife = fuel.getSoC();
for(j=0;j<=15;j++)
{
bavg[j]=bavg_ctr[j]/good_data_counter;
}
//PUBLISH TO THINGSPEAK
snprintf(msg1,sizeof(msg1),
"{\"1\":\"%d\" , \"2\":\"%d\" , \"3\":\"%d\" , \"4\":\"%d\" , \"5\":\"%d\" , \"6\":\"%d\" , \"7\":\"%d\" , \"8\":\"%d\" , \"k\":\"%s\"}" ,
bavg[0],bavg[1],bavg[2],bavg[3],bavg[4],bavg[5],bavg[6],bavg[7],key1);
Particle.publish(eventName1,msg1 , PRIVATE);
snprintf(msg2,sizeof(msg2),
"{\"1\":\"%d\" , \"2\":\"%d\" , \"3\":\"%d\" , \"4\":\"%d\" , \"5\":\"%d\" , \"6\":\"%d\" , \"7\":\"%d\" , \"8\":\"%d\" , \"k\":\"%s\"}" ,
bavg[8],bavg[9],bavg[10],bavg[11],bavg[12],bavg[13],bavg[14],bavg[15],key2);
Particle.publish(eventName2 ,msg2 , PRIVATE);
snprintf(msg3,sizeof(msg3),
"{\"1\":\"%d\" , \"2\":\"%d\" , \"3\":\"%d\", \"k\":\"%s\"}" ,
ts,batteryLife,good_data_counter,key3);
Particle.publish(eventName3,msg3 , PRIVATE);
//RESETTING THE VARIABLES AND ARRAYS
good_data_counter=0;
lastpublish=now;
for(j=0;j<=15;j++)
{
bavg[j]=0;
bavg_ctr[j]=0;
num_v1[j]=0;
num[j]=0;
}
memset(msg1, 0, sizeof(msg1));
memset(msg2, 0, sizeof(msg2));
memset(msg3, 0, sizeof(msg3));
}
}