ESP32 и MicroPython: MQTT yправление на релета и изпращане на аналогови данни

ESP32 и MQTT Управление на релета и изпращане на аналогови данни

Въведение

Интернет на нещата (IoT) е изключително разрастваща се област, която позволява на устройства да комуникират помежду си и да се управляват дистанционно. В тази статия ще създадем IoT проект, използвайки ESP32 микроконтролер и MQTT протокол за комуникация. Проектът включва две основни функции:

  1. Управление на релета чрез MQTT команди.
  2. Изпращане на аналогови данни (например от сензор) към MQTT сървър за наблюдение.

Преди да сме започнали трябва да инсталираме MQTT сървър на някоя Linux машина. Вече сме обяснили как става това в нашите статии:

Ще програмираме ESP32 C3 Super Mini с MicroPython, ще обясним всяка част от кода и ще настроим мобилното приложение IoT MQTT Panel, за да управляваме устройствата и наблюдаваме данните в реално време.


Схема на свързване на ESP32 и MicroPython: MQTT yправление на релета и изпращане на аналогови данни

На схемата отдолу ще намерите опроводяването на схемата:

ESP32 и MicroPython MQTT yправление на релета и изпращане на аналогови данни схема

Код

import network
import time
import machine
from umqtt.simple import MQTTClient

# Конфигурация на WiFi и MQTT
SSID = "..........."  # Име на WiFi мрежата
PASSWORD = "............."  # Парола на WiFi мрежата
MQTT_SERVER = "............... "  # Адрес на MQTT сървъра
MQTT_PORT = 1883  # Порт на MQTT сървъра
MQTT_USER = "................"  # Потребителско име за MQTT
MQTT_PASSWORD = ".............."  # Парола за MQTT
MQTT_CLIENT_ID = "ESP32Client"  # Идентификатор на MQTT клиента
MQTT_TOPIC_COMMAND = "esp32/command"  # Тема за получаване на команди
MQTT_TOPIC_DATA = "esp32/data"  # Тема за изпращане на данни

# Конфигурация на пинове за релета и аналогов вход
RELAY_PIN_1 = machine.Pin(5, machine.Pin.OUT)  # Пин за реле 1 (D3)
RELAY_PIN_2 = machine.Pin(6, machine.Pin.OUT)  # Пин за реле 2 (D4)
ANALOG_PIN = machine.ADC(0)  # Аналогов вход (A0)

# Функция за свързване към WiFi
def connect_to_wifi():
    wlan = network.WLAN(network.STA_IF)  # Инициализиране на WLAN интерфейса
    wlan.active(True)  # Активиране на WLAN
    wlan.connect(SSID, PASSWORD)  # Свързване към WiFi мрежата
    while not wlan.isconnected():  # Изчакване на свързване
        print("Connecting to WiFi...")
        time.sleep(0.5)  # Изчакване преди повторна проверка
    print("Connected to WiFi:", wlan.ifconfig())  # Показване на IP адреса

# Функция за обработка на получени MQTT съобщения
def mqtt_callback(topic, msg):
    print("Message received on topic:", topic.decode(), "Message:", msg.decode())
    if topic.decode() == MQTT_TOPIC_COMMAND:  # Проверка дали темата е за команди
        if msg.decode() == "on_1":  # Включване на реле 1
            RELAY_PIN_1.value(1)
            print("Relay-1 ON")
        elif msg.decode() == "off_1":  # Изключване на реле 1
            RELAY_PIN_1.value(0)
            print("Relay-1 OFF")
        elif msg.decode() == "on_2":  # Включване на реле 2
            RELAY_PIN_2.value(1)
            print("Relay-2 ON")
        elif msg.decode() == "off_2":  # Изключване на реле 2
            RELAY_PIN_2.value(0)
            print("Relay-2 OFF")

# Основна функция на програмата
def main():
    connect_to_wifi()  # Свързване към WiFi

    # Инициализиране на MQTT клиента
    client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, port=MQTT_PORT, user=MQTT_USER, password=MQTT_PASSWORD)
    client.set_callback(mqtt_callback)  # Задаване на функция за обработка на съобщения
    client.connect()  # Свързване към MQTT сървъра
    print("Connected to MQTT server")
    client.subscribe(MQTT_TOPIC_COMMAND)  # Абониране за темата с команди

    try:
        while True:
            client.check_msg()  # Проверка за нови съобщения

            # Четене на аналогова стойност и изпращане на данни
            analog_value = ANALOG_PIN.read()  # Четене на стойността от аналоговия вход
            client.publish(MQTT_TOPIC_DATA, str(analog_value))  # Изпращане на стойността по MQTT
            time.sleep(1)  # Изчакване преди следващото изпращане
    except KeyboardInterrupt:  # Обработка на прекъсване от клавиатурата
        print("Disconnected from MQTT server")
        client.disconnect()  # Изключване от MQTT сървъра

# Проверка дали скриптът се изпълнява директно
if __name__ == "__main__":
    main()  # Извикване на основната функция

Подробно обяснение на кода

1. Импортиране на библиотеки

  • network – библиотека за управление на WiFi мрежата.
  • time – предоставя функции за изчакване между операции.
  • machine – позволява работа с хардуерните пинове на ESP32.
  • umqtt.simple – лека MQTT библиотека за MicroPython.

2. Конфигурация на WiFi и MQTT

  • SSID и PASSWORD: Параметри за свързване към локална WiFi мрежа.
  • MQTT_SERVER и MQTT_PORT: Адрес и порт на MQTT брокера (напр. Mosquitto).
  • MQTT_USER и MQTT_PASSWORD: Данни за автентикация към MQTT сървъра.
  • MQTT_TOPIC_COMMAND: Темата, по която ESP32 ще получава команди (например “on_1”, “off_1”).
  • MQTT_TOPIC_DATA: Темата, по която ESP32 ще публикува аналоговите стойности.

3. Конфигурация на пинове

  • machine.Pin(5, machine.Pin.OUT) – задава GPIO 5 като изход за управление на реле 1.
  • machine.Pin(6, machine.Pin.OUT)GPIO 6 се използва за реле 2.
  • machine.ADC(0) – конфигурира A0 като аналогов вход (например сензор за температура или напрежение).

4. Свързване към WiFi

Функцията connect_to_wifi() използва network.WLAN за инициализация на мрежовия интерфейс и свързване към WiFi. Тя чака, докато връзката бъде успешна и извежда IP адреса на устройството.

5. Обработка на MQTT съобщения

Функцията mqtt_callback() се активира при получаване на съобщение:

  • on_1 / off_1: Включване/изключване на реле 1.
  • on_2 / off_2: Включване/изключване на реле 2.

6. Основен цикъл на програмата

  • client.check_msg(): Проверява за нови съобщения по командната тема.
  • ANALOG_PIN.read(): Чете аналоговата стойност и я публикува на MQTT_TOPIC_DATA.
  • Изчакване: Добавен е интервал от 1 секунда между публикациите.

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

Какво представлява IoT MQTT Panel?

IoT MQTT Panel е мобилно приложение, което ви позволява да контролирате и наблюдавате MQTT базирани IoT проекти. Можете да създавате панели за визуализация на данни и управление на устройства.

Без да искаме да правим реклама, ние използваме този MQTT panel: IoT MQTT Panel. Има безплатна версия с която може да тествате вашия проект.


Стъпки за настройка

  1. Инсталация на приложението
    • Изтеглете IoT MQTT Panel от Google Play Store или App Store.
  2. Добавяне на MQTT сървър
    • Отворете приложението и добавете нов MQTT сървър:
      • Host: Адресът на вашия MQTT брокер (напр. 192.168.1.100).
      • Port: 1883 (стандартен порт).
      • Username/Password: Въведете вашите данни за автентикация.
      • Запазете настройките.
  3. Добавяне на панели
    • Добавяне на бутони за управление на релета:
      • Panel Type: Button Panel.
      • Panel Name: Relay 1 Control.
      • Topic: esp32/command.
      • Payload ON: on_1.
      • Payload OFF: off_1.
      Повторете същото за реле 2 с Payload ON = on_2 и Payload OFF = off_2.
    • Добавяне на панел за данни:
      • Panel Type: Text Display.
      • Panel Name: Analog Sensor Data.
      • Topic: esp32/data.
      • Данните ще се показват в реално време.
  4. Тестване
    • Използвайте бутоните в приложението, за да управлявате релетата.
    • Наблюдавайте стойностите от аналоговия вход в текстовия панел.

Заключение

Този проект демонстрира как ESP32 може да се използва като MQTT клиент за управление на устройства и изпращане на данни. Чрез интеграция с IoT MQTT Panel, можете да създадете лесен и интуитивен интерфейс за контрол и мониторинг. Този подход е идеален за автоматизация на дома, управление на сензори и други IoT приложения.

Translate »