количество акселерметоров снижается после 1 пика

Я использую Wemos D1 Mini и ускоритель mpu 6050. Мне удалось заставить работать ускоритель и получить 1 значение из движений. Поэтому, когда он достигает пика (то есть достигается порог 1,00), n увеличивается на 1. Таким образом, он работает немного как шагомер. Это значение помещается в мою базу данных firebase.

Однако моя проблема заключается в том, что после однократного нажатия значение n равно 1. Программа блокируется на секунду и либо сильно замедляется, либо значение ускорителя падает до 0. это происходит только тогда, когда я использую свой фрагмент кода firebase in. Я не уверен, вызывает ли это какие-либо задержки..

вот моя часть кода:

#include <Wire.h>

#include "ESP8266WiFi.h" 
#include "FirebaseArduino.h" 

#define FIREBASE_HOST "xxxxxxxxxx.firebaseio.com" // Без схем http:// или https://
#define FIREBASE_AUTH "XXXXXXXXXXXXXXXXXXXXX"
#define WIFI_SSID "Bankai"
#define WIFI_PASSWORD "xxxxxxxxxxxx"

const float HI_THRESHOLD = 1.00;
const float LO_THRESHOLD = 0.70;
bool count_flag = false;

int n= 0; //будет использоваться для хранения счетчика
int oldValue = n;
String myString;

const uint8_t MPU_addr = 0x68; // I2C-адрес MPU-6050

const float MPU_GYRO_250_SCALE = 131.0;
const float MPU_GYRO_500_SCALE = 65.5;
const float MPU_GYRO_1000_SCALE = 32.8;
const float MPU_GYRO_2000_SCALE = 16.4;
const float MPU_ACCL_2_SCALE = 16384.0;
const float MPU_ACCL_4_SCALE = 8192.0;
const float MPU_ACCL_8_SCALE = 4096.0;
const float MPU_ACCL_16_SCALE = 2048.0;



struct rawdata {
  int16_t AcX; //Ускорение
  int16_t AcY; //Ускорение
  int16_t AcZ; //Ускорение
  int16_t Tmp;
  int16_t GyX; //гироскоп
  int16_t GyY; //гироскоп
  int16_t GyZ; //гироскоп
};

// Использование переменных типа int для последующего преобразования в градусы и десятичные дроби
struct scaleddata {
  float AcX; //Ускорение
  float AcY; //Ускорение
  float AcZ; //Ускорение
  float Tmp;
  float GyX; //гироскоп
  float GyY; //гироскоп
  float GyZ; //гироскоп
};

bool checkI2c(byte addr);
void mpu6050Begin(byte addr);
rawdata mpu6050Read(byte addr, bool Debug);
void setMPU6050scales(byte addr, uint8_t Gyro, uint8_t Accl);
void getMPU6050scales(byte addr, uint8_t &Gyro, uint8_t &Accl);
scaleddata convertRawToScaled(byte addr, rawdata data_in, bool Debug);

//начнем соединение, серийный номер и соединение с БД
void setup() {
  Wire.begin();
  Serial.begin(115200);

  mpu6050Begin(MPU_addr);

    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(100);
  }
  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();
    Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

}

//если значение сейчас отличается от текущего значения, то оно проталкивается в БД, иначе появляется поток чисел.
void loop() {
  rawdata next_sample;
  setMPU6050scales(MPU_addr, 0b00000000, 0b00010000);
  next_sample = mpu6050Read(MPU_addr, false);
  convertRawToScaled(MPU_addr, next_sample, false);

Я чувствую, что именно они создают узкое место.

  //myString = String(n);
  if(oldValue != n){
   Firebase.setInt("Reps/Value", n);
  }
  delay(100); // Подождите 5 секунд и повторите сканирование


}

 float filterConstant = 0.05;
  values.AcX = (float) data_in.AcX / scale_value;
  values.AcY = (float) data_in.AcY / scale_value;
  values.AcZ = (float) data_in.AcZ / scale_value;
  filteredAx = filteredAx * (1.0 - filterConstant) + values.AcX * filterConstant;
  filteredAy = filteredAy * (1.0 - filterConstant) + values.AcY * filterConstant;
  filteredAz = filteredAz * (1.0 - filterConstant) + values.AcZ * filterConstant;
  float result = sqrt((filteredAx * filteredAx) + (filteredAy * filteredAy ) + (filteredAz * filteredAx ));

// Serial.print(значения.AcX); Серийный.print("\t");
// Serial.print(filteredAx); Серийный.print("\t");


  Serial.println(result);


  // Serial.print(значения.AcY); Серийный.print("\t");
  // Serial.print(значения.AcZ);
// Serial.println();

 if( result > HI_THRESHOLD && !count_flag) //если аналог_в > Hi_THRESHOLD и count_flag == false
     {
           n++;
           count_flag = true;
     }

     if(result <= HI_THRESHOLD) //устанавливаем флаг count_flag в false только тогда, когда он ниже порога
           count_flag = false;

  Serial.println(n);



  return values;
}

Можете ли вы помочь мне найти проблему? Спасибо!

, 👍-1


1 ответ


1

Регистрация данных действительно замедляет работу вашей программы. Вы не можете этого избежать. Есть несколько способов справиться с этим в зависимости от того, что вам нужно.

Вместо того, чтобы постоянно регистрировать данные, вы можете попытаться собрать кучу данных, а затем записать их. Такой подход к буферизации данных по-прежнему не будет считывать во время регистрации, но вы сможете получать пакеты хороших данных между ними.

,