Самодельный контроллер управления нагрузками.

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
Аватара пользователя
king.shults
Сообщения: 11
Зарегистрирован: Пн июн 04, 2018 9:02 am
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Самодельный контроллер управления нагрузками.

Сообщение king.shults » Ср сен 04, 2019 10:26 am

Хочу представить небольшой проект платы для управления нагрузками, к которой можно подключить 8 включателей.
Положение включателей храниться в энергозависимой памяти в виде массива. Управляя этим массивом можно в любое время включить или выключить устройство, как с кнопки выключателя, так и с телефона, планшета или компьютера.
Плата представляет из себя обрезанный клон ArduinoUno с подключенным I2c расширителем портов MCP23017 и 8 реле.
В общем этот колхоз выглядит на схеме вот так:

ИзображениеИзображение

По верх платы имеется разъем для вставки Ethernet Shield W5100.
Изображение

Микроконтроллер программируется на ArduinoUno, код:

Код: Выделить всё

#include <Ethernet.h>
#include <PubSubClient.h>
#include <Wire.h>
#include "Adafruit_MCP23017.h"

Adafruit_MCP23017 mcp_1;

//***Константы подписок mqtt***//
#define relays_topic "relay/relay_"

//***Режим настройки***//
int setupBtn = 8;
boolean setupMode = false;

//***Настройки сети***//
byte mac[] = {0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 191);
IPAddress mqtt_server(192, 168, 0, 63);
EthernetClient ethClient;
PubSubClient client(ethClient);

boolean lastBtnStatus[8];

void setup()
{
  Serial.begin(9600);
  //***Вход в режим настройки***//
  pinMode(setupBtn, INPUT);
  if (digitalRead(setupBtn) == HIGH)
  {
    setupMode = true;
  }

  //***Настройка пинов регистра***//
  mcp_1.begin(0);
  for (int i = 0; i <= 7; i++)
  {
    mcp_1.pinMode(i, OUTPUT);
    mcp_1.pinMode(i + 8, INPUT);
    mcp_1.pullUp(i + 8, HIGH);
  }
  //***Статус реле при включении***//
  for (int i = 0; i <= 7; i++)
  {
    lastBtnStatus[i] = mcp_1.digitalRead(i + 8);
    mcp_1.digitalWrite(i, false);
  }

  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  delay(1000);
  Ethernet.begin(mac);
  delay(5000);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
void reconnect()
{
  while (!client.connected())
  {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ArduinoUno", "mqttuser", "passwd"))
    {
      Serial.println("connected"); //  "подключен"
      client.subscribe("relay/#");
    }
    else
    {
      Serial.print("failed, rc="); //  "подключение не удалось"
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
void callback(char *topic, byte *payload, unsigned int length)
{

  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  if ((char)payload[0] == '1' && String(topic) == "relay/relay_0")
  {
    mcp_1.digitalWrite(0, true);
  }
  if ((char)payload[0] == '0' && String(topic) == "relay/relay_0")
  {
    mcp_1.digitalWrite(0, false);
  }
  ////////////////////////////////////////////////////////
  if ((char)payload[0] == '1' && String(topic) == "relay/relay_1")
  {
    mcp_1.digitalWrite(1, true);
  }
  if ((char)payload[0] == '0' && String(topic) == "relay/relay_1")
  {
    mcp_1.digitalWrite(1, false);
  }
  ////////////////////////////////////////////////////////
  if ((char)payload[0] == '1' && String(topic) == "relay/relay_2")
  {
    mcp_1.digitalWrite(2, true);
  }
  if ((char)payload[0] == '0' && String(topic) == "relay/relay_2")
  {
    mcp_1.digitalWrite(2, false);
  }
  ////////////////////////////////////////////////////////
  if ((char)payload[0] == '1' && String(topic) == "relay/relay_3")
  {
    mcp_1.digitalWrite(3, true);
  }
  if ((char)payload[0] == '0' && String(topic) == "relay/relay_3")
  {
    mcp_1.digitalWrite(3, false);
  }
  ////////////////////////////////////////////////////////
  if ((char)payload[0] == '1' && String(topic) == "relay/relay_4")
  {
    mcp_1.digitalWrite(4, true);
  }
  if ((char)payload[0] == '0' && String(topic) == "relay/relay_4")
  {
    mcp_1.digitalWrite(4, false);
  }
  ////////////////////////////////////////////////////////
  if ((char)payload[0] == '1' && String(topic) == "relay/relay_5")
  {
    mcp_1.digitalWrite(5, true);
  }
  if ((char)payload[0] == '0' && String(topic) == "relay/relay_5")
  {
    mcp_1.digitalWrite(5, false);
  }
  ////////////////////////////////////////////////////////
  if ((char)payload[0] == '1' && String(topic) == "relay/relay_6")
  {
    mcp_1.digitalWrite(6, true);
  }
  if ((char)payload[0] == '0' && String(topic) == "relay/relay_6")
  {
    mcp_1.digitalWrite(6, false);
  }
  ////////////////////////////////////////////////////////
  if ((char)payload[0] == '1' && String(topic) == "relay/relay_7")
  {
    mcp_1.digitalWrite(7, true);
  }
  if ((char)payload[0] == '0' && String(topic) == "relay/relay_7")
  {
    mcp_1.digitalWrite(7, false);
  }
  ////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////
void REGISTER1(int CUR_PIN)
{
  boolean currentBtnStatus = mcp_1.digitalRead(CUR_PIN + 8);
//  String tpc;
//  tpc = "";
  if (lastBtnStatus[CUR_PIN] != currentBtnStatus)
  {
    delay(30);
    currentBtnStatus = mcp_1.digitalRead(CUR_PIN + 8);
    if (lastBtnStatus[CUR_PIN] != currentBtnStatus)
    {
      boolean outPinStatus = !mcp_1.digitalRead(CUR_PIN);
      mcp_1.digitalWrite(CUR_PIN, outPinStatus);
      String tpc = String(relays_topic) + String(CUR_PIN);
      delay(30);
      client.publish(tpc.c_str(), String(outPinStatus).c_str(), true);
    }
  }
  lastBtnStatus[CUR_PIN] = currentBtnStatus;
}

void loop()
{

  if (!setupMode)
  {
    Serial.println("В режиме настройки");
    delay(1000);
  }
  else
  {
    if (!client.connected())
    {
      reconnect();
    }
    client.loop();
    for (int i = 0; i <= 7; i++)
    {
      REGISTER1(i);
    }
  }
}

Если у кого-то это устройство вызовет интерес выложу BOM и герберы. Доработки и исправления будут только приветствоваться.
За это сообщение автора king.shults поблагодарил:
TrDA (Вс ноя 10, 2019 6:49 pm)
Рейтинг: 1.16%
stellhawk
Сообщения: 264
Зарегистрирован: Чт ноя 08, 2018 5:51 am
Благодарил (а): 10 раз
Поблагодарили: 83 раза

Re: Самодельный контроллер управления нагрузками.

Сообщение stellhawk » Ср сен 04, 2019 11:44 am

устройство интересно, но не режиме DIY .
людям нужен продукт, схемы и скетчи в целом понятны.
Как удалось победить проблему зависаний и остальных косяков W5100?
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Самодельный контроллер управления нагрузками.

Сообщение tarasfrompir » Ср сен 04, 2019 12:36 pm

Опять релюхи ? ну блин - ну поставь симисторы + снабер
Спасибо нам ПОМОЖЕТ..!
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Самодельный контроллер управления нагрузками.

Сообщение Chainik » Ср сен 04, 2019 12:43 pm

tarasfrompir писал(а):
Ср сен 04, 2019 12:36 pm
Опять релюхи ? ну блин - ну поставь симисторы + снабер
Вопрос весьма спорный. У меня в начальных версиях МегаД, когда там еще использовались снабберы (симисторный исп.модуль), был неприятный эффект, связанный с периодическими (наверное, раз в 10-15 секунд) вспышками энергосберегающих ламп.
И очень многие пользователи хотят, чтобы выходы были полностью гальванически развязаны.
Так что не все однозначно.
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Самодельный контроллер управления нагрузками.

Сообщение tarasfrompir » Ср сен 04, 2019 12:49 pm

Chainik писал(а):
Ср сен 04, 2019 12:43 pm
tarasfrompir писал(а):
Ср сен 04, 2019 12:36 pm
Опять релюхи ? ну блин - ну поставь симисторы + снабер
Вопрос весьма спорный. У меня в начальных версиях МегаД, когда там еще использовались снабберы (симисторный исп.модуль), был неприятный эффект, связанный с периодическими (наверное, раз в 10-15 секунд) вспышками энергосберегающих ламп.
И очень многие пользователи хотят, чтобы выходы были полностью гальванически развязаны.
Так что не все однозначно.
Этот эфект никак не связан с симистором- это проблемма лампы. У меня она моргает даже без никаких гальваник- мальваник. Просто моргает - потому что бп херовый в лампе... А жаль конечно
Спасибо нам ПОМОЖЕТ..!
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Самодельный контроллер управления нагрузками.

Сообщение Chainik » Ср сен 04, 2019 12:59 pm

tarasfrompir писал(а):
Ср сен 04, 2019 12:49 pm
...
Этот эфект никак не связан с симистором- это проблемма лампы. У меня она моргает даже без никаких гальваник- мальваник. Просто моргает - потому что бп херовый в лампе... А жаль конечно
Я, конечно, в схемотехнике полный "0", но помню, что рекомендация производителя по "лечению" проблемы была связана с выпаиванием из платы снаббера. Если бы такая лампа была подключена через реле, проблемы бы не было со 100-й вероятностью.
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Самодельный контроллер управления нагрузками.

Сообщение tarasfrompir » Ср сен 04, 2019 1:31 pm

Chainik писал(а):
Ср сен 04, 2019 12:59 pm
tarasfrompir писал(а):
Ср сен 04, 2019 12:49 pm
...
Этот эфект никак не связан с симистором- это проблемма лампы. У меня она моргает даже без никаких гальваник- мальваник. Просто моргает - потому что бп херовый в лампе... А жаль конечно
Я, конечно, в схемотехнике полный "0", но помню, что рекомендация производителя по "лечению" проблемы была связана с выпаиванием из платы снаббера. Если бы такая лампа была подключена через реле, проблемы бы не было со 100-й вероятностью.
Да правильная рекомендация - но это всего навсего выход из положения не больше....
И в таком случае сделать снабер отключаемым - через тот же джамперок...
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
king.shults
Сообщения: 11
Зарегистрирован: Пн июн 04, 2018 9:02 am
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Re: Самодельный контроллер управления нагрузками.

Сообщение king.shults » Ср сен 04, 2019 4:04 pm

stellhawk писал(а):
Ср сен 04, 2019 11:44 am
Как удалось победить проблему зависаний и остальных косяков W5100?
У меня с радиатором охлаждения зависания не наблюдалось, хотя надо ещё этот прибор погонять.
tarasfrompir писал(а):
Ср сен 04, 2019 12:36 pm
Опять релюхи ? ну блин - ну поставь симисторы + снабер
Взял на заметку
За это сообщение автора king.shults поблагодарил:
tarasfrompir (Ср сен 04, 2019 5:06 pm)
Рейтинг: 1.16%
Ответить