Управление на релета и сензори с Arduino и W5100 чрез MQTT

Управление на релета и сензори с Arduino и W5100 чрез MQTT

Въведение

Тази статия представя портотип за управление на релета и мониторинг на аналогови сензори с Arduino, използвайки MQTT протокол. MQTT е лек протокол за обмен на съобщения, който осигурява надеждност и бързина в IoT приложения. Ще използваме Arduino UNO с Ethernet W5100 модул за връзка с мрежата и ще конфигурираме MQTT панел на смартфон за управление в реално време.

Този проект представлява интеграция на Arduino платформа с MQTT протокол за управление и мониторинг на релета и аналогови сензори. Проектът е идеален за изграждане на умни домашни системи, които изискват управление на устройства като осветление, вентилатори или електрически уреди, както и за наблюдение на сензорни данни като температура, влажност или други аналогови входове. За да работи този проект, е необходим MQTT сървър, който служи като посредник за обмен на съобщения между устройствата. Ако все още нямате настроен MQTT сървър, можете да се запознаете с нашата подробна статия за инсталиране и конфигуриране на Mosquitto MQTT Broker.

С правилна настройка и конфигурация, този проект може лесно да бъде разширен за сложни 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

Този прототип е създаден с цел да демонстрира основната концепция на системата и е идеална основа за разширяване към пълноценен 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 панел на вашия смартфон или компютър

  1. home/relays/relay1 до home/relays/relay4:
    • Управляват състоянието на четирите релета.
    • Payload стойности: “ON” за включване и “OFF" за изключване.
  2. home/sensors/analog1 до home/sensors/analog4:
    • Публикуват стойностите от аналоговите сензори.

Настройка на IoT MQTT Panel на смартфон

  1. Изтегляне на приложението:
    • Намерете IoT MQTT Panel в Google Play или App Store.
  2. Създаване на панел:
    • Име: Arduino MQTT Panel.
    • Брокер IP: 192.168.1.80. Заменете с IP на вашия брокер.
    • Порт: 1883.
    • Потребител и парола: USERNAME / PASSWORD.
  3. Добавяне на елементи (widgets):
    • Relay 1:
      • Тип: Switch.
      • Топик: home/relays/relay1.
      • Payload ON: ON.
      • Payload OFF: OFF.
    • Analog Sensor 1:
      • Тип: Text View.
      • Топик: home/sensors/analog1.
  4. Запазване и тестване:
    • Запазете настройките.
    • Тествайте управление на релетата и мониторинг на сензорите.

Заключение

Този проект демонстрира как да комбинирате Arduino, Ethernet и MQTT за управление и мониторинг в IoT приложения. С правилна настройка на MQTT панела, ще имате удобен и бърз достъп до устройството.

Translate »