Arduino cloud issue

I'm using Arduino cloud with esp32 for multiple sensors:

  1. NEO 6M GPS
  2. MPU6050
  3. A BUTTON

Whenever I run the code the board does not connect with wifi rather it runs the void accident function. It runs smooth without the void accident function. See link below:

#include "thingProperties.h"
#include <Wire.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

float LAT;
float LONG;
int spd;
int pushbutton = 5;
int bzr = 2;

const int MPU_addr = 0x68; // I2C address of the MPU-6050
 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
 float ax = 0, ay = 0, az = 0, gx = 0, gy = 0, gz = 0;
 boolean fall = false; //stores if a fall has occurred
 boolean trigger1 = false; //stores if first trigger (lower threshold) has occurred
 boolean trigger2 = false; //stores if second trigger (upper threshold) has occurred
 boolean trigger3 = false; //stores if third trigger (orientation change) has occurred
 byte trigger1count = 0; //stores the counts past since trigger 1 was set true
 byte trigger2count = 0; //stores the counts past since trigger 2 was set true
 byte trigger3count = 0; //stores the counts past since trigger 3 was set true
 int angleChange = 0;



static const int RXPin = 16, TXPin = 17;   // GPIO 4=D2(conneect Tx of GPS) and GPIO 5=D1(Connect Rx of GPS
static const uint32_t GPSBaud = 9600; //if Baud rate 9600 didn't work in your case then use 4800

TinyGPSPlus gps; // The TinyGPS++ object
SoftwareSerial ss(RXPin, TXPin);  // The serial connection to the GPS device

//unsigned int move_index;         // moving index, to be used later
unsigned int move_index = 1;       // fixed location for now


void setup() {
   Serial.begin(9600);
   pinMode(bzr, OUTPUT);
pinMode(pushbutton, INPUT_PULLUP);


  Serial.println();
  ss.begin(GPSBaud);
  checkGPS();
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 
  
   Wire.begin();
   Wire.beginTransmission(MPU_addr);
   Wire.write(0x6B);  // PWR_MGMT_1 register
   Wire.write(0);     // set to zero (wakes up the MPU-6050)
   Wire.endTransmission(true);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(500); 

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void checkGPS()                           //check GPS
{
  if (gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
     
  }
}

void loop() {
  
   ArduinoCloud.update();
  
   while (ss.available() > 0) 
    {
      // sketch displays information every time a new sentence is correctly encoded.
      if (gps.encode(ss.read()))
      displayInfo();
      onWearChange();
}
onAccidentChange();
}

void displayInfo()                                               //GPS 
{ 
  if (gps.location.isValid() ) 
  {    
    LAT = (gps.location.lat());     //Storing the Lat. and Lon. 
    LONG = (gps.location.lng()); 
    
    Serial.print("LAT:  ");
    Serial.println(LAT, 6);  // float to x decimal places
    Serial.print("LONG: ");
    Serial.println(LONG, 6);
    
    spd = gps.speed.kmph();               //get speed
    Serial.print("speed (kmph):  ");
     Serial.println(spd);
     
     //latitude = LAT;
     //longitude = LONG;
     speed = spd;
     cordinates = {LAT,LONG};
     }
   
  
 Serial.println();
}


void onWearChange()                                   //wearing
{
  // Add your code here to act upon Wear change
  int buttonstate = digitalRead(pushbutton);
 //Serial.println(buttonstate);
 
 if (buttonstate == HIGH){
    wear = false;
    }
   else if (buttonstate == LOW)
  { wear = true;
 }
}


void mpu_read() {
   Wire.beginTransmission(MPU_addr);
   Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
   Wire.endTransmission(false);
   Wire.requestFrom(MPU_addr, 14, true); // request a total of 14 registers
   AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
   AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
   AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
   Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
   GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
   GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
   GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
 }

/*
  Since Accident is READ_WRITE variable, onAccidentChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onAccidentChange()  {
  // Add your code here to act upon Accident change
  mpu_read();
   ax = (AcX - 2050) / 16384.00;
   ay = (AcY - 77) / 16384.00;
   az = (AcZ - 1947) / 16384.00;
   gx = (GyX + 270) / 131.07;
   gy = (GyY - 351) / 131.07;
   gz = (GyZ + 136) / 131.07;
   // calculating Amplitute vactor for 3 axis
   float Raw_Amp = pow(pow(ax, 2) + pow(ay, 2) + pow(az, 2), 0.5);
   int Amp = Raw_Amp * 10;  // Mulitiplied by 10 bcz values are between 0 to 1
   Serial.println(Amp);
   
   
if (Amp <= 2 && trigger2 == false) { //if AM breaks lower threshold (0.4g)     
trigger1 = true;     
Serial.println("TRIGGER 1 ACTIVATED");   
}   
if (trigger1 == true) {     
trigger1count++;     
if (Amp >= 12) { //if AM breaks upper threshold (3g)
       trigger2 = true;
       Serial.println("TRIGGER 2 ACTIVATED");
      
       trigger1 = false; trigger1count = 0;
     }
   }
   if (trigger2 == true) {
     trigger2count++;
     angleChange = pow(pow(gx, 2) + pow(gy, 2) + pow(gz, 2), 0.5); Serial.println(angleChange);
     if (angleChange >= 30 && angleChange <= 400) { //if orientation changes by between 80-100 degrees       
trigger3 = true; trigger2 = false; trigger2count = 0;       
Serial.println(angleChange);  

Serial.println("TRIGGER 3 ACTIVATED");   
   
}   
}   
if (trigger3 == true) {     
trigger3count++;     
if (trigger3count >= 10) {
       angleChange = pow(pow(gx, 2) + pow(gy, 2) + pow(gz, 2), 0.5);
       //delay(10);
       Serial.println(angleChange);
       
       if ((angleChange >= 0) && (angleChange <= 10)) { //if orientation changes remains between 0-10 degrees         
fall = true; trigger3 = false; trigger3count = 0;         
Serial.println(angleChange);  

}       
else { //user regained normal orientation         
trigger3 = false; trigger3count = 0;         
Serial.println("TRIGGER 3 DEACTIVATED");   
     
}     
} 

}
   
if (fall == true) { //in event of a fall detection     
Serial.println("FALL DETECTED"); 
digitalWrite(bzr,HIGH); 
accident = "Rider fell";                                      //STRING
delay (1000);
fall = false;
digitalWrite(bzr,LOW);
}   
if (trigger2count >= 6) { //allow 0.5s for orientation change
     trigger2 = false; trigger2count = 0;
     Serial.println("TRIGGER 2 DECACTIVATED");
     
   }
   if (trigger1count >= 6) { //allow 0.5s for AM to break upper threshold
     trigger1 = false; trigger1count = 0;
     Serial.println("TRIGGER 1 DECACTIVATED");
     
   }
   delay(100);
}

please help.

need to post the code. use "</>" icon

1 Like

can you please tell how can I allign different functions to run at a specific time rate?

consider

const byte PinLeds [] = { 10, 11, 12 };

// -----------------------------------------------------------------------------
void
funcLed0 (void)
{
    digitalWrite (PinLeds [0], ! digitalRead (PinLeds [0]));
}

void
funcLed1 (void)
{
    digitalWrite (PinLeds [1], ! digitalRead (PinLeds [1]));
}

void
funcLed2 (void)
{
    digitalWrite (PinLeds [2], ! digitalRead (PinLeds [2]));
}

// -----------------------------------------------------------------------------
typedef void (*Func)(void);

struct Job {
    Func           func;
    unsigned long  msecPeriod;
    unsigned long  msecLst;
    const char    *desc;
};

Job jobs [] = {
    { funcLed0, 750, 0, "led 0" },
    { funcLed1, 500, 0, "led 1" },
    { funcLed2, 333, 0, "led 2" },
};

// -----------------------------------------------------------------------------
void
loop (void)
{
    unsigned long msec = millis ();

    Job *j = jobs; 
    for (unsigned n = 0; n < sizeof(PinLeds); n++, j++)  {
        if ( (msec - j->msecLst) >= j->msecPeriod)  {
            j->msecLst = msec;
            j->func ();
            Serial.println (j->desc);
        }
    }
}

// -----------------------------------------------------------------------------
void
setup (void)
{
    Serial.begin (9600);

    Job *j = jobs; 
    for (unsigned n = 0; n < sizeof(PinLeds); n++, j++)  {
        pinMode (PinLeds [n], OUTPUT);
        Serial.println (n);
    }
}
1 Like

thanks

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