![Управление на релета и сензори с Arduino и W5100 чрез MQTT](http://ardudevelop.eu/wp-content/uploads/2025/01/Управление-на-релета-и-сензори-с-Arduino-и-W5100-чрез-MQTT.png)
Въведение
Тази статия представя портотип за управление на релета и мониторинг на аналогови сензори с Arduino, използвайки MQTT протокол. MQTT е лек протокол за обмен на съобщения, който осигурява надеждност и бързина в IoT приложения. Ще използваме Arduino UNO с Ethernet W5100 модул за връзка с мрежата и ще конфигурираме MQTT панел на смартфон за управление в реално време.
Този проект представлява интеграция на Arduino платформа с MQTT протокол за управление и мониторинг на релета и аналогови сензори. Проектът е идеален за изграждане на умни домашни системи, които изискват управление на устройства като осветление, вентилатори или електрически уреди, както и за наблюдение на сензорни данни като температура, влажност или други аналогови входове. За да работи този проект, е необходим MQTT сървър, който служи като посредник за обмен на съобщения между устройствата. Ако все още нямате настроен MQTT сървър, можете да се запознаете с нашата подробна статия за инсталиране и конфигуриране на Mosquitto MQTT Broker.
- Инсталиране на Mosquitto MQTT Broker на Raspberry Pi 4
- Инсталиране Mosquitto MQTT Broker на Orange Pi Plus 2 и Armbian Linux
С правилна настройка и конфигурация, този проект може лесно да бъде разширен за сложни IoT решения, осигурявайки надеждност и гъвкавост.
Схема на проекта за управление на релета и сензори с Arduino и W5100 чрез MQTT
Схемното решение на проекта е изградено върху основата на Arduino UNO с добавен Ethernet W5100 Shield, което осигурява лесна мрежова свързаност чрез Ethernet. Към Arduino платката са свързани четири потенциометъра, които са свързани към аналоговите входове A0, A1, A2 и A3. Тези потенциометри позволяват аналогово изчитане на стойности, които могат да представляват различни сензорни данни, като например температура, влажност или други аналогови параметри. Прочетете повече за аналогово изчитане с Arduino в статията ни: Arduino UNO ADC read.
За управление на изходните устройства са използвани четири релета, които са монтирани на релейна платформа (Relay Shield). Тези релета са свързани към дигиталните изходи на Arduino – D2, D3, D4 и D5. Те позволяват включване и изключване на различни електрически товари, като осветление, вентилатори или други устройства.
![Схема на проекта за управление на релета и сензори с Arduino и W5100 чрез MQTT](http://ardudevelop.eu/wp-content/uploads/2025/01/Схема-на-проекта-за-управление-на-релета-и-сензори-с-Arduino-и-W5100-чрез-MQTT-1024x387.png)
Този прототип е създаден с цел да демонстрира основната концепция на системата и е идеална основа за разширяване към пълноценен IoT проект. В зависимост от изискванията, системата може да бъде разширена с допълнителни сензори, повече релета или дори интеграция с безжични технологии, за да се създаде напълно автоматизирано умно решение за дома или индустриални приложения.
Код за управление на релета и сензори с Arduino и W5100 чрез MQTT
Това е кода, който ще използваме за този проект:
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
// Мрежови настройки
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 81); // IP адрес на Arduino
IPAddress mqttServer(192, 168, 1, 80); // IP на MQTT брокера
int mqttPort = 1883; // Порт за MQTT
const char* mqttUser = "xxxxxxxxx"; // Потребителско име за MQTT
const char* mqttPassword = "xxxxxxxxx"; // Парола за MQTT
// MQTT клиент
EthernetClient ethClient;
PubSubClient client(ethClient);
// Релета на пинове
int relayPins[] = {2, 3, 4, 5};
// Аналогови входове
int analogPins[] = {A0, A1, A2, A3};
// Callback функция за обработка на MQTT съобщения
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0'; // Завършва стринга с нулев символ
String topicStr = String(topic);
String payloadStr = String((char*)payload);
// Проверка на топици за управление на релета
if (topicStr == "home/relays/relay1") {
digitalWrite(relayPins[0], payloadStr == "ON" ? HIGH : LOW);
} else if (topicStr == "home/relays/relay2") {
digitalWrite(relayPins[1], payloadStr == "ON" ? HIGH : LOW);
} else if (topicStr == "home/relays/relay3") {
digitalWrite(relayPins[2], payloadStr == "ON" ? HIGH : LOW);
} else if (topicStr == "home/relays/relay4") {
digitalWrite(relayPins[3], payloadStr == "ON" ? HIGH : LOW);
}
}
// Функция за свързване към MQTT брокера
void connectToMQTT() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("arduinoClient", mqttUser, mqttPassword)) {
Serial.println("Connected to MQTT");
// Абониране за топиците за релетата
client.subscribe("home/relays/relay1");
client.subscribe("home/relays/relay2");
client.subscribe("home/relays/relay3");
client.subscribe("home/relays/relay4");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
delay(2000);
}
}
}
void executeWithInterval(unsigned long interval, void (*action)(), unsigned long &previousMillis) {
unsigned long currentMillis = millis(); // Записваме текущото време
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Записваме текущото време като време на последното изпълнение
action(); // Изпълняваме предадената като параметър функция
}
}
void analogSend() {
for (int i = 0; i < 4; i++) {
int sensorValue = analogRead(analogPins[i]);
char payload[8];
itoa(sensorValue, payload, 10);
String topic = "home/sensors/analog" + String(i + 1);
client.publish(topic.c_str(), payload);
}
}
void setup() {
Serial.begin(9600);
// Инициализация на Ethernet
Ethernet.begin(mac, ip);
delay(1500);
// Настройка на MQTT клиент
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
// Настройка на пиновете за релетата
for (int i = 0; i < 4; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // Релетата са изключени по подразбиране
}
connectToMQTT();
}
void loop() {
if (!client.connected()) {
connectToMQTT();
}
client.loop();
static unsigned long previousMillis1 = 0;
executeWithInterval(5000, [](){ analogSend(); }, previousMillis1);
}
Подробно обяснение на кода
Библиотеки
#include <SPI.h>
: Библиотеката за SPI комуникация, използвана от Ethernet модула.#include <Ethernet.h>
: Управлява Ethernet връзката.#include <PubSubClient.h>
: Библиотеката за MQTT, която улеснява свързването и комуникацията с брокера. Може да свалите тази библиотека от “Manage Library” в Arduino IDE или да я свалите от тук. Повече за начина на инсталация прочетете в статията ни: Arduino IDE бърз преглед.
Мрежови настройки
- MAC адрес (
mac[]
): Уникален идентификатор на мрежовия интерфейс на Ethernet модула. - IP адрес (
ip
): Определя локалния IP адрес на Arduino. - MQTT настройки (
mqttServer
,mqttPort
,mqttUser
,mqttPassword
): Конфигурация за връзка с MQTT брокера.
Конфигурация на релета и аналогови входове
- Масив
relayPins[]
: Пинове, към които са свързани релетата. - Масив
analogPins[]
: Аналогови входове за четене на сензорни стойности.
Callback функция
Функцията callback
:
- Приема съобщения от брокера.
- Проверява топиците и “payload” стойностите.
- Управлява релетата на базата на командите “
ON
“ или “OFF
“.
Функция за свързване към MQTT
connectToMQTT
:
- Прави опит за свързване към брокера.
- Абонира се за топици.
- В случай на неуспех изчаква и опитва отново.
Функция за изпращане на аналогови стойности
analogSend
:
- Чете стойности от всички аналогови входове.
- Преобразува ги в текстови формат и ги изпраща в съответните топици.
Функция изпълнение без закъснение
executeWithInterval:
Написахме тази функция за вас с цел улеснение на изпълнението на задачи без закъснение. Разгледали сме тази фукнция подробно в статията ни: Arduino мигане без закъснение “Blink Without Delay”.
Основен цикъл loop
- Проверява дали клиентът е свързан към брокера.
- Стартира функции в определени интервали (например “
analogSend
“).
Топици и настройка на MQTT панел на вашия смартфон или компютър
home/relays/relay1
доhome/relays/relay4
:- Управляват състоянието на четирите релета.
- Payload стойности: “
ON
” за включване и “OFF"
за изключване.
home/sensors/analog1
доhome/sensors/analog4
:- Публикуват стойностите от аналоговите сензори.
Настройка на IoT MQTT Panel на смартфон
- Изтегляне на приложението:
- Намерете IoT MQTT Panel в Google Play или App Store.
- Създаване на панел:
- Име: Arduino MQTT Panel.
- Брокер IP:
192.168.1.80
. Заменете с IP на вашия брокер. - Порт: 1883.
- Потребител и парола: USERNAME / PASSWORD.
- Добавяне на елементи (widgets):
- Relay 1:
- Тип: Switch.
- Топик:
home/relays/relay1
. - Payload ON:
ON
. - Payload OFF:
OFF
.
- Analog Sensor 1:
- Тип: Text View.
- Топик:
home/sensors/analog1
.
- Relay 1:
- Запазване и тестване:
- Запазете настройките.
- Тествайте управление на релетата и мониторинг на сензорите.
Заключение
Този проект демонстрира как да комбинирате Arduino, Ethernet и MQTT за управление и мониторинг в IoT приложения. С правилна настройка на MQTT панела, ще имате удобен и бърз достъп до устройството.