WEB и Bluetooth Контрол на Релета с Arduino UNO и Ethernet W5100

WEB и Bluetooth Контрол на Релета с Arduino UNO и Ethernet W5100

Въведение

В този проект ще създадем портотип система за управление на релета чрез WEB сървър, базиран на Arduino UNO, Ethernet W5100 модул и Bluetooth HC-05 модул за комуникация. В статията ще разгледаме различни Ethernet модули, пиновете и интерфейсите, използвани в проекта, както и подробно обяснение на кода стъпка по стъпка.

Видове Ethernet Чипове

Има няколко популярни Ethernet чипове, които често се използват в IoT проекти. Те се различават по скорост на трансфер, размер на буфера и поддръжка на различни мрежови протоколи:

ENC28J60

  • Интерфейс: SPI (Serial Peripheral Interface)
  • Максимална скорост: 10 Mbps
  • Буфер: 8 KB
  • Мрежови стандарти: 10Base-T
  • Поддръжка на протоколи: само TCP/IP
  • Предимства: ниска цена и проста интеграция.
  • Недостатъци: по-ниска скорост и липса на вграден TCP/IP стек.

WIZnet W5100

  • Интерфейс: SPI
  • Максимална скорост: 100 Mbps
  • Буфер: 16 KB
  • Мрежови стандарти: 10/100 Base-T
  • Поддръжка на протоколи: TCP, UDP, ICMP, IPv4 и ARP
  • Предимства: лесна интеграция с Arduino и вграден TCP/IP стек.
  • Недостатъци: по-голям физически размер от ENC28J60.
  • Приложение в проекта: В този проект ще използваме W5100 поради стабилността и високата му скорост на комуникация.

WIZnet W5500

  • Интерфейс: SPI
  • Максимална скорост: 100 Mbps
  • Буфер: 32 KB
  • Мрежови стандарти: 10/100 Base-T
  • Поддръжка на протоколи: TCP, UDP, ICMP, IGMP, PPPoE, ARP, IP
  • Предимства: по-голям буфер и по-нова технология в сравнение с W5100.
  • Недостатъци: малко по-скъпо решение.

Bluetooth модул HC-05

Той е популярен и широко използван модул за безжична комуникация, който позволява на устройства като Arduino да обменят данни с други Bluetooth устройства като смартфони, таблети или компютри. Модулът работи на честота 2.4GHz и поддържа стандарт Bluetooth 2.0 с EDR (Enhanced Data Rate), осигурявайки скорости на трансфер до 3 Mbps. HC-05 може да работи както в режим Master, така и в Slave, което го прави гъвкав за различни приложения. Интерфейсът му използва серийна комуникация (UART), което го прави лесен за интеграция с микроконтролери като Arduino. Модулът разполага с LED индикатор, който показва състоянието на връзката, а неговото основно предимство е лесната употреба и надеждната комуникация на къси разстояния, обикновено до 10 метра. Запознахме се как се предават и примат данни чрез него в предходната ни стаитя “Серийна комуникация с Arduino UNO чрез USB или Bluetooth HC-05“.

Пинове и Интерфейси

В този проект ще използваме следните компоненти:

  • W5100 Ethernet модул – комуникира с Arduino чрез SPI интерфейс, използвайки следните пинове:
    • MOSI (Master Out Slave In): Pin 11 (на Arduino Uno)
    • MISO (Master In Slave Out): Pin 12 (на Arduino Uno)
    • SCK (Serial Clock): Pin 13 (на Arduino Uno)
    • SS (Slave Select): Pin 10 (на Arduino Uno)
  • Релета – Свързваме четири релета към пинове 2, 3, 4 и 5.
  • LED – LED диод за индикация на статуса на мрежата е свързан към Pin 6.
  • HC-05 Bluetooth модул – комуникира с Arduino чрез сериен интерфейс (TX и RX):
    • TX на HC-05: към RX на Arduino (Pin 0)
    • RX на HC-05: към TX на Arduino (Pin 1)

Може да се с пин диаграмата на Arduino UNO в нашето ревю за него.

Схема на устройството за управление на релата с Arduino UNO Ethernet W5100 и Bluetooth

Контрол на релета с Arduino UNO и Ethernet W5100 и Bluetooth- Схема

Код за контрол на релета с Arduino UNO и Ethernet W5100 и Bluetooth

#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 , HIGH);
  digitalWrite(relay2 , HIGH);
  digitalWrite(relay3 , HIGH);
  digitalWrite(relay4 , HIGH);
  
  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) == LOW) {
            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) == LOW) {
            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) == LOW) {
            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) == LOW) {
            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, LOW);
          if (readString.indexOf("?button1off") > 0) digitalWrite(relay1, HIGH);
          if (readString.indexOf("button2on") > 0) digitalWrite(relay2, LOW);
          if (readString.indexOf("button2off") > 0) digitalWrite(relay2, HIGH);
          if (readString.indexOf("button3on") > 0) digitalWrite(relay3, LOW);
          if (readString.indexOf("button3off") > 0) digitalWrite(relay3, HIGH);
          if (readString.indexOf("button4on") > 0) digitalWrite(relay4, LOW);
          if (readString.indexOf("button4off") > 0) digitalWrite(relay4, HIGH);

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

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

Обяснение на Кода Стъпка по Стъпка

Библиотеки които използваме

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

Трите библиотеки, използвани в този проект, играят ключова роля за функционалността на Arduino. Тези библиотеки ги има в средата за разработка която сте свалили Arduino IDE, така, че няма нужда да ги инсталитате допълнително. Ето какви са те:

SPI.h – Библиотеката за Serial Peripheral Interface (SPI) осигурява комуникация между микроконтролера на Arduino и периферни устройства като Ethernet контролери. SPI е високоскоростен интерфейс, който използва няколко проводника за комуникация (MISO, MOSI, SCK, и SS), като позволява обмен на данни с външни модули.

Ethernet.h – Тази библиотека осигурява необходимите функции за мрежова комуникация чрез Ethernet. Тя позволява на Arduino UNO и Ethernet W5100 да работи като клиент или сървър в мрежа, като поддържа протокола TCP/IP. Използва се най-често с чипове като W5100 за създаване на мрежови връзки и уеб сървъри.

Ако ви трябват библиотеки за други ваши проекти, бъдете свободни да ги свалите от раздела на Ардуино: https://www.arduino.cc/reference/en/libraries/.

Деклариране на променливи

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

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;

Тази част от кода инициализира основните компоненти за управление на релета, LED индикатор, комуникация през Bluetooth и Ethernet свързаност:

  1. Релета: Променливите relay1, relay2, relay3, и relay4 задават цифровите пинове на Arduino (2, 3, 4 и 5), които ще се използват за управление на 4 релета. Релетата могат да включват и изключват различни електрически вериги, като светлини или уреди.
  2. LED индикатор: Променливата ledStatus е свързана към пин 6 и служи за индикация на статуса на процесора (в този случай успешна мрежова връзка).
  3. Bluetooth: Променливата f ще съхранява данни, получени от Bluetooth комуникация, която ще бъде обработена по-късно в кода.
  4. Мрежова свързаност:
    • Променливата mac[] съдържа MAC адреса на Ethernet чипа. MAC адресът е уникален за всяко устройство в мрежата и служи за идентификация.
    • static_ip[], gateway[] и subnet[] съдържат съответно статичния IP адрес, шлюза (gateway), и мрежовата маска за мрежовата конфигурация.
  5. EthernetServer: Променливата server инициализира уеб сървър на порт 80, който ще приема HTTP заявки. Това ще позволи на потребителя да контролира релетата през уеб интерфейс.
  6. readString: Променливата readString съхранява информацията, получена от HTTP заявките, изпратени към уеб сървъра, като тя ще бъде използвана за анализ на командите, получени през мрежата.

Инициализация на основните компоненти на програмата void setup()

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

  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  digitalWrite(relay1 , HIGH);
  digitalWrite(relay2 , HIGH);
  digitalWrite(relay3 , HIGH);
  digitalWrite(relay4 , HIGH);
  
  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();
}
  1. Serial.begin(9600): Отваряне на сериен комуникационен порт. Тази команда стартира сериен комуникационен канал със скорост от 9600 бода в секунда. Тя позволява обмен на данни между компютъра и Arduino през USB кабела, като съобщенията се използват за отстраняване на грешки и наблюдение.
  2. pinMode(relayX, OUTPUT): Настройка на пиновете за релетата. Тези команди определят четирите пина (2, 3, 4 и 5) като изходи за управление на релетата. Пиновете ще се използват за включване и изключване на релетата.
  3. digitalWrite(relayX , HIGH): Тук релетата се инициализират в изключено състояние чрез подаване на високо ниво (HIGH) към съответните пинове, което предотвратява включването им при стартиране на програмата. В този случай при подаване на високо ниво на пиновете на релетата, те се изключват, защото са оптронно разделени, което реверсира техните състояния.
  4. pinMode(ledStatus, OUTPUT): Настройка на LED индикатора. Пин 6 се задава като изход, за да контролира LED индикатор, който ще сигнализира дали устройството е свързано към мрежата или не.
  5. Serial.println(“Attempting to configure Ethernet using DHCP…”) и digitalWrite(ledStatus, LOW): Опит за свързване чрез DHCP. Тази част от кода показва съобщение в сериен монитор, че се прави опит за конфигуриране на Ethernet връзка чрез DHCP (Dynamic Host Configuration Protocol). Паралелно с това, LED индикаторът се изключва (LOW), докато не бъде получен IP адрес.
  6. if (Ethernet.begin(mac) == 0) { code }: Тук програмата се опитва да получи IP адрес чрез DHCP. Ако не успее, се показва съобщение в серийния монитор, и се задава статичен IP адрес от предварително дефинираните IP адреси. След това LED индикаторът се включва (HIGH), за да покаже, че устройството е свързано със статичен IP адрес.
  7. else { code }: Ако DHCP конфигурацията е успешна, програмата извежда IP адреса, който е присвоен от DHCP сървъра, и също включва LED индикатора.
  8. server.begin(): Стартиране на WEB сървъра. Тази команда стартира уеб сървър на порт 80. След това сървърът е готов да приема HTTP заявки от уеб браузъри, което позволява управление на релетата през мрежата.

Основен цикъл на програмата void loop()

Обяснение на WEB частта и обработка на заявките.

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) == LOW) {
            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) == LOW) {
            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) == LOW) {
            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) == LOW) {
            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, LOW);
          if (readString.indexOf("?button1off") > 0) digitalWrite(relay1, HIGH);
          if (readString.indexOf("button2on") > 0) digitalWrite(relay2, LOW);
          if (readString.indexOf("button2off") > 0) digitalWrite(relay2, HIGH);
          if (readString.indexOf("button3on") > 0) digitalWrite(relay3, LOW);
          if (readString.indexOf("button3off") > 0) digitalWrite(relay3, HIGH);
          if (readString.indexOf("button4on") > 0) digitalWrite(relay4, LOW);
          if (readString.indexOf("button4off") > 0) digitalWrite(relay4, HIGH);

          readString = "";  // Изчистване на заявката за следващата връзка
        }
      }
    }
  }
  1. EthernetClient client = server.available(): EthernetClient клиентска връзка. В началото на цикъла се проверява дали има нов клиент, който иска да се свърже с уеб сървъра. Ако такъв клиент е наличен, програмата започва да обработва връзката.
  2. if (client.available()) { CODE }; if (readString.length() < 100) { CODE }: Четене на HTTP заявката. Тази част от кода чете входните данни, изпратени от клиента (уеб браузъра), и ги съхранява в променливата readString. Тя събира символи, докато не достигне дължина от 100 символа или докато не се получи нов ред ('\n'), което бележи края на заявката.
  3. client.println(F("<a href=\"/?button1on\"><button type=button style=width:200px;height:50px>Relay1 On</button></a>")): Отговор на HTTP заявката. Когато заявката е завършена, програмата генерира отговор с HTML код, който се изпраща обратно към клиента (уеб браузъра). Този HTML код създава уеб интерфейс с бутони за управление на релетата.
  4. if (readString.indexOf(“?button1on”) > 0) digitalWrite(relay1, LOW or HIGH): Управление на релетата. След като клиентът натисне бутон (например за включване на реле 1), заявката ще съдържа параметри като ?button1on или ?button1off. Тези параметри се използват, за да се определи дали да се включи или изключи определено реле.
  5. client.stop(); readString = “”: Изчистване на заявката и затваряне на връзката. Накрая, след като заявката е обработена и релетата са управлявани, се изчиства променливата readString, за да се подготви за нова заявка, и клиентската връзка се затваря.

Част от кода за управление чрез Bluetooth HC-05

За управлението на релетата през Bluetooth използвахме приложение за Android “Arduino Bluetooth 4CH”, свалено от PlayStore.

Bluetooth Контрол на Релета с Arduino UNO

Тази част от кода осъществява управление на релейната система чрез сериен порт посредством Bluetooth модула HC-05, който комуникира с Arduino. HC-05 приема команди от свързано Bluetooth устройство (например смартфон) и ги предава на серийния порт на Arduino. Програмата чете командите от серийния порт и изпълнява съответните действия за управление на релетата.

  // Управление чрез сериен порт посредством Bluetooth HC-05
  if (Serial.available() > 0) {
    f = Serial.read();
    if (f == '1') digitalWrite(relay1, LOW);
    if (f == 'A') digitalWrite(relay1, HIGH);
    if (f == '2') digitalWrite(relay2, LOW);
    if (f == 'B') digitalWrite(relay2, HIGH);
    if (f == '3') digitalWrite(relay3, LOW);
    if (f == 'C') digitalWrite(relay3, HIGH);
    if (f == '4') digitalWrite(relay4, LOW);
    if (f == 'D') digitalWrite(relay4, HIGH);
    if (f == '9') {
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, LOW);
    }
    if (f == 'I') {
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, HIGH);
    }
  }
  1. if (Serial.available() > 0): Тази проверка установява дали има данни, налични за четене от серийния порт. Ако има поне един символ в буфера на серийния порт, кодът вътре в условието се изпълнява.
  2. f = Serial.read(): Чете първия наличен символ от серийния буфер и го съхранява в променливата f. Този символ представлява команда, изпратена от Bluetooth устройството.
  3. if (f == ‘1’) digitalWrite(relay1, LOW): Ако се получи символ '1', реле 1 се включва (LOW = активно състояние за реле).
  4. if (f == ‘A’) digitalWrite(relay1, HIGH): Ако се получи символ 'A', реле 1 се изключва (HIGH = неактивно състояние).
  5. Същата логика се прилага и за другите релета, като за включване се използват символи '2', '3', '4', а за изключване – 'B', 'C', 'D'.

Заключение

Проектът за управление на релета с Arduino UNO и Ethernet W5100 съчетава функционалностите на Ethernet и Bluetooth комуникация, за да осигури гъвкав контрол на устройства през уеб сървър и безжична връзка. Използването на W5100 модул за стабилна мрежова свързаност и HC-05 Bluetooth за близко-дистанционна комуникация позволява лесно управление на електрически вериги и уреди. С подробното обяснение на пиновете, кода и свързаните библиотеки, този проект предлага солидна основа за създаване на IoT приложения с Arduino. Ще развием този проект до устойство за вграждане в табла за DIN шина, и ще го публикуваме в раздела ни Arduino проекти.