Нужна помощь в написании функции, получить только первую строку отрицательных значений

Я читаю акселерометр с помощью 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) .

Надеюсь, теперь все более ясно.

, 👍0

Обсуждение

Я отредактировал и добавил дополнительные объяснения. Под "строкой отрицательных значений" подразумевается первая группа значений, удовлетворяющих критериям < -0.5, @lucian_v

понятно, что вы пытаетесь сделать ... неизвестно, что происходит при запуске кода ... `не работает так, как ожидалось " не означает ничего конкретного, @jsotola


1 ответ


5
float acc[500];
int read_time[500];

Итак, float на этой платформе равен 4 байтам, так что этот массив занимает 2000 байт. А int-это 2 байта, так что другой массив-это еще 1000 байт.

Uno имеет 2 КБ оперативной памяти, поэтому только эти два объявления занимают больше оперативной памяти, чем устройство.

Я немного удивлен, что это вообще работает, но, конечно, "не работает так, как ожидалось" - это действительно ожидаемый результат здесь.

,