Многопоточность при работе с релейным модулем.

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Доброго времени суток господа!

Подскажите плиз!

Возможно ли это реализовать в скетче?

Есть UNO и 5 вольтовый релейный модуль (инвертный, LOW включает, HIGH отключает) на 8 каналов.

Существует ли способ заставить работать эту связку по следующему алгоритму.

1. Реле включается на 6 мин сразу после включения питания модуля (и остается включенным все 5 минут).

2. Второе реле включается через минуту после включения питания модуля, на 30 секунд (первое включено!).

3. Третье реле включается через две минуты после включения питания, на одну минуту.

4. Включаются одновременно два реле четвертое и восьмое, сразу, как выключается третье, на 1 минуту (т.е. через 3 минуты).

5. Пятое реле включается сразу, как выключается четвертое и восьмое реле, на одну минуту.

6. Включается опять 3 реле на минуту !

7. Включается опять четвертое реле после того, как выключается третье.

 

Я понимаю, что это вопрос многопоточности, которую не поддерживает Ардуина, но так же знаю, что есть умельцы, которые эмулируют многопоточность программно.

Если вопрос глупый или раздражающий, просьба не троллить, а ответить по существу.

Заранее спасибо!

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

P.S. Под пунктом 1. имеется ввиду первое реле !

Продолжительность 6 минут "все 5 минут" - это опечатка.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

У мня есть многопоточность.  Насыпать?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Arduino Uno пишет:

Я понимаю, что это вопрос многопоточности, которую не поддерживает Ардуина, но так же знаю, что есть умельцы, которые эмулируют многопоточность программно.

я не понимаю, что это вопрос многопоточности - у тебя тупой цикл ...12345671234567123...

Arduino Uno пишет:

Если вопрос глупый или раздражающий, просьба не троллить, а ответить по существу.

т.е. чорный червь соммения гложет, что чепуху о многопоточности програл?

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Мда...

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Дядя! Первое реле работает ВСЕГДА ! Все 6 минут !

Какой цикл ? Минимум уже несколько потоков одновременно.

Все остальные реле подключаются к работе первого на протяжении всего процесса - это раз.

Дважды отрабатывает цикл 3 реле, дважды отрабатывает цикл 4 реле с паралелльным включением 8 реле и без него.

А первое реле параллельно включено ! Следовательно 1 реле (один пин), 4 реле (второй пин), восьмое реле (третий пин) - это не многопоточность ?

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Arduino Uno пишет:

Дядя!

мальчик, не ори - сейчас найдут твою маму.

Arduino Uno пишет:

Первое реле работает ВСЕГДА ! Все 6 минут !

...или все 5-ть. О_О

Arduino Uno пишет:

1. Реле включается на 6 мин сразу после включения питания модуля (и остается включенным все 5 минут).

Arduino Uno пишет:

Минимум уже несколько потоков одновременно.

сколько потоков?.. одновременно. О_О

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Arduino Uno пишет:

это не многопоточность ?

это не многопоточность.

*что за "многопоточность"? - чего этот ребёнок хочет?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Многа таймеров

https://github.com/DetSimen/Arduino-

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Спасибо, конструктивно!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если што, рассказать, как прикрутить к твоему проекту могу только в пятницу.  Пишы, если што, или суда, или мне в аську. 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

DetSimen пишет:

Многа таймеров

значения таймера миллис() недостаточно отцу нароссийской демократии?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Как вариант это

/*to_ArduinoUno*/
unsigned long mill; // переменная под millis()
//-----Cl_Manager---------------------------
// класс менеджер задач
struct task_t {
  void (*Do)();
  unsigned long past;
  unsigned long time;
  struct task_t (*next);
  task_t(void (*_Do)(), unsigned long _past, unsigned long _time, struct task_t (*_next))
    : Do(_Do), past(_past), time(_time), next(_next) {}
};
class Cl_Manager {
  protected:
    struct task_t (*start) = NULL;
  public:
    /*вствить в loop() программы*/
    void run() {
      struct task_t (*_new);
      for (struct task_t (**i) = &start; (*i) != NULL; ) {
        _new = (*i);
        if (mill - (*_new).past >= (*_new).time) {
          (*i) = (**i).next;
          (*_new).Do();
          delete _new;
        }
        else i = &(**i).next;
      }
    }
    /*загрузить новую задачу*/
    void Task(unsigned long time, void (*Do)()) {
      struct task_t (*_new) = new struct task_t(Do, mill, time, start);
      start = _new;
    }
};
Cl_Manager Manager;
//---Компоновка-----------------------
// сам алгоритм.
const byte Relay1Pin =/*пин*/2;
const byte Relay2Pin =/*пин*/3;
const byte Relay3Pin =/*пин*/4;
const byte Relay4Pin =/*пин*/5;
const byte Relay5Pin =/*пин*/6;
const byte Relay6Pin =/*пин*/7;
const byte Relay7Pin =/*пин*/8;
const byte Relay8Pin =/*пин*/9;
const unsigned long time_30s = 30000;
const unsigned long time_1min = 60000;
const unsigned long time_2min = 2 * 60000;
const unsigned long time_6min = 6 * 60000;
/*инициализация*/
void taskInit() {
  pinMode(Relay1Pin, OUTPUT);
  digitalWrite(Relay1Pin, LOW);// реле 1 вкл
  Manager.Task(/*через 6 мин */ time_6min,/*сделать это*/&Relay1_OFF);
  pinMode(Relay2Pin, OUTPUT);
  digitalWrite(Relay2Pin, HIGH);// реле 2 выкл
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay2_ON);
  pinMode(Relay3Pin, OUTPUT);
  digitalWrite(Relay3Pin, HIGH);// реле 3 выкл
  Manager.Task(/*через 2 мин */ time_2min,/*сделать это*/&Relay3_ON);
  pinMode(Relay4Pin, OUTPUT);
  digitalWrite(Relay4Pin, HIGH);// реле 4 выкл
  pinMode(Relay5Pin, OUTPUT);
  digitalWrite(Relay5Pin, HIGH);// реле 5 выкл
  pinMode(Relay6Pin, OUTPUT);
  digitalWrite(Relay6Pin, HIGH);// реле 6 выкл
  pinMode(Relay7Pin, OUTPUT);
  digitalWrite(Relay7Pin, HIGH);// реле 7 выкл
  pinMode(Relay8Pin, OUTPUT);
  digitalWrite(Relay8Pin, HIGH);// реле 8 выкл
}
void Relay1_OFF() {
  digitalWrite(Relay1Pin, HIGH);
}
void Relay2_ON() {
  digitalWrite(Relay1Pin, HIGH);
  Manager.Task(/*через 30сек */ time_30s,/*сделать это*/&Relay2_OFF);
}
void Relay2_OFF() {
  digitalWrite(Relay1Pin, HIGH);
}
void Relay3_ON() {
  digitalWrite(Relay1Pin, HIGH);
  Manager.Task(/*через 30сек */ time_1min,/*сделать это*/&Relay3_OFF);
}
void Relay3_OFF() {
  digitalWrite(Relay1Pin, HIGH);
  /* Включаются одновременно два реле четвертое и восьмое, сразу, как выключается третье, на 1 минуту */
  digitalWrite(Relay4Pin, LOW);// реле 4 вкл
  digitalWrite(Relay8Pin, LOW);// реле 8 выкл
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay4_OFF);
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay8_OFF);
}
void Relay4_OFF() {
  digitalWrite(Relay4Pin, HIGH);
  digitalWrite(Relay1Pin, LOW);
  Manager.Task(/*через 30сек */ time_30s,/*сделать это*/&Relay5_OFF);
}
void Relay5_OFF() {
  digitalWrite(Relay1Pin, HIGH);
}
void Relay6_ON() {
  digitalWrite(Relay1Pin, HIGH);
  Manager.Task(/*через 30сек */ time_30s,/*сделать это*/&Relay6_OFF);
}
void Relay6_OFF() {
  digitalWrite(Relay1Pin, HIGH);
}
void Relay7_OFF() {
  digitalWrite(Relay7Pin, HIGH);
}
void Relay8_OFF() {
  digitalWrite(Relay8Pin, HIGH);
}

//---main-----------------------------
void setup() {
  taskInit();
}

void loop() {
  mill = millis();
  Manager.run();
}
/*Скетч использует 1936 байт (6%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 25 байт (1%) динамической памяти, оставляя 2023 байт для локальных переменных. Максимум: 2048 байт.
*/

ПС:Это моя модефикация идеи DetSimen.

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Qwone спасибо, сейчас попробую применить )

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Получилось вот что:

При включении ардуины включилось первое реле, но (!) всего на минуту, потом включилось опять через 4 минуты и еще через 30 секунд опять выключилось (т.е. 6 минут постоянного включения нет)

Второе так и не включилось вообще.

Третье не включалось вообще.

Пятое не включалось вообще.

Шестое не включалось вообще.

Седьмое не включаллось вообще.

А вот 4 и 8 включились через 4 минуты и пропаботали минуту, как только они отключились включилось опять первое и через 30 секунд выключилось все вообще.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Посмотрите вот эту тему. Почти ваша задача. И решение в конце приведено. Его надо только расширить. http://arduino.ru/forum/obshchii/pomogite-osushchestvit-proekt-s-3-mya-t...

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Qwone, спасибо добрый человек ! Методом "тыка" понял в чем было дело, поправил номера релюх и вроде заработало )

/*to_ArduinoUno*/
unsigned long mill; // переменная под millis()
//-----Cl_Manager---------------------------
// класс менеджер задач
struct task_t {
  void (*Do)();
  unsigned long past;
  unsigned long time;
  struct task_t (*next);
  task_t(void (*_Do)(), unsigned long _past, unsigned long _time, struct task_t (*_next))
    : Do(_Do), past(_past), time(_time), next(_next) {}
};
class Cl_Manager {
  protected:
    struct task_t (*start) = NULL;
  public:
    /*вствить в loop() программы*/
    void run() {
      struct task_t (*_new);
      for (struct task_t (**i) = &start; (*i) != NULL; ) {
        _new = (*i);
        if (mill - (*_new).past >= (*_new).time) {
          (*i) = (**i).next;
          (*_new).Do();
          delete _new;
        }
        else i = &(**i).next;
      }
    }
    /*загрузить новую задачу*/
    void Task(unsigned long time, void (*Do)()) {
      struct task_t (*_new) = new struct task_t(Do, mill, time, start);
      start = _new;
    }
};
Cl_Manager Manager;
//---Компоновка-----------------------
// сам алгоритм.
const byte Relay1Pin =/*пин*/2;
const byte Relay2Pin =/*пин*/3;
const byte Relay3Pin =/*пин*/4;
const byte Relay4Pin =/*пин*/5;
const byte Relay5Pin =/*пин*/6;
const byte Relay6Pin =/*пин*/7;
const byte Relay7Pin =/*пин*/8;
const byte Relay8Pin =/*пин*/9;
const unsigned long time_30s = 30000;
const unsigned long time_1min = 60000;
const unsigned long time_2min = 2 * 60000;
const unsigned long time_6min = 6 * 60000;
/*инициализация*/
void taskInit() {
  pinMode(Relay1Pin, OUTPUT);
  digitalWrite(Relay1Pin, LOW);// реле 1 вкл
  Manager.Task(/*через 6 мин */ time_6min,/*сделать это*/&Relay1_OFF);
  pinMode(Relay2Pin, OUTPUT);
  digitalWrite(Relay2Pin, HIGH);// реле 2 выкл
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay2_ON);
  pinMode(Relay3Pin, OUTPUT);
  digitalWrite(Relay3Pin, HIGH);// реле 3 выкл
  Manager.Task(/*через 2 мин */ time_2min,/*сделать это*/&Relay3_ON);
  pinMode(Relay4Pin, OUTPUT);
  digitalWrite(Relay4Pin, HIGH);// реле 4 выкл
  pinMode(Relay5Pin, OUTPUT);
  digitalWrite(Relay5Pin, HIGH);// реле 5 выкл
  pinMode(Relay6Pin, OUTPUT);
  digitalWrite(Relay6Pin, HIGH);// реле 6 выкл
  pinMode(Relay7Pin, OUTPUT);
  digitalWrite(Relay7Pin, HIGH);// реле 7 выкл
  pinMode(Relay8Pin, OUTPUT);
  digitalWrite(Relay8Pin, HIGH);// реле 8 выкл
}
void Relay1_OFF() {
  digitalWrite(Relay1Pin, HIGH);
}
void Relay2_ON() {
  digitalWrite(Relay2Pin, LOW);
  Manager.Task(/*через 30сек */ time_30s,/*сделать это*/&Relay2_OFF);
}
void Relay2_OFF() {
  digitalWrite(Relay2Pin, HIGH);
}
void Relay3_ON() {
  digitalWrite(Relay3Pin, LOW);
  Manager.Task(/*через 1мин */ time_1min,/*сделать это*/&Relay3_OFF);
}
void Relay3_OFF() {
  digitalWrite(Relay3Pin, HIGH);
  /* Включаются одновременно два реле четвертое и восьмое, сразу, как выключается третье, на 1 минуту */
  digitalWrite(Relay4Pin, LOW);// реле 4 вкл
  digitalWrite(Relay8Pin, LOW);// реле 8 вкл
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay4_OFF);
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay8_OFF);
}
void Relay4_OFF() {
  digitalWrite(Relay4Pin, HIGH);
  digitalWrite(Relay5Pin, LOW);
  Manager.Task(/*через 30сек */ time_30s,/*сделать это*/&Relay5_OFF);
}
void Relay5_OFF() {
  digitalWrite(Relay5Pin, HIGH);
  /* Включаются одновременно два реле четвертое и восьмое, сразу, как выключается третье, на 1 минуту */
  digitalWrite(Relay4Pin, LOW);// реле 4 вкл
  digitalWrite(Relay6Pin, LOW);// реле 6 вкл
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay4_OFF);
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay6_OFF);
}
void Relay6_ON() {
  digitalWrite(Relay1Pin, HIGH);
  Manager.Task(/*через 30сек */ time_30s,/*сделать это*/&Relay6_OFF);
}
void Relay6_OFF() {
  digitalWrite(Relay6Pin, HIGH);
}
void Relay7_OFF() {
  digitalWrite(Relay7Pin, HIGH);
}
void Relay8_OFF() {
  digitalWrite(Relay8Pin, HIGH);
}

//---main-----------------------------
void setup() {
  taskInit();
}

void loop() {
  mill = millis();
  Manager.run();
}
/*Скетч использует 1936 байт (6%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 25 байт (1%) динамической памяти, оставляя 2023 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Не получается только впихнуть еще на минуту включение третей релюхи между отключением пятой и включением четвертой и шестой (именно 4 и 6, а не 4 и 8) и после отработки 4 и 6 минуту отключение всех релюх вообще без повторения цикла пока не отключится/включится ардуина.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробую и я свои 5 копеек

#define Relay1Pin 2
#define Relay2Pin 3
#define Relay3Pin 4
#define Relay4Pin 5
#define Relay5Pin 6
#define Relay6Pin 7
#define Relay7Pin 8
#define Relay8Pin 9

uint16_t tic = 0;
uint32_t mil;
char pausa = 0;
bool start_stop;

void setup(){
  pinMode(Relay1Pin, OUTPUT);
  pinMode(Relay2Pin, OUTPUT);
  pinMode(Relay3Pin, OUTPUT);
  pinMode(Relay4Pin, OUTPUT);
  pinMode(Relay5Pin, OUTPUT);
  pinMode(Relay6Pin, OUTPUT);
  pinMode(Relay7Pin, OUTPUT);
  pinMode(Relay8Pin, OUTPUT);
  digitalWrite(Relay1Pin, HIGH);
  digitalWrite(Relay2Pin, HIGH);
  digitalWrite(Relay3Pin, HIGH);
  digitalWrite(Relay4Pin, HIGH);
  digitalWrite(Relay5Pin, HIGH);
  digitalWrite(Relay6Pin, HIGH);
  digitalWrite(Relay7Pin, HIGH);
  digitalWrite(Relay8Pin, HIGH);
}

void loop(){
if (!start_stop){
  if(millis() - mil >= tic){
    mil = millis();
    pausa++;
    if(pausa < 5)tic = 30000;
    else tic = 60000;
   
   switch (pausa){
    case 1:
      digitalWrite(Relay1Pin, LOW);
      break;
    case 3:
      digitalWrite(Relay2Pin, LOW);
      break;
    case 4:
      digitalWrite(Relay2Pin, HIGH);
      break;
    case 5:
      digitalWrite(Relay3Pin, LOW);
      break;
    case 6:
      digitalWrite(Relay3Pin, HIGH);
      digitalWrite(Relay4Pin, LOW);
      digitalWrite(Relay6Pin, LOW);
      break;
    case 7:
      digitalWrite(Relay4Pin, HIGH);
      digitalWrite(Relay6Pin, HIGH);
      digitalWrite(Relay5Pin, LOW);
      break;
    case 8:
      digitalWrite(Relay5Pin, HIGH);
      digitalWrite(Relay3Pin, LOW);
      break;
    case 9:
      digitalWrite(Relay1Pin, HIGH);
      digitalWrite(Relay3Pin, HIGH);
      digitalWrite(Relay4Pin, LOW);
      break;
    case 10:
      digitalWrite(Relay4Pin, HIGH);
      pausa = 0;
      start_stop = 1;
      break;	
    }
  }
 }
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Разумеется  прежде всего что бы писать код программы надо убедиться что задание внятно написано. Если и есть какие-то неточности, то они обязательно всплывут в скетче. И да если вы все-таки заинтересованы в получении скетча оформите задание хотя бы так

Вот код для задания по картинке

/*to_ArduinoUno*/
unsigned long mill; // переменная под millis()
//-----Cl_Manager---------------------------
// класс менеджер задач
struct task_t {
  void (*Do)();
  unsigned long past;
  unsigned long time;
  struct task_t (*next);
  task_t(void (*_Do)(), unsigned long _past, unsigned long _time, struct task_t (*_next))
    : Do(_Do), past(_past), time(_time), next(_next) {}
};
class Cl_Manager {
  protected:
    struct task_t (*start) = NULL;
  public:
    /*вствить в loop() программы*/
    void run() {
      struct task_t (*_new);
      for (struct task_t (**i) = &start; (*i) != NULL; ) {
        _new = (*i);
        if (mill - (*_new).past >= (*_new).time) {
          (*i) = (**i).next;
          (*_new).Do();
          delete _new;
        }
        else i = &(**i).next;
      }
    }
    /*загрузить новую задачу*/
    void Task(unsigned long time, void (*Do)()) {
      struct task_t (*_new) = new struct task_t(Do, mill, time, start);
      start = _new;
    }
};
Cl_Manager Manager;
//---Компоновка-----------------------
// сам алгоритм.
const byte Relay1Pin =/*пин*/2;
const byte Relay2Pin =/*пин*/3;
const byte Relay3Pin =/*пин*/4;
const byte Relay4Pin =/*пин*/5;
const byte Relay5Pin =/*пин*/6;
const byte Relay6Pin =/*пин*/7;
const byte Relay7Pin =/*пин*/8;
const byte Relay8Pin =/*пин*/9;
const bool _ON = LOW;
const bool _OFF = HIGH;
const unsigned long time_30s = 30000;
const unsigned long time_1min = 60000;
const unsigned long time_2min = 2 * 60000;
const unsigned long time_6min = 6 * 60000;
/*инициализация*/
void taskInit() {
  pinMode(Relay1Pin, OUTPUT);
  digitalWrite(Relay1Pin, _OFF);// реле 1 выкл
  pinMode(Relay2Pin, OUTPUT);
  digitalWrite(Relay2Pin, _OFF);// реле 2 выкл
  pinMode(Relay3Pin, OUTPUT);
  digitalWrite(Relay3Pin, _OFF);// реле 3 выкл
  pinMode(Relay4Pin, OUTPUT);
  digitalWrite(Relay4Pin, _OFF);// реле 4 выкл
  pinMode(Relay5Pin, OUTPUT);
  digitalWrite(Relay5Pin, _OFF);// реле 5 выкл
  pinMode(Relay6Pin, OUTPUT);
  digitalWrite(Relay6Pin, _OFF);// реле 6 выкл
  pinMode(Relay7Pin, OUTPUT);
  digitalWrite(Relay7Pin, _OFF);// реле 7 выкл
  pinMode(Relay8Pin, OUTPUT);
  digitalWrite(Relay8Pin, _OFF);// реле 8 выкл
  Relay1_ON();
  Manager.Task(/*через 1 мин */ time_1min,/*сделать это*/&Relay2_ON);
  Manager.Task(/*через 2 мин */ time_2min,/*сделать это*/&Relay3_ON);
}
void Relay1_ON() {
  digitalWrite(Relay1Pin, _ON);// реле вкл
  Manager.Task(/*через 6 мин */ time_6min,/*сделать это*/&Relay1_OFF);
}
void Relay1_OFF() {
  digitalWrite(Relay1Pin, _OFF);
}
void Relay2_ON() {
  digitalWrite(Relay1Pin, _ON);
  Manager.Task(/*через 30сек */ time_30s,/*сделать это*/&Relay2_OFF);
}
void Relay2_OFF() {
  digitalWrite(Relay1Pin, _OFF);
}
void Relay3_ON() {
  digitalWrite(Relay1Pin, _ON);
  Manager.Task(/*через 1мин */ time_1min,/*сделать это*/&Relay3_OFF);
}
void Relay3_OFF() {
  digitalWrite(Relay3Pin, _OFF);
  Relay4_ON();
  Relay8_ON();
}
void Relay4_ON() {
  digitalWrite(Relay1Pin, _ON);
  Manager.Task(/*через 1мин */ time_1min,/*сделать это*/&Relay4_OFF);
}
void Relay4_OFF() {
  digitalWrite(Relay4Pin, _OFF);
}
void Relay8_ON() {
  digitalWrite(Relay8Pin, _ON);
  Manager.Task(/*через 1мин */ time_1min,/*сделать это*/&Relay8_OFF);
}
void Relay8_OFF() {
  digitalWrite(Relay8Pin, _OFF);
  Relay5_ON();
}
void Relay5_ON() {
  digitalWrite(Relay5Pin, _ON);
  Manager.Task(/*через 1мин */ time_1min,/*сделать это*/&Relay5_OFF);
}
void Relay5_OFF() {
  digitalWrite(Relay5Pin, _OFF);
  Relay3_ON();
}
//---main-----------------------------
void setup() {
  taskInit();
}

void loop() {
  mill = millis();
  Manager.run();
}
/*Скетч использует 1948 байт (6%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 25 байт (1%) динамической памяти, оставляя 2023 байт для локальных переменных. Максимум: 2048 байт.
*/

Я просто привожу метод по которому можно решать подобные задачи и при этом не лезть далеко в язык.

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Vosara , спасибо большое, прекрасно работает ! А не подскажете, как можно параметры времени менять ?

В частности 5 реле должно отработать 30 секунд, а не минуту.

И есть ле не сложный способ изменения времени работы отдельных релюшек (если потребуется изменить) ?

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Qwone, спасибо! Я согласен, что ТЗ должно быть более удобоваримое ) Просто неожиданно столкнулся с этой проблемой и возможно сумбурно изложил задачу.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Arduino Uno пишет:

И есть ле не сложный способ изменения времени работы отдельных релюшек (если потребуется изменить) ?

Если понимаеш как работает пограмма - сложности никакой НЕТ. Я немножко изменил и прокоментировал код - Постарайтесь разобраться, там не сложно. И еще Вы должны четко представля вашу задачу, что и через солько должно сработать.

#define Relay1Pin 2
#define Relay2Pin 3
#define Relay3Pin 4
#define Relay4Pin 5
#define Relay5Pin 6
#define Relay6Pin 7
#define Relay7Pin 8
#define Relay8Pin 9
//Чтобы было легче читать код - слову присвоим число
#define minuta 60000
#define sekund30 30000

uint16_t tic = 0;
uint32_t mil;
char pausa = 0;
bool start_stop;

void setup(){
  pinMode(Relay1Pin, OUTPUT);
  pinMode(Relay2Pin, OUTPUT);
  pinMode(Relay3Pin, OUTPUT);
  pinMode(Relay4Pin, OUTPUT);
  pinMode(Relay5Pin, OUTPUT);
  pinMode(Relay6Pin, OUTPUT);
  pinMode(Relay7Pin, OUTPUT);
  pinMode(Relay8Pin, OUTPUT);
  digitalWrite(Relay1Pin, HIGH);
  digitalWrite(Relay2Pin, HIGH);
  digitalWrite(Relay3Pin, HIGH);
  digitalWrite(Relay4Pin, HIGH);
  digitalWrite(Relay5Pin, HIGH);
  digitalWrite(Relay6Pin, HIGH);
  digitalWrite(Relay7Pin, HIGH);
  digitalWrite(Relay8Pin, HIGH);
   //Serial.begin(9600);
}

void loop(){
//Чтобы было понятней немножко сменим код
if (!start_stop){ 			//Проверка на прохождение 1 раз
  if(millis() - mil >= tic){		//проверяем вышло ли время
    mil = millis();			//Фиксируем время
    pausa++;				//Сдвигаемся на одну позицию

   switch (pausa){
    case 1:
      digitalWrite(Relay1Pin, LOW);	//Вкл. реле1
	tic = minuta;			//Задаем паузу минута чтобы вкл.реле2
      break;
    case 2:
      digitalWrite(Relay2Pin, LOW);	//Вкл. реле2
	tic = sekund30;			//Задаем паузу 30 сек. чтобы вЫкл.реле2
      break;
    case 3:
      digitalWrite(Relay2Pin, HIGH);	//Выкл. реле2
	tic = sekund30;			//Задаем паузу 30 сек. чтобы вкл.реле3
      break;
    case 4:
      digitalWrite(Relay3Pin, LOW);//Вкл. реле3
	tic = minuta;//Задаем паузу минута чтобы выкл.реле3 и вкл.Реле4-Реле6
      break;
    case 5:
      digitalWrite(Relay3Pin, HIGH);
      digitalWrite(Relay4Pin, LOW);
      digitalWrite(Relay6Pin, LOW);
//	tic = minuta; (минута уже задана поэтому закоментировал но можно ставить любое число от 0 - 65535 или сменить тип на unsigned long тогда 0 - 4294967295)
      break;
    case 6:
      digitalWrite(Relay4Pin, HIGH);
      digitalWrite(Relay6Pin, HIGH);
      digitalWrite(Relay5Pin, LOW);
//	tic = minuta;
      break;
    case 7:
      digitalWrite(Relay5Pin, HIGH);
      digitalWrite(Relay3Pin, LOW);
//	tic = minuta;
      break;
    case 8:
      digitalWrite(Relay1Pin, HIGH);
      digitalWrite(Relay3Pin, HIGH);
      digitalWrite(Relay4Pin, LOW);
//	tic = minuta;
      break;
    case 9:
      digitalWrite(Relay4Pin, HIGH);
      pausa = 0;
      start_stop = 1;
//	tic = minuta;
      break;	
    }
  }
 }
}

 

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Vosara, спасибо огромное за терпение и желание помочь !