Yes that is correct, it is the SOS+1 “hard fault”.
According to the thread, a possibility of the fault occurring is accessing “buggy” data in the EEPROM. I am not storing any data, instead I am just reading data of multiple sensors and pushing them to particle cloud. Here is a rundown of what I am doing:
Setting up my sensors:
std::vector<Sensor*> sensorVector;
sensorVector.push_back(new firstSensor("pipe1","pipe2","pipe3",4));
sensorVector.push_back(new firstSensor("pipe1","pipe2","pipe3",5));
sensorVector.push_back(new bme("Temp","Hmdty", bme));
…
Parent Sensor class:
#ifndef SENSOR_H
#define SENSOR_H
#include "map"
#include "application.h"
//Size of averageing array
const int SIZE = 60;
class Sensor {
private:
//Collection of data values
std::map<String, String> rawData;
std::map<String, String> avgData;
//Flag for Sensor state
int flag = -1;
public:
//Abstract method to read sensor data
virtual void readSensor() = 0;
//Abstract method to calculate average
virtual void calculateAvg() = 0;
//Getters
int getFlag() { return flag; };
std::map<String, String> getRawData() { return rawData; };
std::map<String, String> getAvgData() { return avgData; };
//Setters
void setFlag(int newFlag) { flag = newFlag; }
void setRawDataValue(String name, String value) { rawData[name] = value; };
void setAvgDataValue(String name, String value) { avgData[name] = value; };
//Insert
void insertRawData(String name, String value) { rawData.insert({name, value}); };
void insertAvgData(String name, String value) { avgData.insert({name, value}); };
};
#endif
Here is the class for bme, firstSensor follows similar but with different communication
#ifndef BME_h
#define BME_h
#include "Sensor.h"
#include "application.h"
#include "Adafruit_BME280.h"
class Bme: public Sensor {
private:
//Name of JSON objects
String temperature, humidity;
//BME object
Adafruit_BME280* bme;
public:
//Constructor for BME sensor
Bme(String temp, String hmdty, Adafruit_BME280* bmeSensor);
//Read BME sensor
virtual void readSensor();
//Calculate average for BME sensor
virtual void calculateAvg();
};
#endif
I didn’t include the .cpp files as I have these working in different code without any errors that I am experiencing in this code.
In my loop() function, I have:
currentSecond = Time.second();
//Iterate through Sensors
for (std::vector<Sensor*>::iterator it = sensorVector.begin(); it != sensorVector.end(); ++it) {
//Run particle process
Particle.process();
//Obtain sensor values
(*it)->readSensor();
//Run particle process
Particle.process();
//Obtain sensor average
(*it)->calculateAvg();
}
//Run particle process
Particle.process();
if (currentSecond == 0) {
createMessage();
bool success = Particle.publish("Data", message);
}
//Run particle process
Particle.process();
Where my createMessage() function is:
//Create message from sensors
void createMessage() {
//Get all sensor data into a single string
String preMessage = "{";
//Create time JSON object
preMessage += String("\"Time\":\"") + String((const char*)Time.format("%FT%TZ"));
//Grab data from sensors
for (auto sensor : sensorVector) {
for (auto data : sensor->getAvgData()) {
preMessage = preMessage + String(",\"") + data.first + String("\":") + data.second;
}
}
//Close message
preMessage += String("}");
//Format string to c-style string to be sent
strcpy(message, preMessage.c_str());
}
with message being declared as char[256]
I am not using the WebIDE, I am using particle workbench.