Random hard_fault on Boron

Hey everyone! I hope this is something stupid but I can’t for the life of me figure out what’s wrong. I have 2 Boron’s, one installed in a vehicle (functioning as a GPS tracker) and another one I’m using for development. Admittedly, though I’ve had the one Boron in service for about a year, I haven’t consistently checked the event logs. Since working on the new Boron I just got, I noticed them both hard_faulting at random times. The new Boron is just attached to my computer via USB and has a GPS sensor attached - that’s all.

I don’t know if this is an OS issue, library issue, or something with my code (though I’ve had someone with more experience than me say my code is ok). What should I try? What’s the best way to debug this?

Here’s my code:

// Getting the library
#include "AssetTracker.h"

// Timer variables: Used to keep track of the last time we published data
unsigned long lastPublish = 0;
unsigned long delayMinutes = 2; // Minuetes set to default on boot - adjust in code below for actual
unsigned long inactiveTime = 120; // Minutes inbetween notification when inactive

int turboSwitch = 0; //Function call changes - used to activate turbomode
int inactiveCount = 0; 

int acc_on_pin = D2;
//int disable_pin = D3; // Relay

// Creating an AssetTracker named 't' for us to reference
AssetTracker t = AssetTracker();

void setup() {
    //Serial.begin(9600);
    pinMode(acc_on_pin, INPUT_PULLDOWN); // Pulldown resister included in Boron
    //digitalWrite(disable_pin, LOW);      // initialise the relay to off
    //pinMode(disable_pin, OUTPUT);
    
    // Sets up all the necessary AssetTracker bits
    t.begin();

    // Enable the GPS module. Defaults to off to save power.
    // Takes 1.5s or so because of delays.
    t.gpsOn();
    
    //Particle.function("Disable", fuel_shutoff);
    Particle.function("turboMode", turboMode);
}    

// Function turboMode - Record frequecy increase
int turboMode(String command) {
    if (command == "On") {
        turboSwitch = 1;
        return 1;
    } 
    else if (command == "Off") {
        turboSwitch = 0;
        return 0;
    } 
    else {return -1;}
}

void loop() {
    unsigned long now = millis();
    t.updateGPS();  // You'll need to run this every loop to capture the GPS output
    
    if (digitalRead(acc_on_pin) == HIGH) {
        delayMinutes = 2;
        inactiveCount = 0;
        if (turboSwitch == 1){
            delayMinutes = 1;
        }
    } else {
        delayMinutes = inactiveTime;
    }
    
     // if the current time - the last time we published is greater than your set delay...
    if ((now-lastPublish) >= delayMinutes*60*1000) {
        lastPublish = now; // Reset time
        if (t.gpsFix()) {
            //String pubAccel = String::format("%d,%d", coords, accStatus);
            //String datas = String::format("\"l\":%f", t.readLatLon());
            //Particle.publish("V1", datas, 60, PRIVATE);
            if (inactiveCount < 2){ // Don't report any new coordinates to reduce data after 2 
                Particle.publish("G",
                  String::format("%.5f",t.readLatDeg()) +
                  "," + String::format("%.5f",t.readLonDeg()) +
                  "," + String::format("%.0f",t.getSpeed()),
                  60, PRIVATE);
                inactiveCount++;
            }
        }
    }
}

I suggest you rather use AssetTrackerRK.
I’d also use snprintf() instead of String concatenations.

  char msg[32];
  snprintf(msg, sizeof(msg)
          , "%.5f,%.5f,%.0f"
          , t.readLatDeg()          
          , t.readLongDeg()          
          , t.getSpeed()
          );
  Particle.publish("G", msg, PRIVATE);
2 Likes

Great! Thank you for the suggestions!. I’ll report back and see how that works.

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.