który wygląda tak:
- #include <ESP8266WiFi.h>
- #include <PubSubClient.h>
- // Ustawienia Wi-Fi
- const char* ssid = "Nazwa sieci";
- const char* password = "Hasło sieci";
- // Ustawienia MQTT
- const char* mqtt_server = "adres IP serwera MQTT";
- const int mqtt_port = 1883;
- const char* mqtt_user = "Nazwa użytkownika MQTT";
- const char* mqtt_password = "Hasło MQTT";
- const char* mqtt_topic_pk1 = "wlacznik/przekaznik1";
- const char* mqtt_topic_pk2 = "wlacznik/przekaznik2";
- const char* mqtt_topic_s_pk1 = "wlacznik/przekaznik1/status";
- const char* mqtt_topic_s_pk2 = "wlacznik/przekaznik2/status";
- // Piny podłączenia przekaźników
- const int przekaznik1 = 12; // Pin przekaźnika 1
- const int przekaznik2 = 13; // Pin przekaźnika 2
- // Inicjalizacja klienta Wi-Fi
- WiFiClient espClient;
- PubSubClient client(espClient);
- // Funkcja obsługująca otrzymane wiadomości MQTT
- void callback(char* topic, byte* payload, unsigned int length)
- {
- // Konwertuj payload na string
- String message = "";
- for (int i = 0; i < length; i++)
- {
- message += (char)payload[i];
- }
- // Sprawdź, czy otrzymano wiadomość dla przekaźnika 1
- if (String(topic) == mqtt_topic_pk1)
- {
- if (message == "ON")
- {
- digitalWrite(przekaznik1, HIGH); // Włącz przekaźnik 1
- client.publish(mqtt_topic_s_pk1, "ON");
- }
- else if (message == "OFF")
- {
- digitalWrite(przekaznik1, LOW); // Wyłącz przekaźnik 1
- client.publish(mqtt_topic_s_pk1, "OFF");
- }
- }
- // Sprawdź, czy otrzymano wiadomość dla przekaźnika 2
- else if (String(topic) == mqtt_topic_pk2)
- {
- if (message == "ON")
- {
- digitalWrite(przekaznik2, HIGH); // Włącz przekaźnik 2
- client.publish(mqtt_topic_s_pk2, "ON");
- }
- else if (message == "OFF")
- {
- digitalWrite(przekaznik2, LOW); // Wyłącz przekaźnik 2
- client.publish(mqtt_topic_s_pk2, "OFF");
- }
- }
- }
- void setup()
- {
- Serial.begin(115200);
- // Inicjalizacja pinów przekaźników
- pinMode(przekaznik1, OUTPUT);
- pinMode(przekaznik2, OUTPUT);
- // Inicjalizacja połączenia Wi-Fi
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(1000);
- Serial.println("Laczenie z WiFi...");
- }
- Serial.println("Polaczono");
- // Inicjalizacja klienta MQTT
- client.setServer(mqtt_server, mqtt_port);
- client.setCallback(callback);
- }
- void reconnect()
- {
- // Pętla czekająca na ponowne połączenie z brokerem MQTT
- while (!client.connected())
- {
- Serial.println("Nawiazuje polaczenie z Brokerem MQTT...");
- // Proba połączenia z klientem MQTT
- if (client.connect("ESP8266Client", mqtt_user, mqtt_password))
- {
- Serial.println("Polaczono.");
- // Subskrybuj tematy przekaźników
- client.subscribe(mqtt_topic_pk1);
- client.subscribe(mqtt_topic_pk2);
- }
- else
- {
- Serial.print("Blad, rc=");
- Serial.print(client.state());
- Serial.println(" Ponowna proba za 5sek...");
- delay(5000);
- }
- }
- }
- void loop() {
- // Sprawdź, czy klient MQTT jest połączony
- if (!client.connected())
- {
- reconnect();
- }
- // Obsługa komunikacji MQTT
- client.loop();
- }
ale oczywiście nic nie sto i na przeszkodzie by napisać ten kod z użyciem ESP-IDF co może wyglądać tak,
niemniej wydało mi się że do tak prostego zadania Arduino`wystarczy.
- #include <stdio.h>
- #include <string.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "freertos/event_groups.h"
- #include "esp_wifi.h"
- #include "esp_event.h"
- #include "esp_log.h"
- #include "nvs_flash.h"
- #include "mqtt_client.h"
- #include "driver/gpio.h"
- // Ustawienia Wi-Fi
- #define WIFI_SSID "Nazwa sieci"
- #define WIFI_PASS "Hasło sieci"
- #define WIFI_MAX_RETRY 5
- // Ustawienia MQTT
- #define MQTT_BROKER_URI "mqtt://adres_IP_serwera_MQTT"
- #define MQTT_USERNAME "Nazwa użytkownika MQTT"
- #define MQTT_PASSWORD "Hasło MQTT"
- #define MQTT_TOPIC_PK1 "wlacznik/przekaznik1"
- #define MQTT_TOPIC_PK2 "wlacznik/przekaznik2"
- #define MQTT_TOPIC_S_PK1 "wlacznik/przekaznik1/status"
- #define MQTT_TOPIC_S_PK2 "wlacznik/przekaznik2/status"
- // Piny GPIO
- #define GPIO_RELAY1 12
- #define GPIO_RELAY2 13
- // Log tag
- static const char *TAG = "MQTT_RELAY";
- // Wi-Fi event group
- static EventGroupHandle_t s_wifi_event_group;
- #define WIFI_CONNECTED_BIT BIT0
- #define WIFI_FAIL_BIT BIT1
- static int s_retry_num = 0;
- esp_mqtt_client_handle_t mqtt_client = NULL;
- // Funkcja obsługi zdarzeń Wi-Fi
- static void wifi_event_handler(void* arg, esp_event_base_t event_base,
- int32_t event_id, void* event_data) {
- if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
- esp_wifi_connect();
- } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
- if (s_retry_num < WIFI_MAX_RETRY) {
- esp_wifi_connect();
- s_retry_num++;
- ESP_LOGI(TAG, "Ponowne laczenie do sieci Wi-Fi...");
- } else {
- xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
- }
- } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
- ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
- ESP_LOGI(TAG, "Uzyskano adres IP: %s", ip4addr_ntoa(&event->ip_info.ip));
- s_retry_num = 0;
- xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
- }
- }
- // Inicjalizacja Wi-Fi
- void wifi_init_sta(void) {
- s_wifi_event_group = xEventGroupCreate();
- ESP_ERROR_CHECK(esp_netif_init());
- ESP_ERROR_CHECK(esp_event_loop_create_default());
- esp_netif_create_default_wifi_sta();
- wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
- ESP_ERROR_CHECK(esp_wifi_init(&cfg));
- esp_event_handler_instance_t instance_any_id;
- esp_event_handler_instance_t instance_got_ip;
- ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
- ESP_EVENT_ANY_ID,
- &wifi_event_handler,
- NULL,
- &instance_any_id));
- ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
- IP_EVENT_STA_GOT_IP,
- &wifi_event_handler,
- NULL,
- &instance_got_ip));
- wifi_config_t wifi_config = {
- .sta = {
- .ssid = WIFI_SSID,
- .password = WIFI_PASS,
- },
- };
- ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
- ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
- ESP_ERROR_CHECK(esp_wifi_start());
- ESP_LOGI(TAG, "Inicjalizacja Wi-Fi zakończona.");
- EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
- WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
- pdFALSE,
- pdFALSE,
- portMAX_DELAY);
- if (bits & WIFI_CONNECTED_BIT) {
- ESP_LOGI(TAG, "Polaczono z Wi-Fi: %s", WIFI_SSID);
- } else if (bits & WIFI_FAIL_BIT) {
- ESP_LOGE(TAG, "Nie udalo sie polaczyc z Wi-Fi.");
- } else {
- ESP_LOGE(TAG, "Nieznany blad podczas laczenia z Wi-Fi.");
- }
- }
- // Funkcja obsługi wiadomości MQTT
- static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
- esp_mqtt_event_handle_t event = (esp_mqtt_event_handle_t) event_data;
- switch ((esp_mqtt_event_id_t)event_id) {
- case MQTT_EVENT_CONNECTED:
- ESP_LOGI(TAG, "Polaczono z MQTT brokerem");
- esp_mqtt_client_subscribe(mqtt_client, MQTT_TOPIC_PK1, 0);
- esp_mqtt_client_subscribe(mqtt_client, MQTT_TOPIC_PK2, 0);
- break;
- case MQTT_EVENT_DISCONNECTED:
- ESP_LOGI(TAG, "Rozlaczono z MQTT brokerem");
- break;
- case MQTT_EVENT_DATA:
- ESP_LOGI(TAG, "Otrzymano dane z MQTT: topic=%.*s, data=%.*s",
- event->topic_len, event->topic, event->data_len, event->data);
- if (strncmp(event->topic, MQTT_TOPIC_PK1, event->topic_len) == 0) {
- if (strncmp(event->data, "ON", event->data_len) == 0) {
- gpio_set_level(GPIO_RELAY1, 1);
- esp_mqtt_client_publish(mqtt_client, MQTT_TOPIC_S_PK1, "ON", 0, 0, 0);
- } else if (strncmp(event->data, "OFF", event->data_len) == 0) {
- gpio_set_level(GPIO_RELAY1, 0);
- esp_mqtt_client_publish(mqtt_client, MQTT_TOPIC_S_PK1, "OFF", 0, 0, 0);
- }
- } else if (strncmp(event->topic, MQTT_TOPIC_PK2, event->topic_len) == 0) {
- if (strncmp(event->data, "ON", event->data_len) == 0) {
- gpio_set_level(GPIO_RELAY2, 1);
- esp_mqtt_client_publish(mqtt_client, MQTT_TOPIC_S_PK2, "ON", 0, 0, 0);
- } else if (strncmp(event->data, "OFF", event->data_len) == 0) {
- gpio_set_level(GPIO_RELAY2, 0);
- esp_mqtt_client_publish(mqtt_client, MQTT_TOPIC_S_PK2, "OFF", 0, 0, 0);
- }
- }
- break;
- default:
- break;
- }
- }
- // Inicjalizacja MQTT
- void mqtt_app_start(void) {
- esp_mqtt_client_config_t mqtt_cfg = {
- .uri = MQTT_BROKER_URI,
- .username = MQTT_USERNAME,
- .password = MQTT_PASSWORD,
- };
- mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
- esp_mqtt_client_register_event(mqtt_client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
- esp_mqtt_client_start(mqtt_client);
- }
- // Funkcja glówna
- void app_main(void) {
- // Inicjalizacja NVS
- esp_err_t ret = nvs_flash_init();
- if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
- ESP_ERROR_CHECK(nvs_flash_erase());
- ret = nvs_flash_init();
- }
- ESP_ERROR_CHECK(ret);
- // Inicjalizacja GPIO
- gpio_config_t io_conf = {
- .pin_bit_mask = (1ULL << GPIO_RELAY1) | (1ULL << GPIO_RELAY2),
- .mode = GPIO_MODE_OUTPUT,
- .pull_up_en = GPIO_PULLUP_ENABLE,
- .pull_down_en = GPIO_PULLDOWN_DISABLE,
- .intr_type = GPIO_INTR_DISABLE
- };
- gpio_config(&io_conf);
- // Uruchomienie Wi-Fi i MQTT
- wifi_init_sta();
- mqtt_app_start();
- }