• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Esp8266 + дисплей +энкодер + датчики

В верхней функции возможно ошибка копи-пасте.
Например такие условия:
Включено реле 1 и (реле 2 или реле 3 или реле 4)
Код такой будет или нагородил?
if (relay1_on && (relay2_on || relay3_on || relay4_on))
У меня четыре реле в устройстве, главное - реле 1, и три реле ТЭНов.
Пятое устройство это твердотельное реле, но я его считаю просто НАСОСом.
Получается, мне нужно чтобы насос включился когда включено главное реле и любое из реле 2,3,4 по отдельности или все разом или два любых.
 

CodeNameHawk

Moderator
Команда форума
Делайте как хотите, важно чтобы работало.
Если не хотите делать, что советую, зачем тогда спрашивать?
 
Если не хотите делать, что советую, зачем тогда спрашивать?
Не сочтите за наглость, но советов не было, вернее советы, из разряда "что то там сделай" - были, но можно было и кодом это показать.
В моем коде, по ссылке ниже.
Логику преследую следующую:
при подключенных датчиках SensorsOK = 1 и если нужная температура temp_set за минусом гистерезиса вЫше чем измеренная температура с датчиков, то включаются четыре реле, главное relay1_on и три реле ТЭНов relay2_on ,relay3_on и relay4_on
Дальше по условию, если все реле включены разом, то формируется флаг nasosFlagOn в 1.
Дальше по условию стартует millis и по достижению 4 секунд должен выключиться насос relay5_on = 1.
...
Обратный процесс, когда температура достигла нужной, и реле 2,3 и 4 отключаются, включено только главное реле 1.
Через главное реле апаратно включаются три реле ТЭНов и реле насоса.
Это у меня в железе задано, чтобы все включения были при условии работы главного реле, с этим понятно.
По условию, когда реле 2,3 и 4 отключены, формируется флаг nasosFlagOff в 1 и запускается millis и через 10 секунд должен отключится насос.
...
По итогу код работает иначе - при инициализации устройства, датчики подключены, температура нужная ниже измеренной и включаются четыре реле 1,2,3,4 в работу, насос включается через 4 секунды.
Когда температура достигла заданной реле 2,3,4 отключаются и одновременно с ними отключается и реле 5(насос).
Снова когда температура выше измеренной, включаются реле 2,3,4 и одновременно с ними включается и реле 5(насос)
То есть код работает только единожды на включении устройства и то наполовину...20:32
 

CodeNameHawk

Moderator
Команда форума
но советов не было
Нет комментариев, вот и не можете понять.
А это что?
Давайте я вам подробно объясню, если подробно и вдумчиво напишите комментарии к каждой строке, кода выше того моего сообщения, то вполне вероятно, что найдете причину, почему код не работает. (Или мне будет более понятно, что вы там пытались сделать.)
И да не забудьте про вторую подсказку.
все будет зависеть от скрытого кода.
Поясняю, скрытый код, это код который вы не выложили, но который влияет на работу включения реле.
 
Поясняю, скрытый код, это код который вы не выложили, но который влияет на работу включения реле.
Какой скрытый код, вы о чем?
Если речь про остальной код - да его там портянка, но кроме как добавление функции relayControl(); в остальной код их не связывает ничего.
Написал логику, как хотел бы, чтобы работал код, и указал этот код.
Ставишь вместо millis() задержку delay() и все работает как задумано.
Сложности у меня с работой millis(), если понимаете то подскажите.
По кругу ходим и не по существу к сожалению...
 
Вы слабо анализируте свой код.
Объясните, как в вашем коде, может сработать реле2, без доп. кода.
Реле срабатывают от флагов
Код:
relay1_on = true;
relay2_on = true;
relay3_on = true;
relay4_on = true;
В конце функции
находится функция
 

enjoynering

Well-known member
Я прочитав ваш ответ ничего не понял. Ну кроме того, что все реле, как вы выразились по "флагам", встают в true и все.

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

CodeNameHawk

Moderator
Команда форума
Реле срабатывают от флагов
Ну вы блин даёте, не прошло и ... и нашли таки дополнительный код.
Реле срабатывают от флагов
Ну раз вы это уже поняли, так меняйте флаги когда вам надо.
Ещё одна подсказка по коду, это я том коде, где две реле, почему вы удивляетесь что обе реле срабатывают одновременно? Если у вас так указанно в коде.
 
Ну вы блин даёте, не прошло и ... и нашли таки дополнительный код.
Он и не скрывался, с первых строк в воспросах на форуме эта функция
фигурирует в моих вопросах.
почему вы удивляетесь что обе реле срабатывают одновременно?
Я удивляюсь почему вы думаете, что у меня 2 реле?
У меня 5 реле, я вроде описал какую логику закладываю в реле.
У меня реле 5, которое по совместительству управляет насосом, несмотря на заложенный в код алгоритм срабатывания через 10 секунд после отключения реле 2, 3 и 3, отключается все равно одновременно с этими реле.
Еще раз - реле номер 5, несмотря, что секундомер на millis() указывает "отключись через 10000 мСек" - отключается как только отключаются реле номер 2, номер 3 и номер 4.
Реле номер 1 - главное, оно работает чтобы работали остальные реле.
 

CodeNameHawk

Moderator
Команда форума
Я удивляюсь почему вы думаете, что у меня 2 реле?
Вы привели код, где фигурирует название реле1 и реле2 и в нем есть логическая ошибка.
То что вы там дальше писали нет смысла читать, если уже в таком простом коде ошибка.
Поправьте его, поймёте как написать остальную часть кода.
Поинтересуйтесь, что такое блок схема кода, если её нарисуете, код написать станет намного проще, а другие, взглянув на блок схему смогут вам подсказать.
 
Поинтересуйтесь, что такое блок схема кода, если её нарисуете, код написать станет намного проще, а другие, взглянув на блок схему смогут вам подсказать.
Ладно, программу в любом случае напишу работоспособную, скетч выложу здесь.
И пускай тема из 5 страниц будет аналогичная сотням тем на этом форуме - где автор темы обращается за проблемой, а его"знатоки" водят по кругу,"подсказывают и учат" а по итогу автор темы сам выкладывает рабочий код.
Нет бы выложить участок своего кода или где то слямзенного - вот якобы реле времени, или реле задержки включения/отключения.
Просто я нигде толком ничего, кроме таймера гайвера и не нашел.
Есть реле времени, аппаратные с задержкой и все.
Как то мы не понимаем видимо друг друга.
Спасибо;)
 

enjoynering

Well-known member
Вам даже указали где ошибка. И таки да, из того что вы опубликовали я тоже понял что у вас 2 реле.

Вы бы прислушался к тому что говорят.
 

CodeNameHawk

Moderator
Команда форума
И пускай тема из 5 страниц будет аналогичная сотням тем на этом форуме - где автор темы обращается за проблемой, а его"знатоки" водят по кругу,"подсказывают и учат" а по итогу автор темы сам выкладывает рабочий код.
Рабочий код, по просьбе автора, выкладывают в другом разделе этого сайта.
А так на форуме помогают решить проблему с кодом, а не занимаются написанием кода вместо автора и то только если автор понимает, что ему предлагают сделать и это он делает.
 

CodeNameHawk

Moderator
Команда форума
Ладно, программу в любом случае напишу работоспособную, скетч выложу здесь.
С удовольствием посмотрим.
Обычно все заканчивается, когда надо оформить скетч и схему.
Надеюсь вам не надо объяснять, что код без комментариев практически никому не нужен, как в нем что то изменить, если автор не оставил подсказок?
 
Последнее редактирование:
К сожалению, не могу отличить троллинг от, возможно, действительно конструктивной критики.
Тем не менее спрошу еще раз "знатоков", сможете ли вы помочь с логикой и написать свою версию кода, или скорректировать мой код, и раз уж вам так понравилось, что у меня два реле(хотя их на самом деле пять:ROFLMAO: и было с самого начала, ну да ладно) приведу пример кода с двумя реле
Код:
// библиотека для работы с Wi-Fi
#include "ESP8266WiFi.h"

// Wi-Fi
const char* ssid = "***************";
const char* password = "************";

//при этих условиях реле включаются
int temp_water = 22;//температура с датчика
int temp_set = 25;//температура заданная

//при этих условиях реле отключаются
//int temp_water = 25;//температура с датчика
//int temp_set = 22;//температура заданная

void setup() {
  wifi();
  relayControl();
}

void loop() {
  relayControl();
}

void relayControl() {
  if (temp_water < temp_set)
  {
    relay1 = true;//реле 1 включается
    delay(4000);
    relay2 = true;//реле 2 включается
  } else if (temp_water > temp_set)
  {
    relay1 = false;//реле 1 отключается
    delay(10000);
    relay2 = false;//реле 2 отключается
  }
}

void wifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    relayControl();
  }
Логику в коде преследую следующую - необходимо включать реле 1 и 2, первое реле сразу по наступлению условий, а второе реле через какое то время, условимся 4 секунды.
После появление других условий, реле 1 отключается сразу, а реле два снова отключится с задержкой, условимся 10 секунд.
Еще задача, т.к. устройство подключается по wifi к серверу wqtt(само подключение опущено в коде), просто задача управлять релюхами в любое время, при инициализации, в цикле и в момент переподключения, поэтому функция relayControl(); понапихана везде, где требуется.
Просьба к "знатокам" и "советчикам" перевести этот код на millis();
Я не смог, с delay'ми все работает, но как только вводишь millis() или таймер гайвера то все работает ровно один раз при инициализации - relayControl(); в setup();
Сдается мне, на форуме три причины:
1. Советчики сами не знают решения и троллят обратившихся за помощью(вероятность этого высока)
2. Решения задачи нет, и нужно сменить условия задачи(сценарий маловероятный но возможный)
3. Недостаточные знания спрашивающего, но на то форум и служит, чтобы помогать находить решения.
 

enjoynering

Well-known member
Вы видно не поняли философию сайта. Здесь за вас код никто писать не будет, но мы можем помочь вам разобраться и найти ошибки с помощью наводящих вопросов.

Перафразирую - мы учим рыбачить, а не ловим рыбу за кого-то.

Мы вас не тролим, просто вы очень чувствительный к конструктивной критике.
 
Сверху Снизу