количество акселерметоров снижается после 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;
}
Можете ли вы помочь мне найти проблему? Спасибо!
@Hi tE, 👍-1
1 ответ
Регистрация данных действительно замедляет работу вашей программы. Вы не можете этого избежать. Есть несколько способов справиться с этим в зависимости от того, что вам нужно.
Вместо того, чтобы постоянно регистрировать данные, вы можете попытаться собрать кучу данных, а затем записать их. Такой подход к буферизации данных по-прежнему не будет считывать во время регистрации, но вы сможете получать пакеты хороших данных между ними.
- Esp8266 Vin контакт
- Отправка данных из ESP8266 в PHP
- ОТА-программа SPIFFS на ESP8266
- Порт Arduino OTA не обновляется в Arduino IDE
- Суммировать значения, сохранить их и распечатать последнее значение
- Скетч мигания ESP8266 не мигает светодиодом
- Как вы справляетесь с дрейфом датчиков?
- Как программно получить ответ на выданную AT-команду для ES266 на Arduino?