Реле времени 12

Мне нужен простой код для включения 12 выходов один за другим с интервалом в 2 секунды. Кнопка инициирует это, и выходы будут оставаться включенными в течение 3 минут, после чего все выходы отключатся в ожидании нажатия кнопки

На данный момент:

Void setup 
pinMode (10,output);
PinMode (11,output);
PinMode (12,output);

Void loop
delay(100);
digitalWrite (10,HIGH);
delay (2000);
digitalWrite(11,HIGH);
delay(2000)
digitalWrite(12,HIGH);

delay(180000);
digitalWrite (11,LOW);
digitalWrite (12,LOW);
digitalWrite (10,LOW);
exit(0);

Нажмите кнопку удаленного сброса для перезагрузки.

На данный момент попробовал только 3 выхода и еще не пробовал код «Перекресток», но буду.

, 👍-2

Обсуждение

вы не можете сделать это без оборудования ... и все оборудование не то же самое ... так что я думаю, что вы забыли включить всю информацию, @jsotola

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

включение реле ничем не отличается от включения светодиода, поэтому начните писать код. Функции, которые вам понадобятся в основном, это delay(), pinMode() и digitalWrite(). после завершения прототипа с использованием светодиодов замените светодиоды транзисторами NPN, такими как 2N2222, чтобы включить реле. не подключайте реле напрямую к ардуино..., @ElectronSurf

что ты уже испробовал?, @chrisl

@newbie, **НЕТ**, а не задержка(). Это тупик. Вам и ОП необходимо выполнить поиск по запросу «немедленно объяснить» и прочитать полученную статью., @Duncan C

@DuncanC да, delay() - это функция "блокировки кода", но ее проще использовать, чем millis(), поэтому я предложил функцию delay()..., @ElectronSurf

delay() проще использовать для очень простого примера кода. В ту минуту, когда вы выходите за пределы самой простой цели, она становится блокировщиком, который мешает вам выполнить вашу задачу, и вам нужно вырвать код, основанный на задержке, изучить пример «BlinkWithoutDelay» и узнать, как использовать millis() для совместной многозадачности. За исключением ОЧЕНЬ ограниченных случаев, delay() - это тупик, который учит плохим привычкам., @Duncan C

Как только мои кабели DuPont будут доставлены, я смогу подключить релейный модуль к Arduino. Я должен был упомянуть о реле раньше. Я, очевидно, новичок в этом, так как вы, ребята, были вокруг квартала несколько раз. Я почти уверен, что, рассмотрев ваши предложения, я смогу придумать план. Спасибо, @Casinonomore


2 ответа


0

Простой код:

byte buttonPin = 2;
byte relayPins [] = {3,4,5,6,7,8,9,10,11,12,13,14,};
byte x;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  for (x=0; x<12; x=x+1) {
    pinMode(relayPins[x], OUTPUT);
  }
}

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    for (x=0; x<12; x=x+1) {
      digitalWrite(relayPins[x], HIGH); // запускаем базу NPN или N-MOSFET для отвода тока
      delay(2000);
    }
    delay(180000); // немая 3-минутная задержка
    for (x=0; x<12; x=x+1) {
      digitalWrite(relayPins[x], LOW);
    }
  }
}

И, конечно же, вспомогательное оборудование для управления катушками реле.

,

Arduino не будет воспринимать нажатия кнопок, потому что большую часть времени он будет занят задержкой, когда вы нажимаете кнопку., @Edgar Bonet

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

Извините, мой комментарий был неправильным: я был введен в заблуждение вашим плохим отступом (и отсутствующими фигурными скобками) и не заметил, что delay() был внутри if. Я исправил форматирование вашего кода, чтобы сделать намерение более ясным., @Edgar Bonet

Этот код будет пропускать нажатия кнопок большую часть времени при выполнении последовательности реле, потому что он будет проводить большую часть своего времени в одном из двух операторов задержки. Кнопка сброса не будет работать очень хорошо и не остановит 3-минутный период, пока все реле активны (если только вы не нажмете кнопку аппаратного сброса и не перезагрузите Arduino)., @Duncan C

Есть ли требование делать что-либо еще в течение (2 секунды * 12) + 3 минуты? Нет. Так что пусть уже идет нытье о задержке., @CrossRoads

Я не ною. Я указываю на серьезное ограничение подхода, который вы предлагаете. Меня несколько раз укусили, когда я писал код Arduino, где я думал: «Это не имеет значения, мне не нужно обрабатывать более одной вещи за раз — delay() в порядке!» а затем расширил мой проект до такой степени, что использование delay() полностью блокирует то, что мне нужно делать дальше, а затем мне пришлось вернуться и переписать значительные куски кода с совершенно другой логикой., @Duncan C

Использовать такой подход — плохая привычка, потому что он работает только в самых тривиальных случаях, и если вы начнете с delay() и перейдете от тривиального к выполнению чего-либо любой сложности, вам придется выбросить свою задержку- на основе кода и перепишите его. Логический поток использования millis() отличается, поэтому его переписывание может быть болезненным. Я говорю из опыта., @Duncan C


3

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

Вместо задержки используйте логическое значение running, чтобы отслеживать, выполняется ли ваша последовательность ретрансляции или нет. Также используйте unsigned long startTime и массив логических значений, чтобы отслеживать, включено или выключено каждое реле.

Если !running, проверьте кнопку. Если кнопка нажата, установите для параметра running значение true, а для параметра startTime — значение millis().

Затем используйте millis(), чтобы выяснить, где вы находитесь в последовательности. Вычислите (millis()-startTime)/1000/num_relays. Назовем его relayIndex.

Когда relayIndex меньше, чем num_relays - 1, проверьте логическое значение для этого реле и, если оно выключено, установите его и включите это реле. Когда relayIndex достигнет num_relays-1, вы закончите включать реле. Теперь пришло время подождать 3 минуты. Через 3 минуты выключите все реле и логические реле и установите running=false. Сделайте то же самое с кнопкой сброса.

ИЗМЕНИТЬ

Также обратите внимание, что управление реле с Arduino (или с других твердотельных устройств, если уж на то пошло) требует специального оборудования и мер предосторожности. Вероятно, вам следует использовать "цифровой" relay (что-то вроде этого, или еще лучше <b>это</b> 6-канальное реле), которое изолирует линию управления Arduino от сильного тока, необходимого для управления реле.

В противном случае вам следует собрать схему управления из полевого МОП-транзистора и «обратноходового диода». Без обратных диодов катушки индуктивности ваших реле излучают "обратную ЭДС" что, скорее всего, поджарит ваши транзисторы (и, возможно, Arduino)

,

Мне особенно понравилось то, что вы предоставили не полное рабочее решение, а скорее указатели для OP, чтобы написать свой собственный код. +1, @frarugi87

Ага. Я не люблю предоставлять код новичкам. Я думаю, что это контрпродуктивно. Чаще всего они копируют/вставляют его в свою программу, жалуются, если есть незначительные ошибки компиляции, и на самом деле не получают никакого понимания. Излагая решение и поддерживая OP, они действительно учатся., @Duncan C

Хотя я согласен, вы не должны давать полное рабочее решение; Я думаю, что этот источник (https://www.forward.com.au/pfod/ArduinoProgramming/TimingDelaysInArduino.html) поможет хотя бы понять возможную реализацию., @Paul