Объединение двух разных программ в один скетч

Я работаю над проектом, в котором используется релейный модуль, Arduino Atmega328 и 2 двигателя 12 В постоянного тока. Исходя из кода, который я даю, первый код - двигатель 1 будет работать в зависимости от входного переключателя. А второй код - двигатель будет работать в зависимости от времени задержки. Я собираюсь объединить эти два кода в один скетч, надеясь, что эти два кода будут работать вместе. Но я не знаю, как их объединить.

`int motorPin = 10; // контакт, который включает двигатель
int blinkPin = 9; // контакт, который включает светодиод
int watertime = 5; // сколько времени поливать в секундах
int waittime = 60; // сколько времени ждать между поливами, в минутах

void setup()
{
  pinMode(motorPin, OUTPUT); 
  pinMode(blinkPin, OUTPUT); // устанавливаем вывод 13 на выход, чтобы мы могли использовать его для включения светодиода
}

void loop()
{
  digitalWrite(motorPin, HIGH); // включаем мотор
  digitalWrite(blinkPin, HIGH); // включаем светодиод
  delay(watertime*3000);        // умножьте на 1000, чтобы перевести секунды в миллисекунды

  digitalWrite(motorPin, LOW);  // выключить мотор
  digitalWrite(blinkPin, LOW);  // выключить светодиод
  delay(waittime*6000);        // умножьте на 60000, чтобы перевести минуты в миллисекунды
}`

Это кодировка для запуска двигателя с использованием времени задержки

const int buttonPin = 2;     // номер контакта кнопки
const int ledPin =  13;      // номер пина светодиода

// переменные изменятся:
int buttonState = 0;         // переменная для чтения состояния кнопки

void setup() {
  // инициализируем вывод светодиода как выход:
  pinMode(ledPin, OUTPUT);
  // инициализируем вывод кнопки как вход:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // считываем состояние значения кнопки:
  buttonState = digitalRead(buttonPin);

  // проверяем, нажата ли кнопка. Если да, то buttonState имеет значение HIGH:
  if (buttonState == LOW) {
    // включаем светодиод:
    digitalWrite(ledPin, LOW);
  } else {
    // выключить светодиод:
    digitalWrite(ledPin, HIGH);
  }
}

это код, который будет запускать двигатель в зависимости от переключателя

на данный момент я не имею ни малейшего представления, как объединить эти два кода.

Идея моего проекта заключается в том, что когда переключатель LOW (контакт 3), двигатель 1 (контакт 13) будет HIGH, пока переключатель не станет HIGH, двигатель 1 будет LOW и остановится. В то же время, будет задержка времени на 10 секунд, и двигатель 2 (контакт 10) будет активен вскоре после того, как переключатель станет LOW и задержка времени на 10 секунд, и двигатель 2 будет активен со временем в течение 25 секунд и остановится, а следующий активен еще 60 минут

, 👍0

Обсуждение

Вы не будете иметь ни малейшего представления, пока не научитесь понимать, что делают эти два отдельных кода в каждой строке. Как только вы это поймете, их объединение станет тривиальным. Так что нужно пойти и узнать, что означают и делают все эти строки кода., @Delta_G

Если вы хотите, чтобы кто-то здесь смог вам помочь, то, возможно, вам стоит рассказать, что должен делать объединенный код., @Delta_G

@Delta_G, хорошо, я просто отредактировал то, что должен делать код., @Asrul Asyraff

Можете ли вы снова отредактировать его и уточнить, что именно вы хотите, чтобы он делал? Сколько секунд составляет «несколько секунд». Мне написать процедуру, чтобы придумать случайное число для этого? Или вы имели в виду какое-то число? Вы видите, как это может быть неприятно — пытаться помочь кому-то, кто даже не знает, чего он хочет?, @Delta_G

Вам нужно будет изменить скетч задержки, чтобы использовать неблокирующий код. Во время выполнения delay() Arduino просто занят ожиданием, и нет ничего похожего на выполнение действий одновременно на Arduino. Вам нужно использовать код, который выполняется достаточно быстро последовательно, чтобы казалось, что он выполняет действия одновременно. Обратитесь к примеру BlinkWithoutDelay в Arduino IDE. Узнайте, как его использовать, в Интернете есть сотни руководств, включая документацию Arduino., @chrisl

Этот вопрос задавался несколько раз. Пожалуйста, посмотрите старый ответ: https://arduinoprosto.ru/q/17277/altering-code-to-run-a-timer-while-checking-for-a-data-input/24644#24644, @Mikael Patel


1 ответ


Лучший ответ:

1

Самый простой способ объединения двух программ:

  1. Скопируйте содержимое двух программ в один новый файл .ino (программу)
  2. Переименуйте первую функцию настройки setup_one
  3. Переименуйте первую функцию цикла loop_one
  4. Переименуйте другие функции настройки и цикла setup_two и loop_two
  5. Добавьте следующий код в конец этого файла.

Код:

void setup()
{
  setup_one();
  setupr_two();
}
void loop ()
{
  loop_one();
  loop_two();
}

Это очень упрощенный подход, и он не будет работать во всех случаях. Он будет работать в этом случае, но вы обнаружите, что он будет выполнять программу один, а затем программу два. Он будет работать, потому что ваши константы не конфликтуют (в верхней части программы), вы не используете один и тот же пин в разных программах и т. д.

Вам нужно изучить, что делает код, чтобы действительно объединить программы, вы увидите лучшие способы сделать это. Лучший способ изучить — это записать на своем родном языке, что делает каждая строка кода, так что в случае первой программы:

turn on the motor
turn on the LED
wait for 'watertime' seconds
turn off the motor
turn off the LED
wait for 'waittime' minutes

Для программы 2:

  read the state of the pushbutton value:
  If the button is in state low
    Turn off the LED -- Not sure  this might be on
  else  
    Turn on the LED -- Not sure this might be off

Надеюсь, вы узнаете эти описания (это комментарии), и когда вы прочитаете описания, вы поймете, почему код, который вы собрали с помощью вышеуказанного метода, «не работает». Он работает, вам просто нужно подождать 'waittime' минут, прежде чем у вас будет несколько микросекунд, чтобы нажать кнопку.

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

,