Управление на релета и сензори с 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). Тези релета са свързани към дигиталните изходи на ArduinoD2, 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 »