ARDUINO Альтиметр и пороговое значение...

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
900 меньше 1000 - не выполняется 1-ое условие
if (Alt_Moment > Alt_Start) {
Да, я писал что упустил регулярное обновление этой переменной...
Исправил ошибку с обновлением "Alt_Moment", заодно выбросил и переменные "Press" и "Temp", запись данных идет на прямую, без переменных. Задал периодичность исполнения в 0,01 секунды...
Теперь имеем следующий вид:
C++:
#include <iarduino_Pressure_BMP.h>
iarduino_Pressure_BMP sensor(0x77);
float bmppressure;
float bmptemperature;
float bmpaltitude;
float bmppressure2;
#include <SPI.h>
#include <SD.h>
#include <iarduino_RTC.h>
float  Alt_Start;
float  Alt_Moment;
iarduino_RTC time(RTC_DS1302, 8,6,7);
void sd_print(String file, String texttoprint, boolean lf)
  {
   File sd_file;
    sd_file = SD.open(file, FILE_WRITE);
  if(sd_file){
    if(lf)sd_file.println(texttoprint);
    else sd_file.print(texttoprint);
    sd_file.close();
  }
}
void setup()
{
   Alt_Start = 0;
   Alt_Moment = 0;
  sensor.begin();
  SD.begin(10);
     time.begin();
}
void loop()
{
  //Считывание данных с датчика
       if(sensor.read(1)){
        bmppressure = sensor.pressure;
        bmptemperature = sensor.temperature;
        bmpaltitude = sensor.altitude;
      }
       if(sensor.read(2)){
        bmppressure2 = sensor.pressure;
       }
  //Присвоение текущей высоты переменной
     Alt_Moment = bmpaltitude;
  //Если текущая высота больше базовой (идёт подъём)
    if (Alt_Moment > Alt_Start) {
  //Если текущая высота меньше базовой (идёт спуск)
      if (Alt_Moment < Alt_Start) {
  //Если текущая высота меньше (или равна) пороговой   
        if (Alt_Moment <= 50) {
          //Даём сигнал на выброс парашюта
          pinMode(21, OUTPUT);
           digitalWrite(21,HIGH);
           Alt_Start = Alt_Moment;
            Alt_Moment = bmpaltitude;         
        }
         Alt_Start = Alt_Moment;
          Alt_Moment = bmpaltitude;
      }
     //Даём сигнал на выброс тормозной ленты
      pinMode(20, OUTPUT);
       digitalWrite(20,HIGH);
       Alt_Start = Alt_Moment;
        Alt_Moment = bmpaltitude;
    }
     Alt_Start = Alt_Moment;
        Alt_Moment = bmpaltitude;
  //Пишем статистику в файл
    sd_print("fly_logs.txt",(String(time.gettime("H:i:s")) + String(bmpaltitude) + String(bmptemperature) + String(bmppressure2)),true);
  //Задаем период в 0,01 секунды
    delay(10);
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,276
1,303
Москва
3-ий раз. ВОт эти 2 условия взаимоисключающиее

if (Alt_Moment > Alt_Start) {
//Если текущая высота меньше базовой (идёт спуск)
if (Alt_Moment < Alt_Start) {
Если выполниться 1-ое условие, то второе никогда не выполниться, т.к. оно будет проверяться только после успешной проверки 1-го условия.
А все изменения идут уже ниже и буду проверяться заново
 

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
Если выполниться 1-ое условие, то второе никогда не выполниться, т.к. оно будет проверяться только после успешной проверки 1-го условия.
А все изменения идут уже ниже и буду проверяться заново
То есть, то, что я добавил в конце каждого цикла обновление Alt_Moment = bmpaltitude, работать не будет?
C++:
 //Если текущая высота больше базовой (идёт подъём)
    if (Alt_Moment > Alt_Start) {
  //Если текущая высота меньше базовой (идёт спуск)
      if (Alt_Moment < Alt_Start) {
  //Если текущая высота меньше (или равна) пороговой   
        if (Alt_Moment <= 50) {
          //Даём сигнал на выброс парашюта
          pinMode(21, OUTPUT);
           digitalWrite(21,HIGH);
           Alt_Start = Alt_Moment;
            Alt_Moment = bmpaltitude;         
        }
         Alt_Start = Alt_Moment;
          Alt_Moment = bmpaltitude;
      }
     //Даём сигнал на выброс тормозной ленты
      pinMode(20, OUTPUT);
       digitalWrite(20,HIGH);
       Alt_Start = Alt_Moment;
        Alt_Moment = bmpaltitude;
    }
     Alt_Start = Alt_Moment;
        Alt_Moment = bmpaltitude;
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,276
1,303
Москва
обновление будет. условия не будут выполнены. Что выведет по вашему этот псевдо код?
если 3 больше 2 то
{ если 3 меньше 2 то вывести "привет" }
 

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
То ли я окончательно запутался, то ли нужно просто сначала переопределить переменные, а уж потом задавать следующие условия....
Если это не так, то просто скажите - «Нет, не правильно!» и пойду разбираться дальше.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Проще код написать, чем толкать упрямого человека..
900 меньше 1000, не входим во вложение, а выполняем тело условия стр 38, в котором первым действием сравнение стр 40, то есть в это сравнение попадут те же параметры, соответственно условие не выполнится... Вам бы неплохо для начала что нить самое простое поделать, а потом переходить к другим проектам, а спорить здесь о коде я вам искренне не советую... Вот Вам подсказали о флагах и состояниях, Вы ведь даже ни разу не применили эти алгоритмы, смысл тогда подсказывать?
 

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
Это ваша поляна, но, наверняка, в чём-то другом я разбираюсь лучше вашего... Давайте держать себя в руках... Я вам советую.
Я не спорю, а учусь набивая шишки и синяки - самым действенным и запоминающимся способом.
В последнем своём сообщении я ПРЯМО сказал, что сначала переопределить переменные, а потом задавать следующие условия:
C++:
if (Alt_Moment > Alt_Start) {
       Alt_Start = Alt_Moment;
       Alt_Moment = bmpaltitude;}
    else {
      if (Alt_Moment < Alt_Start) {
         Alt_Start = Alt_Moment;
         Alt_Moment = bmpaltitude;
            pinMode(20, OUTPUT);
             digitalWrite(20,HIGH);
                if (Alt_Moment <= 50) {
                       Alt_Start = Alt_Moment;
                       Alt_Moment = bmpaltitude;
                      pinMode(21, OUTPUT);
                       digitalWrite(21,HIGH);
                }
      }
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,276
1,303
Москва
Так лучше, но останется неопределенное условие, что делать если они равны.
В данном случае это не существенно и я бы сделал так:
C++:
if (Alt_Moment >Alt_Start) {
       Alt_Start = Alt_Moment;
       Alt_Moment = bmpaltitude;}
    else {     
         Alt_Start = Alt_Moment;
         Alt_Moment = b
...
В таком виде на одно условие проверки меньше. Потому что все , что не попадает под 1-ое условие будет выполнено после else
 
  • Лойс +1
Реакции: Mefistophel

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
Так лучше, но останется неопределенное условие, что делать если они равны.
Это неопределенное, можно купировать заменой знака "Больше" на знак "Больше или равно"... Да заодно заменить знак Меньше", на "Меньше или равно" во втором условии...
 

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
В одном меньше можно, в двух нельзя. Должно быть четко понятие того, что делать, а не и тем и этим.
Я вижу что третье условие, в чём-то, выбивается из ряда, но, пока, не вижу в чём, но надеюсь это выяснить и решить самостоятельно... Возможно и не без точка в нужную сторону))

Спасибо за подзатыльники и терпение, @Старик Похабыч))

Пойду насиловать мозг дальше...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,276
1,303
Москва
Оно не сильно выбивается, Вторая часть условия это проверка на снижение. И внутри проверки на снижение идет проверка на минимально допустимую высоту.
А вот что реально выбивается, так повторение вот этого куска
Alt_Start = Alt_Moment;
Alt_Moment = bmpaltitude;

Его надо вывести в безусловное пространство.

И есть еще тонкость. 50 это что ? высота над чем ? А в каких единицах дает высоту алтиметр ? относительно чего ? А что будет, если будет дребезг показаний ?
Ну к примеру показания буду меняться на + - 0.1 см и ракета стоит на земле, т.е. критическая высота ниже 50 м. ?

Это домашнее задание такое :)
 

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
Посидел над схемой на бумаге, выявил косячки:
Самый главный в том, что в первом условии, нельзя применять "Больше или равно"... ведь изначально 0=0, то есть условие выполняется сразу, на первом же цикле. Если задать переменной Alt_Start отрицательное значение, то так же, на первом же цикле, один фиг, получим 0=0... Условие на равенство нужно вывести в "подусловие".

Оно не сильно выбивается, Вторая часть условия это проверка на снижение. И внутри проверки на снижение идет проверка на минимально допустимую высоту.
А вот что реально выбивается, так повторение вот этого куска
Alt_Start = Alt_Moment;
Alt_Moment = bmpaltitude;
Постараюсь разобраться и исправить.
Его надо вывести в безусловное пространство.
Если честно - ничего не понял, но выясню что это и как используется
И есть еще тонкость. 50 это что ? высота над чем ? А в каких единицах дает высоту алтиметр ? относительно чего ? А что будет, если будет дребезг показаний ?
Ну к примеру показания буду меняться на + - 0.1 см и ракета стоит на земле, т.е. критическая высота ниже 50 м. ?
50 это метры,
в метрах,
относительно точки активации,
а вот это уже интересно...
Это домашнее задание такое :)
Проще застрелиться... Но, надеюсь осилить это... Я мог бы активировать системы спасения с земли, просто передав сигнал с пульта управления на приёмник на борту, но хочется выполнить более серьёзный и автоматический узел управления...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,276
1,303
Москва
Ну как бы с учетом выше сказанного..
1) Подключить высотомер и посмотреть на сколько стабильны его показания.
2) При включении надо запоминать показания и принимать их как точку отсчета
3) При старте ракеты небольшими колебаниями можно будет пренебречь, т.к. изменение высоты будет много больше колебаний.
4) Падением считать стабильное постоянное уменьшение высоты.
5) Получать значение высоты надо не как попало, а с каким то четким интервалом. 10 раз в секунду, может 20, может 50. С каким - надо рассчитать. Если измерять с интервалом в 0.1 сек, то после достижения апогея ракета упадет на 5 см, потом на 20 и так далее. Т.е. предыдущее изменение расстояния будет меньше текущего.
6) В момент предполагаемого начала падения надо следить за изменением высоты. Оно должно все время возрастать, а высота снижаться. Это 100% падение.
7) Если было падение и высота ниже критической, то парашют.

Это в идеале.
На практике же я думаю достаточно будет
1) Считывать высоту.
2) Определять максимальную высоту, как максимум из текущей и предыдущей максимальной высоты
3) Если текущая высота меньше максимально и меньше критической дергать кольцо.
4) высоты считывать с такой точностью , что бы ошибки не дернули кольцо на старте, или что бы разница между максимальной высотой и текущей была бы больше 2-3 модулей ошибок
 

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
Изучил множество видео, выкурил кучу документации и, вроде как, готов к "Домашнему заданию":

1. Полный отказ от ArduinoBlock, ибо он живёт по своим законам и со своими библиотеками, зачастую не совместимыми с уже отработанными и проверенными.
2. Дребезг показаний высотомера, можно купировать округлением до нижнего целого командой "floor(Alt)", благо мне и не нужна точность до сантиметра. И тут же вопрос, если мне не нужны дроби, может сразу задать переменную "Alt" как "unsigned int", 2 байта против 4-х?
3. Получение высоты идёт по команде "bmp.readAltitude(Сorrect)", в скобках указывается коэффициент поправки, в виде нормального давления для текущей местности. То есть, я даже могу, при желании, ввести модуль коррекции и задавать поправку кнопками меняя переменную "Сorrect", и, получать реальную высоту в любое время и погоду....
3. Учитывая скорость перемещения, предпочтительнее, конечно, более частый опрос датчиков и запись данных, но тут встаёт другой вопрос сможет ли "переварить" такой поток данных модуль записи и карта? Нужно выкурить и их документацию, как быстро они могут работать, но найти, пока, не смог... Можно просто "поставить эксперимент" и задавать запись показаний повышая частоту опроса.
4. Узнал что команда "delay()" некошерна, так как , фактически, просто завешивает контроллер и датчики идут просто балластом, желательно пользоваться "millis()" или "micros()", придётся и тут изучить вопрос...
5. Собрал стенд, буду набивать новые шишки...
стенд.jpg
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,276
1,303
Москва
1. верно
2. можно, экономии не много, но обработка дальнейшая будет быстрее. Высота будет ограничена 0-65,5 км. Выше крыши.
3.1 Нужно понять нужна ли эта корректировка для получения абсолютной высоты ?
3.2. А нужно ли каждый момент писать в лог ? к примеру идет набор высоты , 1,2,3,4,5 метров. Надо такое ? Может стоит писать не все ? 1,3,5.. Может можно записывать каждое 3-е или 5-ое изменение. Стоит записывать время старта, время и высоту максимума, время и высоту срабатывания парашюта.
4. Еще чем хороши модули для ардуино: некоторые из них имеют свой контроллер и работают даже когда ардуино "держит" delay. В данном случае задержка плоха тем, что можно пропустить максимум высоты или выкинуть парашют на пол секунды ниже порога.
 
  • Лойс +1
Реакции: Mefistophel

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
1-2 спасибо
3.1 Нужна, я живу 326 метров над уровнем моря, но запускать думаю в разных местах и разбег высот приличный. Правда можно банально перепрошивать перед запуском с корректировкой для конкретного места запуска, но готовый модуль - минус головняк, ибо будет сделан один раз и навсегда.
3.2 Хотелось бы, для построения полётных графиков. Планируется использование различных двигателей и это будет хорошим подспорьем для выбора оптимального.
4 Значит будем изучать вопрос...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,276
1,303
Москва
3.1 Так есть земля - это условный ноль. Пришли, поставили, запустили - записался 0 по 1-ому измерению, Все остальное относительно земли.
3.2 Хочется- пробуйте. Предел есть, какой - не знаю, не скажу.

4. Еще... записывать можно не только на карточку, но и во внешнюю память например. А уже после открытия парашюта, когда измерения не надо делать так часто скинуть все на карту, для удобства чтения.
 
  • Лойс +1
Реакции: Mefistophel

ununnamed

★✩✩✩✩✩✩
18 Авг 2020
75
20
@Mefistophel,
если ещё не поздно. Чисто на всякий случай. Поставь delay после первого пересечения заданной высоты. А то вдруг на миллисекунду после этого из-за шумов альтиметр даст меньшую высоту, и сработает ошибочно парашют.

По закону подлости так и будет
 
  • Лойс +1
Реакции: Mefistophel

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
3.1 Так есть земля - это условный ноль. Пришли, поставили, запустили - записался 0 по 1-ому измерению, Все остальное относительно земли.
Данные по высоте, считываются командой
bmp.readAltitude(коррекция)
и выводятся в метрах, а вот коррекция указывается в сотнях Паскаль...
Следует пару слов сказать о функции bmp.readAltitude(1013.25) и откуда берётся число 1013.25. Это значение давления над уровнем моря конкретной локации, где находится в данный момент датчик. Параметр задаётся в сотнях Ра. Он уникален для каждой местности и по своей сути является отправной точкой или калибровочной константой для корректного измерения высоты. Такой подход обусловлен специфическим алгоритмом вычисления, который построен на принципе фиксации уменьшения атмосферного давления с ростом высоты и наоборот.
Для меня это, надеюсь - пока, слишком..
 

bort707

★★★★★★✩
21 Сен 2020
3,070
915
Для меня это, надеюсь - пока, слишком..
без понимания этого абзаца вы не сможете правильно измерить высоту. Суть в том, что перед стартом вы должны измерить локальное атмосферное давление на уровне земли в точке старта, перевести его в Паскали и подставить в эту формулу
 

Mefistophel

✩✩✩✩✩✩✩
16 Авг 2018
25
0
Актюбинск
@bort707, Глубокое замечание, но:
1. Кто мне мешает вычесть базовую высоту из полученного результата, уже вне устройства;
2. На кой чёрт я распинаюсь за модуль коррекции, либо указания базового давления до прошивки, если никто (за редким исключением), не вникает в идею?
3. Зачем мне это замерять если есть готовые таблицы высот/базовых давлений?
4. Кто вам сказал, что мне это не понятно?

Вы вообще тему читали? Или строите предположения лишь по последнему сообщению? А ведь всего семью сообщениями выше:
Получение высоты идёт по команде "bmp.readAltitude(Сorrect)", в скобках указывается коэффициент поправки, в виде нормального давления для текущей местности. То есть, я даже могу, при желании, ввести модуль коррекции и задавать поправку кнопками меняя переменную "Сorrect", и, получать реальную высоту в любое время и погоду....
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,276
1,303
Москва
1.Никто не мешает вычесть. Но на работоспособность абсолютная и относительная высота ни как не влияет
2. Я тут мучился с выставлением горизонтов у гироскопа-акселерометра.. а вышло что сами его оси очень далеки от перпендикулярности... зря потратил время. Ну не совсем конечно, провел интересно и познавательно, но безрезультатно.
 
  • Лойс +1
Реакции: Mefistophel

bort707

★★★★★★✩
21 Сен 2020
3,070
915
Вы вообще тему читали? Или строите предположения лишь по последнему сообщению?
прошу прощения, чего так волноваться. Конечно я всю тему не читал - да я думаю кроме вас ее целиком читали пара человек. Остальные, как я - видят вопрос в последнем сообщении - отвечают.
К ответу претензии есть? :) Я вроде все верно написал. А то что вы это знаете - так извиняйте.
 

bort707

★★★★★★✩
21 Сен 2020
3,070
915
1. Кто мне мешает вычесть базовую высоту из полученного результата, уже вне устройства;
2. На кой чёрт я распинаюсь за модуль коррекции, либо указания базового давления до прошивки, если никто (за редким исключением), не вникает в идею?
3. Зачем мне это замерять если есть готовые таблицы высот/базовых давлений?
4. Кто вам сказал, что мне это не понятно?
почитал тему... как советовали... и что-то мне кажется, что идею коррекции давления вы понимаете неверно

Ни один из предложенных вами методов не подходит. Вы не можете вычесть базовую высоту вне устройства(п1) или указать базовое давление до прошивки(п2) и уж тем более воспользоваться какими-то там таблицами. Да и идея с модулем коррекции у вас явно базируется на том же самом непонимании базовых принципов.
Вы не сердитесь, а лучше попытайтесь вникнуть. . Значение в паскалях, вписываемое в формулу - не какое-то табличное (базовое как вы пишете). Это реальное текущее давление на данный момент в точке старта, понимаете? Текущее! Сейчас оно одно, а через час - уже другое. Никакие таблицы тут не помогут.

Самое простое решение для блока коррекции - это встроить в устройство одну единственную кнопку "обнуления высоты". И не надо ничего "вводить" кнопками - альтиметр все сделает сам. Пришли на место, приготовились к старту, нажали на кнопку - модуль прочитал текущее давление, перевел в паскали, запомнил, и в дальнейшем считает высоту, подставляя эту цифру вместо коррекции. И не надо будет каждый раз менять прошивку.
 
Изменено:
  • Лойс +1
Реакции: ununnamed