#1 2019-09-12 09:46:57

Alexs
Учасник
Зареєстрований: 2019-09-12
Повідомлень: 8

Как подключить 2 реле и задать им разное время включения?

У меня к одной ардуине подключено 2 реле. Нужно, чтобы одно включалось и выключалось 1 раз в сутки, а другое - каждые пол часа. Но время просто суммируется и оба реле включаются и выключаются раз в сутки + полчаса. Есть возможность разделить?
#define PIN_RELAY1 5
#define PIN_RELAY2 3

void setup()
{
  pinMode(PIN_RELAY1, OUTPUT);
  digitalWrite(PIN_RELAY1, HIGH);
  pinMode(PIN_RELAY2, OUTPUT);
  digitalWrite(PIN_RELAY2, HIGH);
}
void loop()
{
  digitalWrite(PIN_RELAY1, LOW);
  delay(43200000);
  digitalWrite(PIN_RELAY1, HIGH);
  delay(43200000);
  digitalWrite(PIN_RELAY2, LOW);
  delay(300000);
  digitalWrite(PIN_RELAY2, HIGH);
  delay(1800000);
}

Неактивний

#2 2019-09-12 10:41:50

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Как подключить 2 реле и задать им разное время включения?

Так составь правильное расписание своих событий и вставляй не какие попало делэи, а по расписанию

Неактивний

#3 2019-09-12 10:54:22

Alexs
Учасник
Зареєстрований: 2019-09-12
Повідомлень: 8

Re: Как подключить 2 реле и задать им разное время включения?

Подскажите, пожалуйста, как это сделать?

Неактивний

#4 2019-09-12 12:28:58

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 823

Re: Как подключить 2 реле и задать им разное время включения?

Alexs пише:

Подскажите, пожалуйста, как это сделать?

раз в сутки ---  в определенное время или тут без разницы ???

Неактивний

#5 2019-09-12 13:51:34

Alexs
Учасник
Зареєстрований: 2019-09-12
Повідомлень: 8

Re: Как подключить 2 реле и задать им разное время включения?

Раз в сутки не важно, главное выдержать заданное время.

Остання редакція Alexs (2019-09-12 13:52:12)

Неактивний

#6 2019-09-12 17:50:06

Кирилл000
Учасник
Зареєстрований: 2019-09-09
Повідомлень: 5

Re: Как подключить 2 реле и задать им разное время включения?

Всем здравствуйте.
Тут даже я понимаю, что ваш код работает не так, как вы задумали. Если я правильно понимаю, то у вас сперва подаётся низкий уровень на реле 1, после этого контроллер НЕ делает ничего, кроме как мотает делаем 43200000, потом ставит высокий уровень, точно также не делает ничего, кроме как опять же выжидает 43200000 и ТОЛЬКО после этих двух периодов  начинает работать с вторым реле.
С моей точки зрения, наверное стоит поступить так:
перекинуть значение первого реле, перекинуть значение второго реле и поставить его работу в цикл FOR, для 24 часов надо поставить счет 48. И после окончания этого счетчика перекинуть состояние первого реле в противоположное и повторить цикл FOR на заданные промежутки.
Я совсем новичок в этом деле, но читал что дэлай на большую выдержку это совсем зло.
Второй вариант как мне видится - использовать таймеры. пока не умею, но гугл знает об этом много.
третий вариан использовать функцию миллис (?).
Скорее всего меня сейчас во многом поправят, но это даже хорошо.
Функцию миллис также весьма просто загуглить.

Неактивний

#7 2019-09-12 18:53:48

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 823

Re: Как подключить 2 реле и задать им разное время включения?

Alexs пише:

Раз в сутки не важно, главное выдержать заданное время.

так НЕ ВАЖНО или ЗАДАННОЕ ВРЕМЯ ?!?!?!?

Вы можете нормально объяснить задачу ?!?!?!?

Неактивний

#8 2019-09-12 21:04:09

Alexs
Учасник
Зареєстрований: 2019-09-12
Повідомлень: 8

Re: Как подключить 2 реле и задать им разное время включения?

Всем спасибо за ответы!
Нашёл решение у AlexGyver. Слепил из двух кусочков. Проверял на секундах - вроде работает, но только со второго периода. Вот если кому интересно.
#define RELAY1 3
#define RELAY2 5
#define PERIOD_1 86400000    // период первой задачи
#define PERIOD_2 1800000   // период второй задачи

unsigned long timer_1, timer_2, timer_3;
void setup() {
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
}
  if (millis() - timer_1 > PERIOD_1) {    // условие таймера
    timer_1 = millis();                   // сброс таймера
    uint32_t now = millis();
while (millis () - now < 36000000) {
digitalWrite(RELAY1, HIGH)
}
digitalWrite(RELAY1, LOW)
  }
  if (millis() - timer_2 > PERIOD_2) {
    timer_2 = millis();
uint32_t now2 = millis();
while (millis () - now2 < 300000) {
digitalWrite(RELAY2, HIGH)
}
digitalWrite(RELAY2, LOW)
  }
}

Остання редакція Alexs (2019-09-12 21:08:45)

Неактивний

#9 2019-09-12 22:53:18

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 82

Re: Как подключить 2 реле и задать им разное время включения?

Гайвер? ФИ!!!! Уж лучше на ардуиновской библиотеке

#include <SimpleTimer.h>

#define RELAY1 3
#define RELAY2 5
#define PERIOD_1 86400000    // период первой задачи
#define PERIOD_2 1800000     // период второй задачи


SimpleTimer timer1;
SimpleTimer timer2;

void rele_1() {
  digitalWrite(RELAY1, !digitalRead(RELAY1));
}

void rele_2() {
  digitalWrite(RELAY2, !digitalRead(RELAY2));
}

void setup() {

  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);

//  digitalWrite(RELAY1,HIGH);         // если нужно задаем
//  digitalWrite(RELAY2,HIGH);         // начальное состояние реле при старте
  
  timer1.setInterval(PERIOD_1, rele_1);
  timer2.setInterval(PERIOD_2, rele_2);
}

void loop() {
  timer1.run();
  timer2.run();
}

Неактивний

#10 2019-09-13 00:25:02

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Как подключить 2 реле и задать им разное время включения?

Если Вы посмотрите во внутрь https://github.com/jfturcot/SimpleTimer/blob/master/SimpleTimer.cpp
То увидите там тот же millis() и еще не совсем понятный код.


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

Остання редакція Avazart (2019-09-13 00:30:26)

Неактивний

#11 2019-09-13 11:28:41

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Как подключить 2 реле и задать им разное время включения?

Alexs пише:

Нашёл решение у AlexGyver.

Ну, да, с общеизвестным, фирменным гиверовским ляпом на который ему уже устали указывать, а он всё никак его не подправит smile

Неактивний

#12 2019-09-13 22:38:54

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Как подключить 2 реле и задать им разное время включения?

Kaka, Вы что имеете ввиду?

Неактивний

#13 2019-09-14 08:26:32

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Как подключить 2 реле и задать им разное время включения?

Постоянное подвирание на 1 - http://arduino.ru/forum/programmirovanie/neskolko-interesnykh-i-poleznykh-bibliotek#comment-393723

Неактивний

#14 2019-09-14 09:54:20

Alexs
Учасник
Зареєстрований: 2019-09-12
Повідомлень: 8

Re: Как подключить 2 реле и задать им разное время включения?

Да, но в том коде, что я у него взял, библиотеки вообще не участвуют

Неактивний

#15 2019-09-14 11:18:58

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Как подключить 2 реле и задать им разное время включения?

Причём тут библиотеки участвуют или нет? Ошибка в этом коде точно такая же, как и ошибка в коде той библиотеки. И также время подвирает. Просто человек так пишет.

Остання редакція Kaka (2019-09-14 11:19:23)

Неактивний

#16 2019-09-14 11:20:19

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 823

Re: Как подключить 2 реле и задать им разное время включения?

Alexs пише:

Да, но в том коде, что я у него взял, библиотеки вообще не участвуют

То, что вы вырвали http://forum.arduino.ua/viewtopic.php?pid=29162#p29162 (пост #8) может в исходной программе и работает.
Но в том виде который вы привели это просто набор символов.

У вас получилось из этого решить свою задачу ?

Неактивний

#17 2019-09-14 11:48:02

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Как подключить 2 реле и задать им разное время включения?

Как по мне это придирка это не существенно ибо точность такого метода замера все равно желает лучшего.
Там где нужна точность ms стоит использовать реальный таймер + прерывания.
Да new кажется в Arduino не стоит использовать.

Думаю есть более серьезные вещи достойные критики.
Например Си стайл кода, когда пишем то на С++.

Библиотека для кнопок и энкодера у меня вызывает улыбку. Лично я не считаю что для таких вещей стоит писать библиотеки.
Уж больно их обработка может разнится от проекта к проекту.
Естественно что бы не было нагромождения можно выводить код в отделньные модули / классы но что бы презентовать как ....

Остання редакція Avazart (2019-09-14 12:53:33)

Неактивний

#18 2019-09-14 12:41:52

Alexs
Учасник
Зареєстрований: 2019-09-12
Повідомлень: 8

Re: Как подключить 2 реле и задать им разное время включения?

То, что вы вырвали http://forum.arduino.ua/viewtopic.php?pid=29162#p29162 (пост #8) может в исходной программе и работает.
Но в том виде который вы привели это просто набор символов.

У вас получилось из этого решить свою задачу ?

Да, всё чётко работает. Даже если точность +- минута, меня всё-равно устраивает

Неактивний

#19 2019-09-14 12:58:54

Alexs
Учасник
Зареєстрований: 2019-09-12
Повідомлень: 8

Re: Как подключить 2 реле и задать им разное время включения?

ard125 пише:

Гайвер? ФИ!!!! Уж лучше на ардуиновской библиотеке

#include <SimpleTimer.h>

#define RELAY1 3
#define RELAY2 5
#define PERIOD_1 86400000    // период первой задачи
#define PERIOD_2 1800000     // период второй задачи


SimpleTimer timer1;
SimpleTimer timer2;

void rele_1() {
  digitalWrite(RELAY1, !digitalRead(RELAY1));
}

void rele_2() {
  digitalWrite(RELAY2, !digitalRead(RELAY2));
}

void setup() {

  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);

//  digitalWrite(RELAY1,HIGH);         // если нужно задаем
//  digitalWrite(RELAY2,HIGH);         // начальное состояние реле при старте
  
  timer1.setInterval(PERIOD_1, rele_1);
  timer2.setInterval(PERIOD_2, rele_2);
}

void loop() {
  timer1.run();
  timer2.run();
}

Хорошо. А как она мне отключит реле в течение суток на 10 часов? А для второго реле включит на 5 минут?

Остання редакція Alexs (2019-09-14 13:00:08)

Неактивний

#20 2019-09-14 13:18:54

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 82

Re: Как подключить 2 реле и задать им разное время включения?

Вам нужно было раз в сутки и раз в 30 минут. Откуда взялось 10 ч и 5 минут? Для начала объясните подробно и точно что нужно делать. Ну и посмотрите примеры и описание библиотеки https://playground.arduino.cc/Code/SimpleTimer/

Неактивний

#21 2019-09-14 14:02:08

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 823

Re: Как подключить 2 реле и задать им разное время включения?

Неактивний

#22 2019-09-14 14:15:54

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Как подключить 2 реле и задать им разное время включения?

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


Можно писать более человеко-читаемо:

typedef unsigned long ulong;

const ulong period_1= 24*60*60*1000UL; // 24 часа
const ulong period_2=    30*60*1000UL; // 30 мин

Остання редакція Avazart (2019-09-14 14:44:13)

Неактивний

#23 2019-09-14 15:44:07

Alexs
Учасник
Зареєстрований: 2019-09-12
Повідомлень: 8

Re: Как подключить 2 реле и задать им разное время включения?

ard125 пише:

Вам нужно было раз в сутки и раз в 30 минут. Откуда взялось 10 ч и 5 минут? Для начала объясните подробно и точно что нужно делать. Ну и посмотрите примеры и описание библиотеки https://playground.arduino.cc/Code/SimpleTimer/

Виноват. Подумал, что тут умеют читать мысли.
Надо чтобы раз в сутки одно реле включалось на 10 часов, остальное время оно выключено. А второе выключалось на 5 минут в течение каждых 30 минут, а остальные 25 минут оно включено.

Неактивний

#24 2019-09-14 15:47:07

Watchdog
Гість

Re: Как подключить 2 реле и задать им разное время включения?

Avazart пише:

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

Это может показаться, для вас, странным но некоторые люди умеют соображать сами. lol

#25 2019-09-14 16:09:26

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Как подключить 2 реле и задать им разное время включения?

/**/
class cl_aaa {
  protected:
    byte pin;
    static const byte sON = 0; // состояние вкл
    static const byte sOFF = 1; // состояние выкл
    unsigned long time1, time, past;
    byte state;
    void set(byte s) {
      past = millis();
      state = s;
      if (state == sON) digitalWrite(pin, HIGH);
      else digitalWrite(pin, LOW);
    }
  public:
    cl_aaa(byte p, unsigned long t1, unsigned long t): pin(p), time1(t1), time(t) {}
    void init() {
      pinMode(pin, OUTPUT);
      set(sON);
    }
    void run() {
      if (state == sON && millis() - past >= time1)set(sOFF);
      if (state == sOFF && millis() - past >= (time - time1))set(sON);
    }
};

cl_aaa aaa1(/*пин*/13,/*время вкл*/(unsigned long )500,/*время цикла*/(unsigned long )1000);
cl_aaa aaa2(/*пин*/12,/*время вкл*/(unsigned long )1000,/*время цикла*/(unsigned long )2000);
//----------------------------------------------------
void setup() {
  aaa1.init();
  aaa2.init();
}
void loop() {
  aaa1.run();
  aaa2.run();
}

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму