Высотомер
- Войдите на сайт для отправки комментариев
Вс, 02/11/2014 - 00:20
Конфигурация - nano + bmp085 + lipo
Предназначение - запись последовательности 500 значений высоты в EEPROM после преодоления минимального порога высоты. В Serial выводится лог при подключении к ПК.
//nano + bmp085 + lipo //запись последовательности 500 значений высоты в EEPROM //после преодоления минимального порога высоты //в Serial выводится лог #include <EEPROM.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_BMP085.h> const int altitudeArrSize = 500; int altitudeArr[altitudeArrSize]; //массив 500 измерений высоты, приведенной к int (2-а байта), измерения делаются каждые 1/10 секунды int altitudeArrC = 0; //счетчик измерений unsigned long altitudeArrTimer; Adafruit_BMP085 bmp; int altitude; int altitudeNorm; const byte altitudeJmp = 2; int maxAltitude; int maxAltitudeEEPROM; byte altitudeMode; void EEPROMWriteInt(int p_address, int p_value) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); int val = ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); if (val != p_value) { byte lowByte = ((p_value >> 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } } //This function will read a 2 byte integer from the eeprom at the specified address and address + 1 int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); } void setup(void) //************************************************************************************************************** { //for(int i = 0; i < 1024; i++) EEPROMWriteInt(i,0); // иногда нужно обнулить память для отладки Serial.begin(9600); bmp.begin(); // чтение максимальной высоты из EEPROM maxAltitudeEEPROM = EEPROMReadInt(0); // запоминаем начальное значение высоты altitudeNorm = bmp.readAltitude(); //выводим 500 значений лога высоты предыдущего полета Serial.print("max altitude of previos fly is "); Serial.print(maxAltitudeEEPROM); Serial.println(" meter"); Serial.println(); Serial.println("altitude of previos fly is "); float j = 0; for(int i = 2; i < 1020; i+=2) { Serial.print("time "); Serial.print(j); j+=1/20.00; Serial.print(" - "); Serial.print(EEPROMReadInt(i)); Serial.println(); } //переводимся в режим ожидания взлета altitudeMode = 1; } void loop(void) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ { altitude = bmp.readAltitude() - altitudeNorm; if (altitude > maxAltitude) { maxAltitude = altitude; } if (maxAltitude > maxAltitudeEEPROM){ maxAltitudeEEPROM = maxAltitude; EEPROMWriteInt(0, int(maxAltitudeEEPROM)); } switch (altitudeMode) { case 0: // do nothing break; case 1://ждем взлет if (altitude > altitudeJmp){ //значит начали лететь, переводимся из режима ожидания в режим записи высоты altitudeMode = 2; } break; case 2: if (altitudeArrTimer < millis()){ altitudeArrTimer = millis() + 50; //запись в массив //сохраняем высоту каждые 50 миллисекунд altitudeArr[altitudeArrC] = int(altitude); altitudeArrC++; if (altitudeArrC == altitudeArrSize){ //запись массива в EEPROM for(int i = 0; i < altitudeArrSize; i++) EEPROMWriteInt(2+i+i,altitudeArr[i]); altitudeMode = 0; } } break; } }
Версия 2
UPS, а что произойдет если одновременно с набором высоты меняется и атмосферное давление?
Проект заточен для использования в системах спасения моделей ракет, а там как раз с одновременным набором высоты меняется давление, алгоритм определяет момент старта и прохождения аппогея. Что конкретно интересует?
У Вас процесс быстрый, так что все в порядке.
Заинтересовало, если буду пешком подниматься и одновременно меняются метеоусловия, ведь обманет.))))
Если подниматься ооочень долго, то скорее всего, влияние метеоусловий на показания может иметь место, но насколько это может быть существенно?
на высоте 500 метров над уровнем моря давление меняется в пределах 10 мм ртутного столба ( в районе 714)
примерно 1мм на 10,5м. При изменении с 760 до 750, ошибка составит 100 метров.
Для ТС не актуально, для альпинистов вопрос.
В итоге сколько по времени это устройство может записывать высоту?
в текущей конфигурации 24 секунды, 480 значений и десять параметров работы
Вы, наверное, изучали эту тему. Возможно ли увеличить объем EEPROM памяти в ардуино? И почему бы не использовать модуль для sd карты?
чем меньше составляющих, тем надежнее работает устройство, и так сталось, для логов полетов моих моделей ракет много памяти не нужно, вот смотрите
http://forum.modelka.com.ua/threads/65988-Запуски-ракет-и-испытания-двигателей/page21?p=749606&viewfull=1#post749606
Я вот тоже ракеты клепаю, но времени явно мало для записи всего полета до приземления. Хотя, если замерять дважды в секунду, то можно добится времени до 250 с, что для моего уровня пока что хватит =) Еще одна проблема- невозможно записать сразу второй полет, пока не скинешь данные с высотомера.
можно часто писать данные до апогея, затем реже.
лог полета можно передавать по радиоканалу, хотя сливать данные в пк еще проще, непроблема подключить шнур, вбить в сериал что-либо и дождаться лога в мониторе.
да, а есть ссылки на модели?
Ага, думаю реализовать возможность подключения bluetooth- модуля для передачи лога прямо на телефон.
В моделях ничего необычного нет, все технологии с сайта rocki и serge77. Пока набираюсь опыта =) Я посмотрел на ваши ракеты. Зачем нужен такой огромный калибр (75), можно ведь намного улучшить летные характеристики, уменьшив диаметр?
все начиналось с малого, но большой калибр лучше видно, т.е. зрелищность, а попробуйте?
и посмотрите на проект Мрия
Да, зрелищность на высоте) Что за топливо? Факел хоршоший.
Я сделал высотомер с вашей прошивкой. Спасибо, все отлично работает =)
если что, там на форуме есть инфа, карамель с титаном
оптимизация кода и алгоритма определения апогея, доработано под BMP280