программирование реле с кодом Millis

Информация о поезде

Turnout 1 = relay 1 - makes turnout track go left
          = relay 2 - makes turnout track go right
Turnout 2 = relay 3 - makes turnout track go left
          = relay 4 - makes turnout track go right
 Signal 1 = relay 5 - makes signal go green - train 1 starts driving
          = relay 6 - makes signal go red - train 1 stops for signal
 Signal 2 = relay 7 - makes signal go green - train 2 starts driving
          = relay 8 - makes signal go red - train 2 stops for signal

У меня есть Arduino-Uno и плата с 8 реле. Я хочу запустить программу (цикл) на 1/2 часа/1800 секунд. Время переключения должно составлять 2 секунды (реле ВКЛ)

Может кто-нибудь помочь мне с миллис-кодом, пожалуйста.

Время цикла должно составлять:

relay 1 = (2),1250,(2),546 - total 1800 seconds
relay 2 = 620,(2),630,(2),546 - total 1800 seconds
relay 3 = 10,(2)1260,(2),526 - total 1800 seconds
relay 4 = 630,(2),640,(2),512 - total time 1800 seconds
relay 5 = 20,(2),1270,(2),505 - total time 1800 seconds
relay 6 = 600,(2),750,(2),446 - total time 1800 seconds
relay 7 = 640,(2),640,(2),516 - total time 1800 seconds
relay 8 = 1240,(2),450,(2),106 - total time 1800 seconds

С уважением, Мартинус ван Валсум. [email protected]

, 👍0

Обсуждение

Начните с начала вопроса и прочитайте его вслух. Останавливайтесь, чтобы перевести дух, только после окончания предложения. (когда ставится точка) Вам было трудно произнести все это, не останавливаясь? Вероятно. Ваш вопрос очень трудно читать. Если вам нужна помощь, пожалуйста, помогите кому-нибудь понять, чего вы хотите. Вы заметили, что в моем комментарии использованы знаки препинания? Если бы нам разрешили разрывы строк в комментариях, я бы тоже это использовал. Это все помогает в понимании. Но даже если вы расставили правильные знаки препинания, ваш вопрос все равно не ясен. Избавьтесь от поезда, говорите., @Rudy

@Rudy, без блока кода были потеряны только новые строки, @Juraj

В чем заключалась ваша конкретная проблема при написании кода? Вы читали пример BlinkWithoutDelay, который показывает, как работает этот стиль кодирования? Вы читали некоторые из многочисленных руководств по этому вопросу в Интернете? В настоящее время я не знаю, как я могу вам помочь, не написав весь код самому., @chrisl

Кстати: если вы разместите свой адрес электронной почты непосредственно на общедоступном веб-сайте, вы получите только тонны спама., @chrisl

Вы понимаете, что Стрелка 1 будет переключаться и влево и вправо (одновременно) на отметке 1250? А что Стрелка 2 будет переключаться и влево и вправо на отметке 1260? И так далее., @sa_leinad


1 ответ


1

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

Я сделал две эстафеты. Для остальных скопируйте и вставьте, а затем измените номера и время реле.

/*
  Blink without Delay
  http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/

const int On =  1;
const int Off =  0;

// константы не изменятся. Используется здесь для установки номера PIN-кода:
const int ledPin =  LED_BUILTIN;//номер вывода светодиода
const int relay1 =  5;
const int relay2 =  6;

// Переменные изменятся:
int ledState = LOW;             //ledState используется для установки светодиода

// Как правило, вам следует использовать «unsigned long» для переменных, которые содержат время
// Значение быстро станет слишком большим для хранения в int
unsigned long previousMillis = 0;        // сохранит время последнего обновления светодиода

int    secondCount = 0;

// константы не изменятся:
const long interval = 1000;           // интервал мигания (миллисекунды)

#define onTime  2           //реле по времени

#define relay1_on1 0
#define relay1_on2 (relay1_on1+onTime+1250)

#define relay2_on1 62
#define relay2_on2 (relay2_on1+onTime+630)


void setup() {
  // устанавливаем цифровой вывод как выход:
  digitalWrite(relay1, Off);
  digitalWrite(relay2, Off);
  pinMode(ledPin, OUTPUT);
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
}

void loop() {
  // сюда следует поместить код, который должен выполняться постоянно.

  // проверяем, не пора ли моргнуть светодиодом; то есть, если разница
  // между текущим моментом и последним разом, когда вы мигали, светодиод больше, чем
  // интервал, с которым вы хотите мигать светодиодом.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // сохраняем последний раз, когда вы мигали светодиодом
    previousMillis = currentMillis;

    //------------------------------
    // Реле 1
    if (secondCount == relay1_on1) {
      digitalWrite(relay1, On);
    }
    if (secondCount == (relay1_on1 + 2)) {
      digitalWrite(relay1, Off);
    }

    if (secondCount == relay1_on2) {
      digitalWrite(relay1, On);
    }
    if (secondCount == (relay1_on2 + 2)) {
      digitalWrite(relay1, Off);
    }

    //------------------------------
    // Реле 2
    if (secondCount == relay2_on1) {
      digitalWrite(relay2, On);
    }
    if (secondCount == (relay2_on1 + 2)) {
      digitalWrite(relay2, Off);
    }

    if (secondCount == relay2_on2) {
      digitalWrite(relay2, On);
    }
    if (secondCount == (relay2_on2 + 2)) {
      digitalWrite(relay2, Off);
    }


    //------------------------------
    // если светодиод не горит, включаем его и наоборот:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // устанавливаем светодиод с помощью значенияledState переменной:
    digitalWrite(ledPin, ledState);

    secondCount++;
    if (secondCount == 180) {
      secondCount = 0;
    }
  }

}
,