Технический пост здесь, это о конструкции, которую я разработал во время работы в НАСА.

Мы запустили полезную нагрузку на метеозонде на переменную высоту от 80 до 100 тысяч футов (в зависимости от того, когда воздушный шар решил взорваться). Нам нужно было иметь возможность разделить высоту на 10 равных частей и запустить насос с интервалом в 10.

Конечная цель состояла в том, чтобы получить 10 проб воздуха, взятых на одинаковой высоте.

Вот псевдокод, который я придумал:

// Jake Denison's pseudocode
int alt; //altitude
bool sampleState = false; //could be int but bool is only 8 bytes
int = 1;
int x = 1;
int motorSelect = 1;
int altArray[10];
void setup(){
   pinMode(alt, INPUT);
   Serial.begin(9600);
}
void loop(){
   checkAlt();
   alt = getAlt(); //abstract function to Serial.read altimeter
   if((alt == altArray[y]) && (sampleState == True));
      driveMotor(x); //abstract function to run some motor
      y++; //counter state for array position
      x++; //counter state for motor selection
}
void checkAlt(){
   int altOne = getAlt();
   delay(3000);
   int altTwo = getAlt();
   if(altTwo < altOne){
      int div = altTwo/10;
      for(int i = 1; i < 10; i++){
         altTwo = altTwo - div;
         altArray[i] = altTwo;
      }
      sampleState = True
}

Это не самый чистый код, но он демонстрирует логику.

Начиная сверху, у нас есть определения наших глобальных функций. В рабочей среде многие из них были локализованы для экономии места, но для примера мы оставим их глобальными.

После некоторых основных функций настройки, специфичных для Arduino (определение pinMode и включение последовательного класса), мы готовы перейти к основному циклу.

Мы начинаем с запуска checkAlt, который считывает высоту, ждет и выполняет второе измерение. Если второе измерение больше первого, мы восходим. Однако, если верно обратное, воздушный шар падает.

Если это так, мы делим нашу общую высоту на 10, чтобы получить инкрементный вычитатель. Затем мы перебираем наш массив, устанавливая каждую позицию в другую итерацию вычитателя.

Это, конечно, создаст небольшую проблему, так как первое измерение будет выполнено с меньшим приращением, чем начальная точка, что заставит нас взять две пробы на земле. Для нас это было нормально.

После заполнения массива и установки sampleState в True мы позволяем потоку программы перейти к основному селектору. Это просто проверяет, равна ли текущая высота первой позиции нашего массива. Если это так, он запускает первый двигатель, увеличивает позицию массива и двигатель для использования и повторяет.

Имейте в виду, что это грубый псевдокод. Это никогда не сработает в производстве, поскольку целые числа должны быть точно равными, чтобы программа зарегистрировала высоту, равную позиции массива. Конечно, также отсутствует импорт и другие специфичные для Arduino конструкции.

Я просто хотел задокументировать код, который придумал!