Нужна помощь в написании функции, получить только первую строку отрицательных значений
Я читаю акселерометр с помощью arduino. В основном я получаю положительные значения, и мне нужно получить только первую строку отрицательных значений. Например , я получаю значения > -0.5 , затем у меня появляются значения < -0.5 (которые я помещаю в массив, а затем, если я снова получаю значения больше -0.5, я хочу остановить это.
Кроме того, если через 30 секунд он все равно остановится. Это то, что я делал до сих пор, но работает не так, как ожидалось
void reading_mpu_brake(){
unsigned long StartTime = millis();
float acc[500];
int read_time[500];
byte arrayIndex = 0;
while(1){
unsigned long CurrentTime = millis();
if (CurrentTime - StartTime < interval) {
mpu.update();
if (mpu.getAccX() < -0.05){
total_acc = sqrt((pow((mpu.getAccX() - offsetx), 2) + pow((mpu.getAccY() - offsety), 2) + pow((mpu.getAccZ() - offsetz), 2) ));
acc[arrayIndex] = total_acc;
read_time[arrayIndex] = millis();
Serial.print(acc[arrayIndex]);
Serial.print(" | ");
Serial.print(mpu.getAccX());
Serial.print(" | ");
Serial.println(read_time[arrayIndex]);
Serial.println(arrayIndex);
arrayIndex++;
}
}
else if (CurrentTime - StartTime > interval)
{
Serial.println("Over time");
break;
}
}
Сейчас работает и получает значения меньше -0.5, но если после нескольких хороших значений я получу положительные значения, а затем снова отрицательные, то он поместит в массив и последний, которого у меня нет.
Так что в основном мне нужно остановить его после первой группы хороших значений...
Любая помощь приветствуется
Спасибо!
L.E. Кажется, я пропустил хорошее объяснение, так что попробую еще раз.
1 - Я вызываю функцию, и она начинает отслеживать значения в течение 30 секунд.
Случай 1 : Я получаю 0.6 , 0.7 , 0.4 , 0.2 , -0.2 , -0.6 , -0.7 , -0.8 , -0.4 , 0.3 , 0.5 ...и т. д
В этом случае я попадаю в значения массива acc : -0.6 , -0.7 , -0.8 , затем через 30 секунд функция exit
Частично это нормально .
Случай 2 : Я получаю 0.6 , 0.7 , 0.4 , 0.2 , -0.2 , -0.6 , -0.7 , -0.8 , -0.4 , 0.3 , 0.5 , -0.6 , -0.7 , 0.6...и т. д
В этом случае я попадаю в значения массива -0.6 , -0.7 , -0.8, и если 30 секунд не прошли , я также получаю -0.6, -0.7 .
Я хочу , чтобы функция выходила после получения первой группы хороших значений (-0.6, -0.7 , -0.8) .
Надеюсь, теперь все более ясно.
@lucian_v, 👍0
Обсуждение1 ответ
float acc[500];
int read_time[500];
Итак, float на этой платформе равен 4 байтам, так что этот массив занимает 2000 байт. А int-это 2 байта, так что другой массив-это еще 1000 байт.
Uno имеет 2 КБ оперативной памяти, поэтому только эти два объявления занимают больше оперативной памяти, чем устройство.
Я немного удивлен, что это вообще работает, но, конечно, "не работает так, как ожидалось" - это действительно ожидаемый результат здесь.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Я отредактировал и добавил дополнительные объяснения. Под "строкой отрицательных значений" подразумевается первая группа значений, удовлетворяющих критериям < -0.5, @lucian_v
понятно, что вы пытаетесь сделать ... неизвестно, что происходит при запуске кода ... `не работает так, как ожидалось " не означает ничего конкретного, @jsotola