Arduino IDE

Напишем программу в среде Arduino IDE.

Для работы будем использовать библиотеку PubSubClient. Её можно скачать по ссылке из репозитория на github, или установить с помощью менеджера библиотек в Arduino IDE.

Пусть, тестовая программа будет каждые пять секунд отправлять MQTT брокеру значение обычного счётчика.

#include <WiFi.h>
#include <PubSubClient.h>

// реквизиты WiFi
const char* ssid = "X-COM-CITADEL"; // имя точки доступа WiFi
const char* password = "id7dq8d-"; // пароль к точке доступа WiFi
const char* mqtt_username = "user_3ad51bab"; // имя пользователя MQTT
const char* mqtt_password = "************"; // пароль пользователя MQTT
const char* mqtt_client_id = "user_3ad51bab_test"; // идентификатор клиента MQTT

// брокер MQTT
const char* mqtt_server = "mqtt.robotclass.ru";

// тема сообщений
const char* mqtt_topic = "user_3ad51bab/data";

// инициализация WiFi и MQTT
WiFiClient espClient;
PubSubClient client(espClient);

int cnt = 0;

void setup() {
    // запуск WiFi
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
    }

    // настройка клиента MQTT
    client.setServer(mqtt_server, 1883);
}

void loop() {
    if (!client.connected()) {
        if (!client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
            return;
        }
    }

    client.publish(mqtt_topic, String(cnt).c_str());

    cnt++;

    delay(5000);
}

Метод publish принимает два аргумента: тему сообщения и текст сообщение. Второй аргумент должен иметь тип const char*. Для преобразования счётчика типа int в тип const char* используем встроенный в Arduino тип String.

Загружаем программу на Графит-S3 и смотрим панель управления. Число в блоке data должно увеличиваться на единицу каждые 5 секунд.

Приём сообщений

Теперь изменим программу так, чтобы наше устройство смогло ещё и получать сообщения от MQTT брокера.

Добавим функцию-обработчик событий MQTT, которая будет вызывать каждый раз, когда приходит сообщение. Пусть при получении сообщения с темой user_3ad51bab/switch на плате Графит-S3 будет включаться или выключаться штатный светодиод.

void callback(char* topic, byte* payload, unsigned int length) {
    digitalWrite(LED_BUILTIN, payload[0]);
}

Эта функция имеет три аргумента:

  • topic — тема сообщения, строка типа char*;
  • payload — сообщение, массив байт;
  • length — количество байт в сообщении.
Важно! Если в MQTT сообщении была отправлена строка, то функция-обработчик получит только массив букв этой строки, без нулевого символа в конце.

В setup укажем эту функцию, сразу после настройки реквизитов брокера:

client.setServer(mqtt_server, 1883);
client.setCallback(callback);

А в суперцикл программы добавим вызов обработчика событий:

void loop() {
    client.loop();

Чтобы не пропустить события избавимся от явной паузы в суперцикле: time.sleep(5). Организуем отправку сообщений с помощью таймаута.

Полный код программы

#include <WiFi.h>
#include <PubSubClient.h>

// реквизиты WiFi
const char* ssid = "X-COM-CITADEL"; // имя точки доступа WiFi
const char* password = "id7dq8d-"; // пароль к точке доступа WiFi
const char* mqtt_username = "user_3ad51bab"; // имя пользователя MQTT
const char* mqtt_password = "MljV7p1Yb9ln"; // пароль пользователя MQTT
const char* mqtt_client_id = "user_3ad51bab_test"; // идентификатор клиента MQTT

// брокер MQTT
const char* mqtt_server = "mqtt.robotclass.ru";

// тема сообщений
const char* mqtt_pub_topic = "user_3ad51bab/data";
const char* mqtt_sub_topic = "user_3ad51bab/switch";

// инициализация WiFi и MQTT
WiFiClient espClient;
PubSubClient client(espClient);

unsigned long publish_next = 0;
unsigned int publish_to = 5000;
int cnt = 0;

void callback(char* topic, byte* payload, unsigned int length) {
    if( payload[0] == '1' )
        digitalWrite(LED_BUILTIN, HIGH);
    else
        digitalWrite(LED_BUILTIN, LOW);
}

void setup() {
    // настраиваем контакт светодиода
    pinMode(LED_BUILTIN, OUTPUT);

    // запуск WiFi
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
    }

    // настройка клиента MQTT
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);
}

void loop() {
    if (!client.connected()) {
        if (client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
            client.subscribe(mqtt_sub_topic);
        } else {
            return;
        }
    }

    unsigned long t = millis();
    if( t > publish_next ){
        publish_next = t + publish_to;
        client.publish(mqtt_pub_topic, String(cnt).c_str());
        cnt++;
    }

    client.loop();
}

Загружаем программу на Графит-S3 и открываем панель управления. Нажимаем кнопку свет и на отладочной плате зажигается светодиод.


Изменено: