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

Я делаю кансат, который будет запускаться на сахарной ракете. Arduino nano Cansat будет управлять датчиками, которые будут считывать данные и сохранять их на SD-карте, а также сервоприводом для раскрытия парашюта.

Проблема в том, что я не могу написать код, в котором я хочу, чтобы все датчики записывали данные на SD-карту в цикле, а мини-сервопривод должен выполнять угол поворота 90 градусов после 2 минут подачи питания на Ардуино.

Я написал код для датчиков, вводящих данные на SD-карту, но часть сервопривода меня смущает из-за отсутствия возможности поместить код сервопривода в пустую настройку, поскольку установка сначала выполнит сканирование сервопривода через 2 минуты, а затем запишет данные, Я также не могу включить его в цикл, поскольку он также записывает данные через 2 минуты, и я пытался поместить это в новую функцию, но это тоже не работает.

Пожалуйста, дайте мне решение этой проблемы. Код, который я сделал, приведен ниже: (только для датчиков, записывающих данные на SD-карту)

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#include <DHT.h>
#include <SD.h>

#define DHTPIN 10
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

const int MQ2 = A0;

File dataFile;

void setup() {
  Serial.begin(9600);
  dht.begin();
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1) {}
  }
  if (!SD.begin(4)) {
    Serial.println("SD card initialization failed!");
    while (1) {}
  }
  dataFile = SD.open("data.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.println("Temperature, Humidity, Pressure, Gas");
    dataFile.close();
  } else {
    Serial.println("Error opening data file!");
  }
}

void loop() {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  sensors_event_t event;
  bmp.getEvent(&event);
  float pressure = event.pressure;
  float gas = analogRead(MQ2);
  dataFile = SD.open("data.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.print(temperature);
    dataFile.print(",");
    dataFile.print(humidity);
    dataFile.print(",");
    dataFile.print(pressure);
    dataFile.print(",");
    dataFile.println(gas);
    dataFile.close();
  } else {
    Serial.println("Error opening data file!");
  }
  delay(1000);
}

, 👍1

Обсуждение

Для парашюта я бы не стал программировать развертку, я бы просто записал сервопривод на 90, чтобы он двигался как можно быстрее. Выпуск парашюта обычно не является постепенным процессом. Что касается того, как это сделать, просто проверьте millis() в своей программе, чтобы узнать, сколько времени прошло с момента запуска, и через 120 секунд напишите сервопривод на 90 градусов., @Delta_G

изучите пример блинкбезделея в Arduino IDE, @jsotola


1 ответ


1

Я предполагал, что вы захотите собрать данные после того, как раскроете парашют. И, как подсказал Delta_G, парашют хотелось бы раскрыть как можно быстрее, а не постепенно.

Я также предположил, что вы хотите собирать данные каждую секунду на основе предоставленного вами кода, поскольку он имеет задержку в 1000 миллисекунд. При всем этом вот код, который может работать: (Я не проверял его, но он должен дать представление о том, как действовать)

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#include <DHT.h>
#include <SD.h>

#define DHTPIN 10
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

const int MQ2 = A0;
const long parachute_timeout_ms = 2 * 60 * 1000;   // Открыть парашют через две минуты.
bool parachute_opened = false;

const long data_collection_interval_ms = 1 * 1000; // Собираем данные каждую секунду.
bool start_collecting_data = false;
unsigned long previous_ms = 0;

File dataFile;

void setup() 
{
  Serial.begin(9600);
  dht.begin();
  if (!bmp.begin()) 
  {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1) {}
  }
  if (!SD.begin(4)) 
  {
    Serial.println("SD card initialization failed!");
    while (1) {}
  }
  dataFile = SD.open("data.txt", FILE_WRITE);
  if (dataFile) 
  {
    dataFile.println("Temperature, Humidity, Pressure, Gas");
    dataFile.close();
  } 
  else 
  {
    Serial.println("Error opening data file!");
  }

  previous_ms = millis();
}

void loop() 
{

  // Проверяем, не пора ли раскрыть парашют.
  unsigned long current_ms = millis();

  if ((parachute_opened == false) && (current_ms - previous_ms >= parachute_timeout_ms)) 
  {
    // Ваш код для открытия парашюта
    // ... ... ..

    // Убедитесь, что этот код не выполнится снова.
    parachute_opened = true;

    //...а затем устанавливаем флаг, сообщающий другой части кода
    // что он должен начать сбор данных.
    start_collecting_data = true;
  }

  if ((start_collecting_data) && (current_ms - previous_ms >= parachute_timeout_ms))
  {
    collect_data();
    previous_ms = current_ms;
  }
}

void collect_data()
{
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  sensors_event_t event;
  bmp.getEvent(&event);
  float pressure = event.pressure;
  float gas = analogRead(MQ2);
  dataFile = SD.open("data.txt", FILE_WRITE);
  if (dataFile) 
  {
    dataFile.print(temperature);
    dataFile.print(",");
    dataFile.print(humidity);
    dataFile.print(",");
    dataFile.print(pressure);
    dataFile.print(",");
    dataFile.println(gas);
    dataFile.close();
  } 
  else 
  {
    Serial.println("Error opening data file!");
  }
}
,