Ethernet и Bluetooth управление на четири релета чрез с Arduino и ATmega328P

Ethernet и Bluetooth управление на четири релета чрез с Arduino и ATmega328P

В тази статия ще разгледаме разработката на устройство за управление на четири релета чрез Ethernet и Bluetooth, базирано на популярната платформа Arduino и Atmega328p. Проектът ни е следващата стъпка от разработката, описана в статията „Управление на релета с Arduino, Ethernet W5100 и Bluetooth“, но този път ще създадем крайно устройство, готово за монтаж в електрическо табло на DIN шина.

Цел на проекта

Основната цел на проекта е да разработим компактно и лесно за интегриране устройство, което да позволява управление на четири релета чрез Ethernet и Bluetooth връзка. Това решение е идеално за дистанционно управление на домашна автоматизация и други системи, изискващи надеждно управление на различни устройства.

Хардуер

В основата на устройството е микроконтролерът ATmega328P, използван в Arduino Uno. За Ethernet връзката се използва W5100 Ethernet модул, а за Bluetooth комуникацията – модул HC-05. Устройството ще бъде проектирано така, че да се монтира на DIN шина, което улеснява интеграцията му в стандартни електрически табла.

Компоненти на хардуера:

  1. ATmega328P – микроконтролерът, който ще управлява логиката на устройството.
  2. W5100 Ethernet модул – за връзка с локалната мрежа чрез Ethernet.
  3. HC-05 Bluetooth модул – за безжична комуникация на кратки разстояния.
  4. Релета – четири релета за управление на различни устройства.
  5. Захранване – 220v взето от ел.таблото.

Модулен дизайн за DIN шина

За разлика от предишната версия на проекта, където основният фокус беше върху функционалността, тук акцентът пада и върху хардуерния дизайн. Устройството ще бъде проектирано за монтаж на DIN шина, което го прави подходящо за монтаж в стандартни електрически табла.

Платката ще бъде създадена с компактни размери (8смx8см), така че да пасва в стандартна пластмасова кутия за DIN шина. Релетата ще бъдат свързани към ATmega328P, който ще контролира състоянието им според получените команди чрез Ethernet или Bluetooth. Прочетете за характеристиките и PinOUT на този контролер в страницата ни за Arduino UNO.

Изглед на платката

Ethernet и Bluetooth управление на четири релета чрез с Arduino и ATmega328P

Схема на захранваща част

DIN-4-relay-Atmega328p-W5100-Bluetooth-Power-Supplay

Схема на релейна част

DIN-4-relay-Atmega328p-W5100-Bluetooth-Relay-Part

Схема на контролера Atmega328p, Ethernet W5100 и Bluetooth HC-05

DIN-4-relay-Atmega328p-W5100-Bluetooth-Controller-Pert

Софтуер

Софтуерната част на проекта ще бъде базирана на вече съществуващия код, който беше разработен в предишната версия. Основната логика на програмата ще остане същата, но ще бъдат направени някои някои промени в частта за управление на релетата.

Основни функции на софтуера:

  1. Ethernet комуникация – устройство ще получава команди чрез WEB страница, използвайки W5100 ethernet.
  2. Bluetooth комуникация – безжично управление чрез Bluetooth, което позволява контрол на устройството от мобилно приложение или друг Bluetooth-способен контролер.
  3. Управление на релетата – четирите релета ще могат да се управляват индивидуално, като софтуерът ще поддържа както включване и изключване.
  4. Мониторинг – добавяне на функция за мониторинг на текущото състояние на релетата.

КОД за Ethernet и Bluetooth управление на четири релета чрез с Arduino и ATmega328P

#include <SPI.h>
#include <Ethernet.h>

int relay1 = 2;  // initialize pin 2
int relay2 = 3;  // initialize pin 3
int relay3 = 4;  // initialize pin 4
int relay4 = 5;  // initialize pin 5

int ledStatus = 6; // initialize pin 6 processorStatus
//int count = 0; //  Counter for Processor Status

char f;  // BlueTooth variable

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEA };   // MAC адрес за Ethernet
byte static_ip[] = { 172, 16, 100, 2 };  // Статичен IP адрес
byte gateway[] = { 172, 16, 100, 1 };    // Шлюз (Gateway)
byte subnet[] = { 255, 255, 255, 0 };   // Мрежова маска
EthernetServer server(80);  // Уеб сървър на порт 80
String readString;

void setup() {
  Serial.begin(9600);  // Отваряне на сериен комуникационен порт

  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  digitalWrite(relay1 , LOW);
  digitalWrite(relay2 , LOW);
  digitalWrite(relay3 , LOW);
  digitalWrite(relay4 , LOW);
  
  pinMode(ledStatus, OUTPUT);

  // Опит за свързване чрез DHCP
  //Serial.println("Attempting to configure Ethernet using DHCP...");
  digitalWrite(ledStatus, LOW); // LED не свети когато няма IP адрес
  
  if (Ethernet.begin(mac) == 0) {
    // Ако не успее да вземе IP адрес от DHCP
    //Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, static_ip, gateway, subnet);  // Задаване на статичен IP адрес
    //Serial.print("Static IP assigned: ");
    //Serial.println(Ethernet.localIP());
    digitalWrite(ledStatus, HIGH); // LED свети за индикация на статично IP
  } else {
    // Ако DHCP е успешно
    //Serial.print("DHCP assigned IP: ");
    //Serial.println(Ethernet.localIP());
    digitalWrite(ledStatus, HIGH); // LED свети за индикация на DHCP IP
  }

  // Стартиране на уеб сървъра
  server.begin();
}

void loop() {
  EthernetClient client = server.available();  // Създаване на клиентска връзка
  if (client) {
    while (client.connected()) {   
      if (client.available()) {
        char c = client.read();

        if (readString.length() < 100) {  // четене на HTTP заявката
          readString += c;
        }

        if (c == '\n') {  // Край на заявката
          // Отговор на HTTP заявка
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("<HTML><HEAD><TITLE>Relay Control</TITLE></HEAD>"));
          client.println(F("<center><p><font color=black size=8>Relay Control</font></p></center>"));
          client.println(F("<BODY><center><font size=3><body bgcolor=white><font color=black>"));
          client.println(F("<hr><br>"));
          client.println(F("<br>"));
          

          // Реле 1
          client.println(F("<p>Relay 1: "));
          client.println(F("<a href=\"/?button1on\"><button type=button style=width:200px;height:50px>Relay1 On</button></a>"));
          client.println(F(" || "));
          client.println(F("<a href=\"/?button1off\"><button type=button style=width:200px;height:50px>Relay1 Off</button></a>"));

          // Чекбокс за състоянието на реле 1
          client.print(F(" <input type=\"checkbox\" disabled"));
          if (digitalRead(relay1) == HIGH) {
            client.print(F(" checked"));
          }
          client.println(F(">"));
          client.println(F("</p>"));
          
          // Реле 2
          client.println(F("<p>Relay 2: "));
          client.println(F("<a href=\"/?button2on\"><button type=button style=width:200px;height:50px>Relay2 On</button></a>"));
          client.println(F(" || "));
          client.println(F("<a href=\"/?button2off\"><button type=button style=width:200px;height:50px>Relay2 Off</button></a>"));

          // Чекбокс за състоянието на реле 2
          client.print(F(" <input type=\"checkbox\" disabled"));
          if (digitalRead(relay2) == HIGH) {
            client.print(F(" checked"));
          }
          client.println(F(">"));
          client.println(F("</p>"));
          
          // Реле 3
          client.println(F("<p>Relay 3: "));
          client.println(F("<a href=\"/?button3on\"><button type=button style=width:200px;height:50px>Relay3 On</button></a>"));
          client.println(F(" || "));
          client.println(F("<a href=\"/?button3off\"><button type=button style=width:200px;height:50px>Relay3 Off</button></a>"));

          // Чекбокс за състоянието на реле 3
          client.print(F(" <input type=\"checkbox\" disabled"));
          if (digitalRead(relay3) == HIGH) {
            client.print(F(" checked"));
          }
          client.println(F(">"));
          client.println(F("</p>"));
          
          // Реле 4
          client.println(F("<p>Relay 4: "));
          client.println(F("<a href=\"/?button4on\"><button type=button style=width:200px;height:50px>Relay4 On</button></a>"));
          client.println(F(" || "));
          client.println(F("<a href=\"/?button4off\"><button type=button style=width:200px;height:50px>Relay4 Off</button></a>"));

          // Чекбокс за състоянието на реле 4
          client.print(F(" <input type=\"checkbox\" disabled"));
          if (digitalRead(relay4) == HIGH) {
            client.print(F(" checked"));
          }
          client.println(F(">"));
          client.println(F("</p>"));
          client.println(F("<br>"));
          client.println(F("<br>"));
          
          client.println(F("</font><font size=5 color=red><p> <<< made by: www.ardudevelop.eu >>> </p></font></center></BODY></HTML>"));

          delay(1);
          client.stop();  // Спиране на клиента

          // Управление на релета
          if (readString.indexOf("?button1on") > 0) digitalWrite(relay1, HIGH);
          if (readString.indexOf("?button1off") > 0) digitalWrite(relay1, LOW);
          if (readString.indexOf("button2on") > 0) digitalWrite(relay2, HIGH);
          if (readString.indexOf("button2off") > 0) digitalWrite(relay2, LOW);
          if (readString.indexOf("button3on") > 0) digitalWrite(relay3, HIGH);
          if (readString.indexOf("button3off") > 0) digitalWrite(relay3, LOW);
          if (readString.indexOf("button4on") > 0) digitalWrite(relay4, HIGH);
          if (readString.indexOf("button4off") > 0) digitalWrite(relay4, LOW);

          readString = "";  // Изчистване на заявката за следващата връзка
        }
      }
    }
  }

  // Управление чрез сериен порт през Bluetooth HC-05
  if (Serial.available() > 0) {
    f = Serial.read();
    if (f == '1') digitalWrite(relay1, HIGH);
    if (f == 'A') digitalWrite(relay1, LOW);
    if (f == '2') digitalWrite(relay2, HIGH);
    if (f == 'B') digitalWrite(relay2, LOW);
    if (f == '3') digitalWrite(relay3, HIGH);
    if (f == 'C') digitalWrite(relay3, LOW);
    if (f == '4') digitalWrite(relay4, HIGH);
    if (f == 'D') digitalWrite(relay4, LOW);
    if (f == '9') {
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, HIGH);
    }
    if (f == 'I') {
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, LOW);
    }
  }
}

Този код демонстрира логиката на управление на релетата чрез Ethernet и Bluetooth. Може да разгледате описание на кода в горепосочената страница „Управление на релета с Arduino, Ethernet W5100 и Bluetooth“.

Може да използвате това устройство през рутер (който раздава DHCP) или само през Switch, като там може да намерите устройството на IP адрес 172.16.100.2. Задаването на статично IP става автоматично (в рамките на 30 секунди), след опит да вземе IP адреси от DHCP.

Монтаж и интеграция на Ethernet и Bluetooth управление на четири релета чрез с Arduino и ATmega328P

След като хардуерът и софтуерът са готови, следващата стъпка е монтажът на устройството в таблото. Използването на DIN шина улеснява процеса на инсталация, като позволява лесно добавяне на устройството към съществуваща електрическа инсталация.

Връзките на релетата към външни устройства трябва да бъдат направени внимателно, като се спазват стандартите за безопасност. Захранването на устройството също трябва да бъде стабилно, за да се гарантира надеждна работа.

Заключение

Създаването на устройство за управление на четири релета чрез Ethernet и Bluetooth е отличен проект, който демонстрира възможностите на платформата Arduino и микроконтролера ATmega328P. С добавянето на модулен дизайн за монтаж на DIN шина, проектът става изключително подходящ за реални приложения в областта на домашната автоматизация и управление.

Използването на стандартни комуникационни модули като W5100 и HC-05 прави устройството гъвкаво и лесно за интеграция в различни системи. Съществуващият софтуер, адаптиран за новия хардуер, предлага стабилна платформа за управление на релета, като може да бъде разширен с допълнителни функции според нуждите на потребителя.

Този проект е отличен пример за това как една първоначална идея може да бъде развита и усъвършенствана до крайно устройство, готово за реална употреба.

В някои от следващите проекти ще създадем подобно устройство, като използваме чипа ENC28J60. Може да разгледате примерен проект в тази страница.