Параллельная работа двух реле

iven83
Offline
Зарегистрирован: 02.02.2017

Здравствуйте. Помогите пожалуйста реализовать проект.

Нужно запитать два реле по следующему алгоритму работы:

1. Включается реле №1 на 1с.

2. Реле №1 выключается на 10 минут.

3. Через 2 секунду после включения реле №1 включается реле №2.

4. Реле 2 отключается через 1 с работы на 10 минут. 

Цикл замкнутый (пока не отключу кнопкой). Включать-включать хочу всё с одной кнопки. 

Не судите строго - читаю про Ардуино 3й день и пользуясь исключительно видеоуроками из Ютуба попытался написать следующее. 

void setup() {
  pinMode(13, OUTPUT); // реле №1
  pinMode(11, OUTPUT); // реле №2
  pinMode(12, INPUT_PULLUP); // кнопка включения-выключения
}
void loop() {
  if ( digitalRead(12) == LOW ) digitalWrite(13, 11, HIGH);
  else digitalWrite(13, 11 LOW);
digitalWrite(13, HIGH); 
delay(1000); 
digitalWrite(13, LOW); 
delay(1000); 
digitalWrite(11, HIGH); 
delay(1000); 
digitalWrite(11, LOW); 
delay(1000); 
digitalWrite(13, LOW); 
delay(9000); 
digitalWrite(11, LOW); 
delay(9000); 
}
}
Поскольку параллельное выполнение задач вроди как невозможно (опять же исходя из моих скромных знаний), попытался реализовать последовательно. 
Проаверить пока даже негде - только завтра обещали прислать "комплект новичка" на базе Arduino UNO. Ранее вообще к программированию отношения не имел, так что не судите строго пожалуйста. 
Всем заранее спасибо. 
iven83
Offline
Зарегистрирован: 02.02.2017

Сразу хотел бы отметить по периоду включения-выключения - время пока ставил маленькое, потмоу как проверить будет проще (ждать меньше, если конечно вообще заработает).

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

iven83 пишет:

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

Проаверить пока даже негде - только завтра обещали прислать "комплект новичка" на базе Arduino UNO. Ранее вообще к программированию отношения не имел, так что не судите строго пожалуйста. 
Всем заранее спасибо. 

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

ПС: Все видеоуроки на Ардуино это просто реклама и ничего больше. Вы же по рекламе автомобилей не учитесь  вождению автомобилем.

iven83
Offline
Зарегистрирован: 02.02.2017

qwone пишет:

...

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

ПС: Все видеоуроки на Ардуино это просто реклама и ничего больше. Вы же по рекламе автомобилей не учитесь  вождению автомобилем.

Спасибо за ответ. 

Я читал про большое количество delay(), видел на Ютубе как автор говорит, что использование такой остановки контроллера не желательно. Но проект в принципе примитивен (для примитивных задач вроди продходит), да и других вариантов пока не придумал. Буду благодарен, если подскажете. 

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

P.S.: Я учился вождению автомобиля по "рекламе" вождения автомобиля ). 

JasKo
Offline
Зарегистрирован: 21.11.2015

Если ничего более программа делать не будет, то можно сдеать так например

#define RELAY1 10
#define RELAY2 11
#define ONTIME 1000
#define OFFTIME 600000
#define PAUSE 1000
#define ON  1      // если реле управляются высоким уровнем то ON= 1 OFF=0
#define OFF 0      // если реле управляется низким уровнем то поставить ON=0 OFF=1

unsigned long timeRelay1 = -99999;
unsigned long timeRelay2 = -99999;

boolean relay1 = false;
boolean relay2 = false;

void setup() {
  // put your setup code here, to run once:
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, OFF);
  digitalWrite(RELAY2, OFF);
}

void loop() {
  // put your main code here, to run repeatedly:
  if ( digitalRead(RELAY1) == ON){
    if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
      digitalWrite(RELAY1, OFF);  
      timeRelay1 = millis();
    }
  } else {
    if (millis() - timeRelay1 >= OFFTIME){ // если реле 1 выключено проверяем 10 мин. и включаем если время прошло
      digitalWrite(RELAY1, ON);
      timeRelay1 = millis();
    }
  }
  if (digitalRead(RELAY2) == ON){
    if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем
      digitalWrite(RELAY2, OFF);
      timeRelay2 = millis();
    }
  } else {
    unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек.
    if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))){
      digitalWrite(RELAY2, ON);
      timeRelay2 = curentTime;
    }
  }
  
}

 

JasKo
Offline
Зарегистрирован: 21.11.2015

А по поводу отлючения включения одной кнопкой посмотри уроки джереми блума и допиши сам.

iven83
Offline
Зарегистрирован: 02.02.2017

JasKo пишет:

А по поводу отлючения включения одной кнопкой посмотри уроки джереми блума и допиши сам.

Спасибо за код, за совет. 

Код закачал - буду разбираться, пробовать.

Про включение-выключение кнопкой видеоролик Джереми смотрел - у меня мозг вскипел ). Код-то я записал, но мало что понял. 

JasKo
Offline
Зарегистрирован: 21.11.2015

iven83 пишет:

... но мало что понял. 

соболезную, но упорство и труд все перетрут.

iven83
Offline
Зарегистрирован: 02.02.2017

JasKo пишет:

iven83 пишет:

... но мало что понял. 

соболезную, но упорство и труд все перетрут.

Я тоже так думаю. В университете получилось изучить экономико-математическое моделирование самостоятельно и защитить диссертацию, с Arduino тоже должно получиться. Тем-более мне пока сложного ничего не нужно, а там видно будет. 

Ваш код изучил - написано вроди красиво и что мне очень нравится - понятно. Надеюсь получится завтра опробовать ). Заодно попробую и кнопку прописать. 

iven83
Offline
Зарегистрирован: 02.02.2017

JasKo пишет:

Если ничего более программа делать не будет, то можно сдеать так например

#define RELAY1 10
#define RELAY2 11
#define ONTIME 1000
#define OFFTIME 600000
#define PAUSE 1000
#define ON  1      // если реле управляются высоким уровнем то ON= 1 OFF=0
#define OFF 0      // если реле управляется низким уровнем то поставить ON=0 OFF=1

unsigned long timeRelay1 = -99999;
unsigned long timeRelay2 = -99999;

boolean relay1 = false;
boolean relay2 = false;

void setup() {
  // put your setup code here, to run once:
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, OFF);
  digitalWrite(RELAY2, OFF);
}

void loop() {
  // put your main code here, to run repeatedly:
  if ( digitalRead(RELAY1) == ON){
    if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
      digitalWrite(RELAY1, OFF);  
      timeRelay1 = millis();
    }
  } else {
    if (millis() - timeRelay1 >= OFFTIME){ // если реле 1 выключено проверяем 10 мин. и включаем если время прошло
      digitalWrite(RELAY1, ON);
      timeRelay1 = millis();
    }
  }
  if (digitalRead(RELAY2) == ON){
    if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем
      digitalWrite(RELAY2, OFF);
      timeRelay2 = millis();
    }
  } else {
    unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек.
    if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))){
      digitalWrite(RELAY2, ON);
      timeRelay2 = curentTime;
    }
  }
  
}

 

Получил сегодня плату, загрузил Ваш код - отлично работает. Могу без проблем изменять все интервалы, а вот с кнопкой беда... Отдельно включение двух диодов - не проблема, а вот с учётом предыдущего алгоритма - никак. Гляньте пожалуйста что я написал не так. 

Код на два диода с кнопки:

const int LED=10;
const int LED2=11;
const int BUTTON=2;
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean ledOn = false;
boolean led2On = false;

void setup() {
pinMode (LED, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode (BUTTON, INPUT);
}
boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);
  if (last != current)
  {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
  }
}
void loop() 
{
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    ledOn = !ledOn;
    led2On = !led2On;
  }
  lastButton = currentButton;
  digitalWrite(LED, ledOn);
   digitalWrite(LED2, ledOn);
}

 

То, что я пытался "совместить":
 
const int BUTTON=2; // кнопка на втором пин
const int relay1=10;
const int relay2=11;
#define ONTIME 500
#define OFFTIME 5000
#define PAUSE 1000
#define ON  1      // если реле управляются высоким уровнем то ON= 1 OFF=0
#define OFF 0      // если реле управляется низким уровнем то поставить ON=0 OFF=1
boolean lastButton = HIGH; 
boolean currentButton = HIGH;
boolean relay1On = false;
boolean relay2On = false;
unsigned long timeRelay1 = -99999;
unsigned long timeRelay2 = -99999;

void setup() {
{
  pinMode (BUTTON, INPUT);
  boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
      delay(5);
      current = digitalRead(BUTTON);
      return current;
    }
  }
 }
  {
  // put your setup code here, to run once:
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, OFF);
  digitalWrite(RELAY2, OFF);
  }
}
void loop() {
  {
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    relay1On = !relay1On;
    relay2On = !relay1On;
  }
  lastButton = currentButton;
  digitalWrite(relay1, ledOn);
  digitalWrite(relay2, ledOn);
}
  // put your main code here, to run repeatedly:
  if ( digitalRead(RELAY1) == ON){
    if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
      digitalWrite(RELAY1, OFF); 
      timeRelay1 = millis();
    }
  } else {
    if (millis() - timeRelay1 >= OFFTIME){ // если реле 1 выключено проверяем 10 мин. и включаем если время прошло
      digitalWrite(RELAY1, ON);
      timeRelay1 = millis();
    }
  }
  if (digitalRead(RELAY2) == ON){
    if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем
      digitalWrite(RELAY2, OFF);
      timeRelay2 = millis();
    }
  } else {
    unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек.
    if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))){
      digitalWrite(RELAY2, ON);
      timeRelay2 = curentTime;
      }
}
}

 

 

JasKo
Offline
Зарегистрирован: 21.11.2015

Ну для начала есть способ вставки кода на форум 

const int LED=10;
const int LED2=11;
const int BUTTON=2;
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean ledOn = false;
boolean led2On = false;
 
void setup() {
pinMode (LED, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode (BUTTON, INPUT);
}
boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);
  if (last != current)
  {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
  }
}
void loop() 
{
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    ledOn = !ledOn;
    led2On = !led2On;
  }
  lastButton = currentButton;
  digitalWrite(LED, ledOn);
   digitalWrite(LED2, ledOn);
}

и то что получилось после скрещивания.

const int BUTTON=2; // кнопка на втором пин
const int relay1=10;
const int relay2=11;
#define ONTIME 500
#define OFFTIME 5000
#define PAUSE 1000
#define ON  1      // если реле управляются высоким уровнем то ON= 1 OFF=0
#define OFF 0      // если реле управляется низким уровнем то поставить ON=0 OFF=1
boolean lastButton = HIGH; 
boolean currentButton = HIGH;
boolean relay1On = false;
boolean relay2On = false;
unsigned long timeRelay1 = -99999;
unsigned long timeRelay2 = -99999;
 
void setup() {
{
  pinMode (BUTTON, INPUT);
  boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
      delay(5);
      current = digitalRead(BUTTON);
      return current;
    }
  }
 }
  {
  // put your setup code here, to run once:
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, OFF);
  digitalWrite(RELAY2, OFF);
  }
}
void loop() {
  {
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    relay1On = !relay1On;
    relay2On = !relay1On;
  }
  lastButton = currentButton;
  digitalWrite(relay1, ledOn);
  digitalWrite(relay2, ledOn);
}
  // put your main code here, to run repeatedly:
  if ( digitalRead(RELAY1) == ON){
    if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
      digitalWrite(RELAY1, OFF); 
      timeRelay1 = millis();
    }
  } else {
    if (millis() - timeRelay1 >= OFFTIME){ // если реле 1 выключено проверяем 10 мин. и включаем если время прошло
      digitalWrite(RELAY1, ON);
      timeRelay1 = millis();
    }
  }
  if (digitalRead(RELAY2) == ON){
    if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем
      digitalWrite(RELAY2, OFF);
      timeRelay2 = millis();
    }
  } else {
    unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек.
    if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))){
      digitalWrite(RELAY2, ON);
      timeRelay2 = curentTime;
      }
}
}

А тепере уже можно разбираться

JasKo
Offline
Зарегистрирован: 21.11.2015

для объединения двух программ я бы во втором (тот что мой) переименовал

void setup() в void setup1(), а void loop() в void loop1()

теперь эти две функции можно добавить к твоему коду со светодиодами

вызов setup1() добавляем внутрь твоего setup()

а вызов loop1() в ставляем в конце твего loop()

и дописываем к нему условие 

if (ledOn) {
   loop1();
} else {
// выключаем оба реле
   digitalWrite(RELAY1, OFF);
   digitalWrite(RELAY2, OFF);
   timeRelay1 = -99999;
   timeRelay2 = -99999;
}

 

iven83
Offline
Зарегистрирован: 02.02.2017

Что можно вставлять код в таком формате я не знал - обязательно исправлюсь. 

И не знал, что можно вставлять void setup1() и void loop1() - буду пробовать. )

Ещё раз большое спасибо. 

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

Вот 1 шаг разработки кода.

/*to_iven83.ino
  #1реле 1

  Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин)
*/
//#1реле 1
const byte relay_1_pin = 13;
bool relay_1;
const long relay_1_ON = 1000; // 1 сек
const long relay_1_OFF = 600000; // 10 мин
void setup() {
  //#1реле 1
  pinMode(relay_1_pin, OUTPUT);
  digitalWrite(relay_1_pin, relay_1 = 1);
}

void loop() {
  //#1реле 1
  static unsigned long past = 0;
  if (relay_1 && millis() - past >= relay_1_ON) {
    past = millis();
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
  if (!relay_1 && millis() - past >= relay_1_OFF) {
    past = millis();
    digitalWrite(relay_1_pin, relay_1 = 1);
  }
}

Это 2 шаг разработки кода

/*to_iven83.ino
  #1реле 1 ->13 (relay_1_pin)

  #2реле 1 ->11 (relay_2_pin)

  Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин)
                реле 2 (через 2 сек от вкл 1 реле вкл 2 реле и откл через 1 сек)
*/
//#1реле 1
const byte relay_1_pin = 13;
bool relay_1;
const long relay_1_ON = 1000; // 1 сек
const long relay_1_OFF = 600000; // 10 мин
//#2реле 2
const byte relay_2_pin = 11;
bool relay_2;
bool relay_2_do ;//
const unsigned long relay_2_do_ON = 2000; // 2 сек
const unsigned long relay_2_ON = 1000; // 1 сек

void setup() {
  //#1реле 1
  pinMode(relay_1_pin, OUTPUT);
  digitalWrite(relay_1_pin, relay_1 = 1);
  relay_2_do = 1;
  //#2реле 2
  pinMode(relay_2_pin, OUTPUT);
  digitalWrite(relay_2_pin, relay_2 = 0);
}

void loop() {
  //#1реле 1
  static unsigned long past_1 = 0;
  static unsigned long past_2 = 0;
  if (relay_1 && millis() - past_1 >= relay_1_ON) {
    past_1 = millis();
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
  if (!relay_1 && millis() - past_1 >= relay_1_OFF) {
    past_1 = millis();
    digitalWrite(relay_1_pin, relay_1 = 1);
    past_2 = millis();
    relay_2_do = 1;
  }
  //#2реле 2
  if (relay_2_do && millis() - past_2 >= relay_2_do_ON) {
    relay_2_do = 0;
    past_2 = millis();
    digitalWrite(relay_2_pin, relay_2 = 1);
  }
  if (relay_2 && millis() - past_2 >= relay_2_ON) {
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
}

Окончательный вариант полностью здесь https://yadi.sk/d/elyRWglV3DPRZm

Головной файл выкладываю 

/*to_iven83.ino https://yadi.sk/d/elyRWglV3DPRZm
  #1реле 1 ->13 (relay_1_pin)
  #2реле 2 ->11 (relay_2_pin)
  #3 кнопка -> 12 
  Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин)
                реле 2 (через 2 сек от вкл 1 реле вкл 2 реле и откл через 1 сек)
                кнопка включает или отключает перещелкивание реле
*/
unsigned long past_1 = 0;
unsigned long past_2 = 0;
//#1реле 1
const byte relay_1_pin = 13;
bool relay_1;
const long relay_1_ON = 1000; // 1 сек
const long relay_1_OFF = 600000; // 10 мин
//#2реле 2
const byte relay_2_pin = 11;
bool relay_2;
bool relay_2_do ;//
const unsigned long relay_2_do_ON = 2000; // 2 сек
const unsigned long relay_2_ON = 1000; // 1 сек
// #3 кнопка
#include "Cl_do_btn.h"
const byte btn1_pin = 12;
bool Run_ON = 1;// 1 идет работа  / 0 нет
Cl_do_btn Do_1; // создать
void func_ON() {
  Run_ON = ! Run_ON;
  if (Run_ON) {
    digitalWrite(relay_1_pin, relay_1 = 1);
    relay_2_do = 1;
    past_2 = past_1 = millis();
  }
  else
    digitalWrite(relay_1_pin, relay_1 = 0);
  digitalWrite(relay_2_pin, relay_2 = 0);
}
void setup() {
  //#1реле 1
  pinMode(relay_1_pin, OUTPUT);
  digitalWrite(relay_1_pin, relay_1 = 1);
  relay_2_do = 1;
  //#2реле 2
  pinMode(relay_2_pin, OUTPUT);
  digitalWrite(relay_2_pin, relay_2 = 0);
  // #3 кнопка
  Do_1.setup(btn1_pin);
}

void loop() {
  //#1реле 1
  if (Run_ON && relay_1 && millis() - past_1 >= relay_1_ON) {
    past_1 = millis();
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
  if (Run_ON && !relay_1 && millis() - past_1 >= relay_1_OFF) {
    past_1 = millis();
    digitalWrite(relay_1_pin, relay_1 = 1);
    past_2 = millis();
    relay_2_do = 1;
  }
  //#2реле 2
  if (Run_ON && relay_2_do && millis() - past_2 >= relay_2_do_ON) {
    relay_2_do = 0;
    past_2 = millis();
    digitalWrite(relay_2_pin, relay_2 = 1);
  }
  if (Run_ON && relay_2 && millis() - past_2 >= relay_2_ON) {
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
  // #3 кнопка
  Do_1.loop(& func_ON );
}

 

iven83
Offline
Зарегистрирован: 02.02.2017

qwone пишет:

Вот 1 шаг разработки кода.

/*to_iven83.ino
  #1реле 1

  Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин)
*/
//#1реле 1
const byte relay_1_pin = 13;
bool relay_1;
const long relay_1_ON = 1000; // 1 сек
const long relay_1_OFF = 600000; // 10 мин
void setup() {
  //#1реле 1
  pinMode(relay_1_pin, OUTPUT);
  digitalWrite(relay_1_pin, relay_1 = 1);
}

void loop() {
  //#1реле 1
  static unsigned long past = 0;
  if (relay_1 && millis() - past >= relay_1_ON) {
    past = millis();
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
  if (!relay_1 && millis() - past >= relay_1_OFF) {
    past = millis();
    digitalWrite(relay_1_pin, relay_1 = 1);
  }
}

Это 2 шаг разработки кода

/*to_iven83.ino
  #1реле 1 ->13 (relay_1_pin)

  #2реле 1 ->11 (relay_2_pin)

  Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин)
                реле 2 (через 2 сек от вкл 1 реле вкл 2 реле и откл через 1 сек)
*/
//#1реле 1
const byte relay_1_pin = 13;
bool relay_1;
const long relay_1_ON = 1000; // 1 сек
const long relay_1_OFF = 600000; // 10 мин
//#2реле 2
const byte relay_2_pin = 11;
bool relay_2;
bool relay_2_do ;//
const unsigned long relay_2_do_ON = 2000; // 2 сек
const unsigned long relay_2_ON = 1000; // 1 сек

void setup() {
  //#1реле 1
  pinMode(relay_1_pin, OUTPUT);
  digitalWrite(relay_1_pin, relay_1 = 1);
  relay_2_do = 1;
  //#2реле 2
  pinMode(relay_2_pin, OUTPUT);
  digitalWrite(relay_2_pin, relay_2 = 0);
}

void loop() {
  //#1реле 1
  static unsigned long past_1 = 0;
  static unsigned long past_2 = 0;
  if (relay_1 && millis() - past_1 >= relay_1_ON) {
    past_1 = millis();
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
  if (!relay_1 && millis() - past_1 >= relay_1_OFF) {
    past_1 = millis();
    digitalWrite(relay_1_pin, relay_1 = 1);
    past_2 = millis();
    relay_2_do = 1;
  }
  //#2реле 2
  if (relay_2_do && millis() - past_2 >= relay_2_do_ON) {
    relay_2_do = 0;
    past_2 = millis();
    digitalWrite(relay_2_pin, relay_2 = 1);
  }
  if (relay_2 && millis() - past_2 >= relay_2_ON) {
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
}

Окончательный вариант полностью здесь https://yadi.sk/d/elyRWglV3DPRZm

Головной файл выкладываю 

/*to_iven83.ino https://yadi.sk/d/elyRWglV3DPRZm
  #1реле 1 ->13 (relay_1_pin)
  #2реле 2 ->11 (relay_2_pin)
  #3 кнопка -> 12 
  Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин)
                реле 2 (через 2 сек от вкл 1 реле вкл 2 реле и откл через 1 сек)
                кнопка включает или отключает перещелкивание реле
*/
unsigned long past_1 = 0;
unsigned long past_2 = 0;
//#1реле 1
const byte relay_1_pin = 13;
bool relay_1;
const long relay_1_ON = 1000; // 1 сек
const long relay_1_OFF = 600000; // 10 мин
//#2реле 2
const byte relay_2_pin = 11;
bool relay_2;
bool relay_2_do ;//
const unsigned long relay_2_do_ON = 2000; // 2 сек
const unsigned long relay_2_ON = 1000; // 1 сек
// #3 кнопка
#include "Cl_do_btn.h"
const byte btn1_pin = 12;
bool Run_ON = 1;// 1 идет работа  / 0 нет
Cl_do_btn Do_1; // создать
void func_ON() {
  Run_ON = ! Run_ON;
  if (Run_ON) {
    digitalWrite(relay_1_pin, relay_1 = 1);
    relay_2_do = 1;
    past_2 = past_1 = millis();
  }
  else
    digitalWrite(relay_1_pin, relay_1 = 0);
  digitalWrite(relay_2_pin, relay_2 = 0);
}
void setup() {
  //#1реле 1
  pinMode(relay_1_pin, OUTPUT);
  digitalWrite(relay_1_pin, relay_1 = 1);
  relay_2_do = 1;
  //#2реле 2
  pinMode(relay_2_pin, OUTPUT);
  digitalWrite(relay_2_pin, relay_2 = 0);
  // #3 кнопка
  Do_1.setup(btn1_pin);
}

void loop() {
  //#1реле 1
  if (Run_ON && relay_1 && millis() - past_1 >= relay_1_ON) {
    past_1 = millis();
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
  if (Run_ON && !relay_1 && millis() - past_1 >= relay_1_OFF) {
    past_1 = millis();
    digitalWrite(relay_1_pin, relay_1 = 1);
    past_2 = millis();
    relay_2_do = 1;
  }
  //#2реле 2
  if (Run_ON && relay_2_do && millis() - past_2 >= relay_2_do_ON) {
    relay_2_do = 0;
    past_2 = millis();
    digitalWrite(relay_2_pin, relay_2 = 1);
  }
  if (Run_ON && relay_2 && millis() - past_2 >= relay_2_ON) {
    digitalWrite(relay_1_pin, relay_1 = 0);
  }
  // #3 кнопка
  Do_1.loop(& func_ON );
}

 

Спасибо.

Но это без кнопки и pin11 не тухнет (после того, как загорелся диод, он уже не гаснет - только 13й пин моргает по заданной програме), а должен и 11й работать в таком режиме, как 13й)

iven83
Offline
Зарегистрирован: 02.02.2017

Код JasKo работает отлично, но у меня не хватает соображалки, чтоб вписать кнопку в код (((

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*to_iven83.ino "https://yadi.sk/d/elyRWglV3DPRZm" 
  #1реле 1 ->13 (relay_1_pin)
  #2реле 2 ->11 (relay_2_pin)
  #3 кнопка -> 12
  Принцип кода: реле 1 {вкл 1 сек, откл 600сек(10 мин)
                реле 2 (через 2 сек от вкл 1 реле вкл 2 реле и откл через 1 сек)
                кнопка включает или отключает перещелкивание реле
*/
unsigned long past_1 = 0;
unsigned long past_2 = 0;
//#1реле 1
const byte relay_1_pin = 4;
bool relay_1;
const long relay_1_ON = 500; // 1 сек
const long relay_1_OFF = 2000; // 10 мин
bool logic_1 = 1; // 0 прямая /1 инверсная
//#2реле 2
const byte relay_2_pin = 5;
bool relay_2;
bool relay_2_do ;//
const unsigned long relay_2_do_ON = 500; // 2 сек
const unsigned long relay_2_ON = 500; // 1 сек
bool logic_2 = 1; // 0 прямая /1 инверсная
// #3 кнопка
#include "Cl_do_btn.h"
const byte btn1_pin = 2;
bool Run_ON = 1;// 1 идет работа  / 0 нет
Cl_do_btn Do_1; // создать
void func_ON() {
  Run_ON = ! Run_ON;
  if (Run_ON) {
    relay_1 = 1;
    digitalWrite(relay_1_pin, relay_1 ^ logic_1);
    relay_2_do = 1;
    past_2 = past_1 = millis();
  }
  else {
    relay_1 = 0;
    relay_2 = 0;
    digitalWrite(relay_1_pin, relay_1 ^ logic_1);
    digitalWrite(relay_2_pin, relay_2 ^ logic_2);
  }
}
void setup() {
  //#1реле 1
  pinMode(relay_1_pin, OUTPUT);
  relay_1 = 1;
  digitalWrite(relay_1_pin, relay_1 ^ logic_1);
  relay_2_do = 1;
  //#2реле 2
  pinMode(relay_2_pin, OUTPUT);
  relay_2 = 0;
  digitalWrite(relay_2_pin, relay_2 ^ logic_2 );
  // #3 кнопка
  Do_1.setup(btn1_pin);
}

void loop() {
  //#1реле 1
  if (Run_ON && relay_1 && millis() - past_1 >= relay_1_ON) {
    past_1 = millis();
    relay_1 = 0;
    digitalWrite(relay_1_pin, relay_1 ^ logic_1);
  }
  if (Run_ON && !relay_1 && millis() - past_1 >= relay_1_OFF) {
    past_1 = millis();
    relay_1 = 1;
    digitalWrite(relay_1_pin, relay_1 ^ logic_1);
    past_2 = millis();
    relay_2_do = 1;
  }
  //#2реле 2
  if (Run_ON && relay_2_do && millis() - past_2 >= relay_2_do_ON) {
    relay_2_do = 0;
    past_2 = millis();
    relay_2 = 1;
    digitalWrite(relay_2_pin, relay_2 ^ logic_2);
  }
  if (Run_ON && relay_2 && millis() - past_2 >= relay_2_ON) {
    relay_2 = 0;
    digitalWrite(relay_2_pin, relay_2 ^ logic_2);
  }
  // #3 кнопка
  Do_1.loop(& func_ON );
}

Немного поправил. Добавил логику при которой вкл реле. В общем верни ноги как вам надо и тайминги времени

 

iven83
Offline
Зарегистрирован: 02.02.2017

Триждый проверил - ругается при компиляции на целую страницу

Arduino: 1.8.2 Hourly Build 2017/02/03 04:03 (Windows 7), Плата:"Arduino/Genuino Uno"
 
D:\arduino-nightly\arduino-builder -dump-prefs -logger=machine -hardware D:\arduino-nightly\hardware -tools D:\arduino-nightly\tools-builder -tools D:\arduino-nightly\hardware\tools\avr -built-in-libraries D:\arduino-nightly\libraries -libraries C:\Users\Admin\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=0X2341_0X0001 -ide-version=10802 -build-path C:\Users\Admin\AppData\Local\Temp\arduino_build_610468 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=D:\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=D:\arduino-nightly\hardware\tools\avr -verbose C:\Users\Admin\Desktop\Rele_slojno2\Rele_slojno2.ino
D:\arduino-nightly\arduino-builder -compile -logger=machine -hardware D:\arduino-nightly\hardware -tools D:\arduino-nightly\tools-builder -tools D:\arduino-nightly\hardware\tools\avr -built-in-libraries D:\arduino-nightly\libraries -libraries C:\Users\Admin\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=0X2341_0X0001 -ide-version=10802 -build-path C:\Users\Admin\AppData\Local\Temp\arduino_build_610468 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=D:\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=D:\arduino-nightly\hardware\tools\avr -verbose C:\Users\Admin\Desktop\Rele_slojno2\Rele_slojno2.ino
Using board 'uno' from platform in folder: D:\arduino-nightly\hardware\arduino\avr
Using core 'arduino' from platform in folder: D:\arduino-nightly\hardware\arduino\avr
Detecting libraries used...
"D:\arduino-nightly\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-ID:\arduino-nightly\hardware\arduino\avr\cores\arduino" "-ID:\arduino-nightly\hardware\arduino\avr\variants\standard" "C:\Users\Admin\AppData\Local\Temp\arduino_build_610468\sketch\Rele_slojno2.ino.cpp" -o "nul"
"D:\arduino-nightly\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-ID:\arduino-nightly\hardware\arduino\avr\cores\arduino" "-ID:\arduino-nightly\hardware\arduino\avr\variants\standard" "C:\Users\Admin\AppData\Local\Temp\arduino_build_610468\sketch\Rele_slojno2.ino.cpp" -o "C:\Users\Admin\AppData\Local\Temp\arduino_build_610468\preproc\ctags_target_for_gcc_minus_e.cpp"
C:\Users\Admin\Desktop\Rele_slojno2\Rele_slojno2.ino:25:23: fatal error: Cl_do_btn.h: No such file or directory
 
 #include "Cl_do_btn.h"
 
                       ^
 
compilation terminated.
 
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
iven83
Offline
Зарегистрирован: 02.02.2017

Предыдущая версия компилировалась и грузилась на плату без проблем...

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

Так головной замените, а библиотеки оставь прежние.Без библиотек не работает. Что опять пакет в яндекс диск кидать вам.

https://yadi.sk/d/7YIRJGb33DPsaz

JasKo
Offline
Зарегистрирован: 21.11.2015

iven83 если мой код тебе более понятен, то вот вариант с кнопкой

#define BUTTON  2 // кнопка на втором пин, при нажатии кнопка подключает пин к общему проводу.
#define RELAY1  10
#define RELAY2  11
#define ONTIME 500
#define OFFTIME 5000
#define PAUSE 1000
#define ON  1      // если реле управляются высоким уровнем то ON= 1 OFF=0
#define OFF 0      // если реле управляется низким уровнем то поставить ON=0 OFF=1
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean relayRUN = true; //Если true - щелкаем релюшками, если false отключаем релюшки и ждем следующего нажатия на кнопку
unsigned long timeRelay1 = -99999;
unsigned long timeRelay2 = -99999;

boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);
  if (last != current)
  {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
  }
}

void setup() {
  pinMode (BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH); // Включаем внутреннее подтягивающее сопротивление нажатие кнопки соответсветсвуте LOW
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, OFF);
  digitalWrite(RELAY2, OFF);
}
void loop() {

  currentButton = debounce(lastButton);
  if (lastButton == HIGH && currentButton == LOW) //Если кнопка нажата то на ней будет низкий уровень
  {
    relayRUN = !relayRUN;
  }
  lastButton = currentButton;
  if (relayRUN) {
    if ( digitalRead(RELAY1) == ON) {
      if ( millis() - timeRelay1 >= ONTIME) { // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
        digitalWrite(RELAY1, OFF);
        timeRelay1 = millis();
      }
    } else {
      if (millis() - timeRelay1 >= OFFTIME) { // если реле 1 выключено проверяем 10 мин. и включаем если время прошло
        digitalWrite(RELAY1, ON);
        timeRelay1 = millis();
      }
    }
    if (digitalRead(RELAY2) == ON) {
      if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем
        digitalWrite(RELAY2, OFF);
        timeRelay2 = millis();
      }
    } else {
      unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек.
      if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))) {
        digitalWrite(RELAY2, ON);
        timeRelay2 = curentTime;
      }
    }
  } else {
    digitalWrite(RELAY1, OFF);
    digitalWrite(RELAY2, OFF);
  }
}

 

iven83
Offline
Зарегистрирован: 02.02.2017

qwone пишет:

Так головной замените, а библиотеки оставь прежние.Без библиотек не работает. Что опять пакет в яндекс диск кидать вам.

https://yadi.sk/d/7YIRJGb33DPsaz

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

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

Спасибо большое за оказанную помощь в освоении абсолютно новой для меня науки. 

iven83
Offline
Зарегистрирован: 02.02.2017

JasKo пишет:

iven83 если мой код тебе более понятен, то вот вариант с кнопкой

#define BUTTON  2 // кнопка на втором пин, при нажатии кнопка подключает пин к общему проводу.
#define RELAY1  10
#define RELAY2  11
#define ONTIME 500
#define OFFTIME 5000
#define PAUSE 1000
#define ON  1      // если реле управляются высоким уровнем то ON= 1 OFF=0
#define OFF 0      // если реле управляется низким уровнем то поставить ON=0 OFF=1
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean relayRUN = true; //Если true - щелкаем релюшками, если false отключаем релюшки и ждем следующего нажатия на кнопку
unsigned long timeRelay1 = -99999;
unsigned long timeRelay2 = -99999;

boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);
  if (last != current)
  {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
  }
}

void setup() {
  pinMode (BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH); // Включаем внутреннее подтягивающее сопротивление нажатие кнопки соответсветсвуте LOW
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, OFF);
  digitalWrite(RELAY2, OFF);
}
void loop() {

  currentButton = debounce(lastButton);
  if (lastButton == HIGH && currentButton == LOW) //Если кнопка нажата то на ней будет низкий уровень
  {
    relayRUN = !relayRUN;
  }
  lastButton = currentButton;
  if (relayRUN) {
    if ( digitalRead(RELAY1) == ON) {
      if ( millis() - timeRelay1 >= ONTIME) { // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
        digitalWrite(RELAY1, OFF);
        timeRelay1 = millis();
      }
    } else {
      if (millis() - timeRelay1 >= OFFTIME) { // если реле 1 выключено проверяем 10 мин. и включаем если время прошло
        digitalWrite(RELAY1, ON);
        timeRelay1 = millis();
      }
    }
    if (digitalRead(RELAY2) == ON) {
      if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем
        digitalWrite(RELAY2, OFF);
        timeRelay2 = millis();
      }
    } else {
      unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек.
      if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))) {
        digitalWrite(RELAY2, ON);
        timeRelay2 = curentTime;
      }
    }
  } else {
    digitalWrite(RELAY1, OFF);
    digitalWrite(RELAY2, OFF);
  }
}

 

 

Спасибо! Обязательно завтра испытаю. Сегодня уже просто мозг взрывается от количества полученной информации и попытки её обработать (параллельно с программированием пытаюсь осваивать и электронику). 

О результате обязательно отпишусь. 

iven83
Offline
Зарегистрирован: 02.02.2017

JasKo пишет:

iven83 если мой код тебе более понятен, то вот вариант с кнопкой

#define BUTTON  2 // кнопка на втором пин, при нажатии кнопка подключает пин к общему проводу.
#define RELAY1  10
#define RELAY2  11
#define ONTIME 500
#define OFFTIME 5000
#define PAUSE 1000
#define ON  1      // если реле управляются высоким уровнем то ON= 1 OFF=0
#define OFF 0      // если реле управляется низким уровнем то поставить ON=0 OFF=1
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean relayRUN = true; //Если true - щелкаем релюшками, если false отключаем релюшки и ждем следующего нажатия на кнопку
unsigned long timeRelay1 = -99999;
unsigned long timeRelay2 = -99999;

boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);
  if (last != current)
  {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
  }
}

void setup() {
  pinMode (BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH); // Включаем внутреннее подтягивающее сопротивление нажатие кнопки соответсветсвуте LOW
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, OFF);
  digitalWrite(RELAY2, OFF);
}
void loop() {

  currentButton = debounce(lastButton);
  if (lastButton == HIGH && currentButton == LOW) //Если кнопка нажата то на ней будет низкий уровень
  {
    relayRUN = !relayRUN;
  }
  lastButton = currentButton;
  if (relayRUN) {
    if ( digitalRead(RELAY1) == ON) {
      if ( millis() - timeRelay1 >= ONTIME) { // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
        digitalWrite(RELAY1, OFF);
        timeRelay1 = millis();
      }
    } else {
      if (millis() - timeRelay1 >= OFFTIME) { // если реле 1 выключено проверяем 10 мин. и включаем если время прошло
        digitalWrite(RELAY1, ON);
        timeRelay1 = millis();
      }
    }
    if (digitalRead(RELAY2) == ON) {
      if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем
        digitalWrite(RELAY2, OFF);
        timeRelay2 = millis();
      }
    } else {
      unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек.
      if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))) {
        digitalWrite(RELAY2, ON);
        timeRelay2 = curentTime;
      }
    }
  } else {
    digitalWrite(RELAY1, OFF);
    digitalWrite(RELAY2, OFF);
  }
}

 

Компилируется - уже хорошо! ))) 

iven83
Offline
Зарегистрирован: 02.02.2017

JasKo пишет:

iven83 если мой код тебе более понятен, то вот вариант с кнопкой

#define BUTTON  2 // кнопка на втором пин, при нажатии кнопка подключает пин к общему проводу.
#define RELAY1  10
#define RELAY2  11
#define ONTIME 500
#define OFFTIME 5000
#define PAUSE 1000
#define ON  1      // если реле управляются высоким уровнем то ON= 1 OFF=0
#define OFF 0      // если реле управляется низким уровнем то поставить ON=0 OFF=1
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean relayRUN = true; //Если true - щелкаем релюшками, если false отключаем релюшки и ждем следующего нажатия на кнопку
unsigned long timeRelay1 = -99999;
unsigned long timeRelay2 = -99999;

boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);
  if (last != current)
  {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
  }
}

void setup() {
  pinMode (BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH); // Включаем внутреннее подтягивающее сопротивление нажатие кнопки соответсветсвуте LOW
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, OFF);
  digitalWrite(RELAY2, OFF);
}
void loop() {

  currentButton = debounce(lastButton);
  if (lastButton == HIGH && currentButton == LOW) //Если кнопка нажата то на ней будет низкий уровень
  {
    relayRUN = !relayRUN;
  }
  lastButton = currentButton;
  if (relayRUN) {
    if ( digitalRead(RELAY1) == ON) {
      if ( millis() - timeRelay1 >= ONTIME) { // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
        digitalWrite(RELAY1, OFF);
        timeRelay1 = millis();
      }
    } else {
      if (millis() - timeRelay1 >= OFFTIME) { // если реле 1 выключено проверяем 10 мин. и включаем если время прошло
        digitalWrite(RELAY1, ON);
        timeRelay1 = millis();
      }
    }
    if (digitalRead(RELAY2) == ON) {
      if (millis() - timeRelay2 >= ONTIME) { // если реле 2 включно проверяем 1 сек и выключаем
        digitalWrite(RELAY2, OFF);
        timeRelay2 = millis();
      }
    } else {
      unsigned long curentTime = millis(); // если реле 2 выключено и реле 1 выключено 1сек назад и прошло 10 мин с момента выключения реле 2, то включаем реле 2 на 1 сек.
      if ((curentTime - timeRelay2 >= OFFTIME) && ((digitalRead(RELAY1) == OFF) && (curentTime - timeRelay1 >= PAUSE))) {
        digitalWrite(RELAY2, ON);
        timeRelay2 = curentTime;
      }
    }
  } else {
    digitalWrite(RELAY1, OFF);
    digitalWrite(RELAY2, OFF);
  }
}

 

Не выдержал, проверил - всё замечательно работает!!! ))) 

Большущее спасибо!

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

Если получится что-то интересно, обязательно буду выкладывать сдесь. 

iven83
Offline
Зарегистрирован: 02.02.2017

Подскажите пожалуйста из-за чего через какое-то время работа цикла может останавливаться? 

Не знаю, это в "железе" или программная проблема (((. 

Сегодня запускал котёл уже с ардуинкой - работало отлично, но через несколько часов заметил, что магниты не срабатывают. Проверил конструцкию - всё вроди без изменений, но сигнал не подаётся (. Все контакты пропаивал - там врди не должно быть проблем. Да и после "передёргивания" питания и нажатия кнопки всё опять работает отлично. Но такой вариант, когда она сама по себе остановилась, мне не нравится. 

Запитано через два обычных реле (не твердотельных), но вроди перегрузки на пины быть не должно. Запитал от зарядного с мобильного телефона - написано на выходе 5 В - подключил через гнездо USB... Не знаю в чём может быть проблема (. 

Encrypt
Offline
Зарегистрирован: 21.02.2017

iven83 пишет:
Подскажите пожалуйста из-за чего через какое-то время работа цикла может останавливаться?

Возможно БП слабый или не качественный. Кроме этого, нужно запитать реле не от пинов ардуино, а напрямую от БП. 

 

iven83
Offline
Зарегистрирован: 02.02.2017

Encrypt пишет:

iven83 пишет:
Подскажите пожалуйста из-за чего через какое-то время работа цикла может останавливаться?

Возможно БП слабый или не качественный. Кроме этого, нужно запитать реле не от пинов ардуино, а напрямую от БП. 

 

Спасибо за ответ. 

Сегодня опытным путём выяснил, что какой-то "мутный" этот блок - на этом скетче иногда мигает один из диодов, а на ИК управлении данные с пульта постоянно разные приходят.