12

Arduino (Wemos D1 m1 v3.0) и 3 реле

Есть Wemos D1 и 3 реле. Прошу помощи в написании скетча, вот что я хочу:
Реле №1 (подключено к пину D4) включается на 15 минут, выключается на 45 минут;
Реле №2 (подключено к пину D3) включается на 2 часа, выключается на 4 часа;
Реле №3 (подключено к пину D2) включается на 8 часов, выключается на 16 часов.
Для одного реле написал скетч сам при помощи delay, а как для трёх реле реализовать?

Схема работы

Arduino/Ардуино проекты

19 постов466 подписчиков

Правила сообщества

— Не оскорблять администрацию.

— Не оскорблять других участников.

— Не затрагивать тему политики.

— Не материться!

— Не допускаются расистские высказывания, сексизм, национализм.

— Запрещена реклама сторонних проектов, товаров, сайтов, блогов, ютуб каналов.

— Нельзя публиковать картинки и комментарии явно сексуального характера.

— Нет спаму и фишингу!

Вы смотрите срез комментариев. Показать все
8
Автор поста оценил этот комментарий

На каждое реле заводишь:
1. В какое время надо ему поменять состояние (next_change)
2. Текущее состояние (state)
Рассмотрим на примере первого

изначально state_1 = 0, next_change_1 = 0
Дальше в update

if (millis() > next_change_1)
{

    state_1 = 1 - state_1;
    if (state_1 == 1) next_change = millis() + 15 * 60 * 1000; // выключить через 15 минут

    else next_change = millis() + 45 * 60 * 1000; // включить через 45 минут

}

ну и в конце update в нужный пин пишешь соответствующее state
и так по всем реле

раскрыть ветку (7)
3
Автор поста оценил этот комментарий

Может не надо каждую итерацию пины дергать даже без изменения?

раскрыть ветку (1)
5
Автор поста оценил этот комментарий

ЕМНИП, он переключаться же не будет. А то что пару лишних тактов потратим на вызовы, в данном случае некритично

2
Автор поста оценил этот комментарий

Вот так ?


int relay1 = D4;//реле 1
int relay2 = D3;//реле 2
int relay3 = D2;//реле 3
int state_1 = 0;
int next_change_1 = 0;

int state_2 = 0;
int next_change_2 = 0;

int state_3 = 0;
int next_change_3 = 0;



void setup() {

pinMode(relay1, OUTPUT);//реле 1

pinMode(relay2, OUTPUT);//реле 2

pinMode(relay3, OUTPUT);//реле 3

}


void loop() {

if (millis() > next_change_1)

{

state_1 = 1 - state_1;

if (state_1 == 1) next_change_1 = millis() + 15 * 60 * 1000; // выключить через 15 минут

digitalWrite(relay1, HIGH);

else next_change_1 = millis() + 45 * 60 * 1000; // включить через 45 минут digitalWrite(relay1, LOW);

}

if (millis() > next_change_2)

{

state_2 = 1 - state_2;

if (state_2 == 1) next_change_2 = millis() + 15 * 60 * 1000; // выключить через 15 минут

digitalWrite(relay2, HIGH);

else next_change_2 = millis() + 45 * 60 * 1000; // включить через 45 минут digitalWrite(relay2, LOW);

}

if (millis() > next_change_3)

{

state_2 = 1 - state_3;

if (state_3 == 1) next_change_3 = millis() + 15 * 60 * 1000; // выключить через 15 минут

digitalWrite(relay3, HIGH);

else next_change_3 = millis() + 45 * 60 * 1000; // включить через 45 минут digitalWrite(relay3, LOW);

}

раскрыть ветку (4)
5
Автор поста оценил этот комментарий
if (state_1 == 1)
next_change_1 = millis() + 15 * 60 * 1000;
digitalWrite(relay1, HIGH);
else
next_change_1 = millis() + 45 * 60 * 1000;
digitalWrite(relay1, LOW);

Разве не должны быть {} в блоках if и else?

Плюс с учетом вот этого из документации по millis():

This number will overflow (go back to zero), after approximately 50 days.
millis() в какой-то момент обнулится и теоретически можно так никогда и не дождаться next_change.

раскрыть ветку (2)
4
Автор поста оценил этот комментарий

Да, есть проблема с wrap-ом millis, проще всего она решается профилактическим ребутом раз в сутки, скажем.
Но можно и логикой порешать, чуть сложнее будет

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Лучше, конечно, логикой. А еще лучше всё через SetInterval делать (если он там есть нативный "библиотечный"), чтобы процессорное время не тратить.

3
Автор поста оценил этот комментарий

Да, примерно так, только если сразу при изменении стейта писать в пин -  {} нужны

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку