Problem sending data HC-06 on Arduino

0

I was trying to transfer data using an HC-06 module and everything was fine at first, since I could receive them via Bluetooth on my smartphone. But it turns out that after a while (between 5 and 15 minutes) stops transmitting, and I do not know what may be due, I leave the code below:

#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"

#include <avr/wdt.h> // Incluir la librería de ATmel

#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif

MPU6050 mpu;

int ax, ay, az;
int gx, gy, gz;

const int LED = 13;
const int BTPWR = 12;

char nombreBT[16] = "HC-06";
char velocidad ='4';//9600
char pin [5]= "0000";

const String name_of_this_node = "Nodo1"; //Maximum 10 characters
const byte delay_seconds = 1; //Delay in seconds between loops

#define INTERRUPT_PIN 2  // use pin 2 on Arduino Uno & most boards
#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 =         
success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor     
measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor 
measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and         
gravity vector

// packet structure for InvenSense teapot demo
//uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, 
'\r', '\n' };

volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt 
pin has gone high
void dmpDataReady() {
    mpuInterrupt = true;
}

void setup(){
  pinMode(LED, OUTPUT);
  pinMode(BTPWR, OUTPUT);

 digitalWrite(LED, LOW);
 digitalWrite(BTPWR, HIGH);



  // join I2C bus (I2Cdev library doesn't do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    Wire.begin();
    Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having 
  compilation difficulties 
mpu.initialize(); //Iniciando el sensor
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
    Fastwire::setup(400, true);
#endif

  Serial.begin(9600);

  // initialize device
    //Serial.println(F("Initializing I2C devices..."));
    mpu.initialize();
pinMode(INTERRUPT_PIN, INPUT);

// load and configure the DMP
Serial.println(F("Initializing DMP..."));
devStatus = mpu.dmpInitialize();

// supply your own gyro offsets here, scaled for min sensitivity
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

// make sure it worked (returns 0 if so)
if (devStatus == 0) {
    // turn on the DMP, now that it's ready
    Serial.println(F("Enabling DMP..."));
    mpu.setDMPEnabled(true);

    // enable Arduino interrupt detection
    Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
    attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
    mpuIntStatus = mpu.getIntStatus();

    // set our DMP Ready flag so the main loop() function knows it's okay to use it
    Serial.println(F("DMP ready! Waiting for first interrupt..."));
    dmpReady = true;

    // get expected DMP packet size for later comparison
    packetSize = mpu.dmpGetFIFOPacketSize();
} else {
    // ERROR!
    // 1 = initial memory load failed
    // 2 = DMP configuration updates failed
    // (if it's going to break, usually the code will be 1)
    Serial.print(F("DMP Initialization failed (code "));
    Serial.print(devStatus);
    Serial.println(F(")"));
}

  //configure LED for output
    pinMode(LED_PIN, OUTPUT);

  digitalWrite(LED, HIGH);
  digitalWrite(13, HIGH);
}

void loop(){

// Leer las aceleraciones y velocidades angulares
mpu.getAcceleration(&ax, &ay, &az);
mpu.getRotation(&gx, &gy, &gz);
float ax_m_s2 = ax * (9.81/16384.0);
float ay_m_s2 = ay * (9.81/16384.0);
float az_m_s2 = az * (9.81/16384.0);

// get current FIFO count
fifoCount = mpu.getFIFOCount();

// check for overflow (this should never happen unless our code is too 
inefficient)
if ((mpuIntStatus & 0x10) || fifoCount == 2048) { 
    // reset so we can continue cleanly
    mpu.resetFIFO();

// otherwise, check for DMP data ready interrupt (this should happen 
frequently)
} else if (mpuIntStatus & 0x02) {
    // wait for correct available data length, should be a VERY short wait
    while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

    // read a packet from FIFO
    mpu.getFIFOBytes(fifoBuffer, packetSize);

    // track FIFO count here in case there is > 1 packet available
    // (this lets us immediately read more without waiting for an interrupt)
    fifoCount -= packetSize;

    // display Euler angles in degrees
        mpu.dmpGetQuaternion(&q, fifoBuffer);
        mpu.dmpGetGravity(&gravity, &q);
        mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);

}

 String azimut=String(ypr[0] * 180/M_PI);//AZIMUTH
 String x=String(ax_m_s2);//x
 String y=String(ay_m_s2);//y
 String z=String(az_m_s2);//z

 log (azimut);
 log (x);
 log (y);
 log (z);

 delay(1);
}

void log(String d) {
 Serial.println(d);
}

Greetings and thanks in advance

    
asked by Antonio 10.04.2018 в 16:07
source

1 answer

0

You must write your code correctly, try not to declare variables anything within the loop method, since you will spend more memory space every time the cycle is repeated

Edit:

should be something like:

float ax_m_s2;
float ay_m_s2;
float az_m_s2;
String azimut;
String x;
String y;
String z;

void loop(){

     // Leer las aceleraciones y velocidades angulares
     mpu.getAcceleration(&ax, &ay, &az);
     mpu.getRotation(&gx, &gy, &gz);
     ax_m_s2 = ax * (9.81/16384.0);
     ay_m_s2 = ay * (9.81/16384.0);
     az_m_s2 = az * (9.81/16384.0);
     // Resto del codigo....
     azimut=String(ypr[0] * 180/M_PI);//AZIMUTH
     x=String(ax_m_s2);//x
     y=String(ay_m_s2);//y
     z=String(az_m_s2);//z
     // Resto del codigo....
}
    
answered by 10.04.2018 в 16:20