Не работает программа на Arduino nano

Проблема заключается в следующем: без массива в loop программа работает и выводит все значения, при появлении массива и операций с ним перестаёт измеряться высота и ускорение по двум осям из трёх, как можно это исправить?

//подключение библиотек
#include <GyverBME280.h>
#include "MPU6050.h"
#include <Wire.h>
GyverBME280 bme;
MPU6050 mpu;
     float startheight; //начальная высота
     int Measurecount = 0; //счётчик циклов
     float accx = 0; //ускорение по трём осям
      float accy = 0;
      float accz = 0;
      float arr_max = 0; //максимальное значение массива, в который записана высота
void setup() {
  Serial.begin(19200);
  Serial.println("Start");
// запуск BMP 280 и проверка на работоспособность
  while(!bme.begin(0x76)) {
    Serial.println("Error!");
    // запуск и инициализация MPU 6050
    mpu.initialize();
    Serial.println(mpu.testConnection() ? "MPU6050 OK" : "MPU6050 FAIL");
    delay(300);
  }  
}
void loop() {
  float heightarr[3000]; //массив, в который записывается высота
     float height = (760 - ((bme.readPressure()) / 133.32))*12; //переменная, отвечающая за высоту
  //проверка кол-ва циклов
  Measurecount ++;
  if(Measurecount == 2){
     startheight = height;
  }
  // температура
  Serial.print("Temperature: ");
  Serial.println(bme.readTemperature());
  // давление
  Serial.print("Pressure: ");
  Serial.println(bme.readPressure());
  // высота над уровнем старта
  Serial.print("Height:");
  Serial.println(height - startheight);
  //запись ускорения в переменные
      accx = mpu.getAccelerationX();
      accy = mpu.getAccelerationY();
      accz = mpu.getAccelerationZ();
      //их вывод
  Serial.print("Accelaration X:");
  Serial.println(accx / 32768 * 2*9.81);
  Serial.print("Accelaration Y:");
  Serial.println(accy / 32768 * 2*9.81);
  Serial.print("Accelaration Z:");
  Serial.println(accz / 32768 * 2*9.81);
  heightarr[Measurecount] = height-startheight; //запись значения высоты в ячейку массива
  if (heightarr[3000]>0 || heightarr<0) {for(int i = 1; i <= 3000; i++){ // запуск цикл для обхода всех элементов массива
    arr_max = max(arr_max, heightarr[i]);
  }
  }
  //вывод апогея
Serial.print("Apogee of cycle: ");
Serial.println(arr_max);
delay(100);
}

А ничего, что такой массив занимает 12000 байт? Сколько там динамической памяти у 328-й атмеги?

1 лайк

На недостаток динамической памяти программа не ругается

А подумать? Например, сделать массив статическим

static float heightarr[3000];

Тоже ругаться не будет?

Так пишет, что не хватает

Я изменил размер массива, и программа заработала, спасибо за помощь

насколько? - больше чем 250 элементов делать не советую.

А вообще, практически наверняка вам не нужен тип float, подумайте над этим.

1 лайк

интересный кусок.

тут же просто ляп на ляпе

Например, что по вашему определяет это условие?

 if (heightarr[3000]>0 || heightarr<0) 
   
  

А зачем Вы вообще что-то туда записываете? массив же не сохраняется между вызовами loop и при каждом новом вызове там что попало – ранее записанное не сохраняется! Даже если Вам кажется, что оно там – это случайность и может измениться в любой момент.

Особенно, с учётом того, что массив не сохраняется между вызовами loop.

Там просто один сплошной ляп.

Нет смысла бить пальцы на кнопках
Судя по прошлым появлениям, @Aquamarinus предпочитает не отвечать на вопросы и не реагировать на замечания - просто сливается на пару месяцев и все

Нет, просто на прошлый вопрос я нашёл ответ, и смысла на форум заходить не видел

По задумке условие проверяет заполненность последней ячейки массива

В массиве на 3000 элементов нет ячейки heightarr[3000]
последняя ячейка массива в 3000 элементов имеет номер 2999

Кроме этого, вы не пояснили что такое

heightarr<0

Виноват, забыл про то, что массив начинается с 0

А что такое

heightarr<0

Тут тоже ошибка, которую я исправил. Тут я не поставил номер ячейки массива

Чё пристал к ребёнку!

Ну, а как насчёт того, что массив ни хрена не сохраняется между вызовами loop? Тоже исправили?

Насколько я понял, что-то всё же сохраняется, ибо после проверки в переменной с апогеем остаётся фиксированное значение