Заставить сервопривод работать только один раз через определенный период времени, не мешая датчикам, считывающим данные в цикле.
Я делаю кансат, который будет запускаться на сахарной ракете. 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);
}
@noblenikhil, 👍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!");
}
}
- 9 сервоприводов на Arduino Nano?
- Мигающий светодиод при движении сервопривода
- Параллельное сервоуправление?
- Контроллер радиоуправляемой машины с использованием библиотеки RC-switch
- Не могу двигать сервопривод с моим Nano
- Сервопривод продолжает сбрасывать положение, когда нет разницы в полученном значении?
- Arduino Servo MG90S не двигается
- DS3218MG Сервопривод - не работает с блоком питания
Для парашюта я бы не стал программировать развертку, я бы просто записал сервопривод на 90, чтобы он двигался как можно быстрее. Выпуск парашюта обычно не является постепенным процессом. Что касается того, как это сделать, просто проверьте millis() в своей программе, чтобы узнать, сколько времени прошло с момента запуска, и через 120 секунд напишите сервопривод на 90 градусов., @Delta_G
изучите пример блинкбезделея в Arduino IDE, @jsotola