// Пример за AI_IoT A. Toshkov
// Определение за библиотека
#include <WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
/************************* Определение на изводите *********************************/
const int LED_1 = 33; // HeaterContolPin = 33; LED_1 за визуализиране на управлението на нагревателя
const int LED_2 = 25; // За визуализиране на сигнал към реле или друго изходно устройство
const int LED_3 = 26; // За визуализиране на сигнал към реле или друго изходно устройство
const int VoltageAnalogInputPin = 32; // VoltageAnalogInputPin = 32
/************************* WiFi точка за достъп *********************************/
#define WLAN_SSID "Wokwi-GUEST"
#define WLAN_PASS ""
/************************* Настройка на Adafruit.io *********************************/
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 // използвайте 8883 за SSL
// Това е мястото, където трябва да поставите вашите идентификатори.
#define AIO_USERNAME "IoT_BFU"
#define AIO_KEY "aio_vbEQ73TLu64IPZXfgIMzFLrxnPxY"
/************ Глобално състояние (не е необходимо да го променяте!) ******************/
// Създаване на клас ESP8266 WiFiClient за свързване с MQTT сървъра.
WiFiClient client ;
// или... използвайте WiFiFlientSecure за SSL - WiFiClientSecure клиент;
// Настройте класа на MQTT клиента, като подадете данните за WiFi клиента и MQTT сървъра и данните за вход.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
/****************************** Adafruit Feeds ***************************************/
// Обърнете внимание, че пътищата на MQTT за AIO следват формата: <username>/feeds/<feedname>
// Настройка на канал (емисия), наречен 'onoff', за абониране за промени.
Adafruit_MQTT_Subscribe Out_1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/heater");
Adafruit_MQTT_Subscribe Out_2 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/relay2");
Adafruit_MQTT_Subscribe Out_3 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/relay3");
/*************************** Код на скицата ************************************/
void MQTT_connect();
void setup() {
Serial. begin(115200);
delay(10);
pinMode(LED_1, OUTPUT); // Индикация на нагревателя
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(VoltageAnalogInputPin, INPUT);
Serial. println(F("Adafruit MQTT demo. //Wait 10 sec."));
// Свързване към точка за достъп WiFi.
Serial. println(); Serial. println();
Serial. print("Свързване към ");
Serial. println(WLAN_SSID);
WiFi. begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial. print(".");
}
Serial. println();
Serial. println("WiFi свързан");
Serial. println("IP адрес: ");
Serial. println(WiFi.localIP());
// Настройка на абонамент за MQTT за захранване на onoff.
mqtt.subscribe(&Out_1);
mqtt.subscribe(&Out_2);
mqtt.subscribe(&Out_3);
}
void loop() {
// Уверете се, че връзката с MQTT сървъра е жива (това ще направи първата
// връзка и автоматично възстановяване на връзката при прекъсване на връзката). Вижте MQTT_connect
// дефиниция на функцията по-долу.
MQTT_connect();
// това е нашият зает подцикъл "изчакване на входящи абонаментни пакети
// опитайте се да прекарате времето си тук
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(20000))) {
// Четене на символа, пристигащ от Adafruit на Out_1 - от Feed "нагревател"
if (subscription == &Out_1) {
Serial. print(F("Нагревател (LED1 или Relay1 или друго изходно устройство 1) Има: "));
Serial. println((char *)Out_1.lastread);
int Out_1_State = atoi((char *)Out_1.lastread);
if (Out_1_State == 1) {
digitalWrite(LED_1, HIGH);
} else if (Out_1_State == 0) {
digitalWrite(LED_1, LOW);
}
Serial. println(Out_1_State);
}
// Четене на символа, пристигащ от Adafruit на Out_1 - от Feed "relay2"
if (subscription == &Out_2) {
Serial. print(F("LED_2, Relay2 или друго изходно устройство с номер 2 Got: "));
Serial. println((char *)Out_2.lastread);
int Out_2_State = atoi((char *)Out_2.lastread);
// digitalWrite(LED_2, Out_2_State); // Използва се за рза управление на релето или светодиодаеле
if (Out_2_State == 1) {
digitalWrite(LED_2, HIGH);
} else if (Out_2_State == 0) {
digitalWrite(LED_2, LOW);
}
}
// Четене на символа, пристигащ от Adafruit на Out_1 - от Feed "relay3"
if (subscription == &Out_3) {
Serial. print(F("LED_3, Relay3 или друго изходно устройство с номер 3 Got: "));
Serial. println((char *)Out_3.lastread);
int Out_3_State = atoi((char *)Out_3.lastread);
// digitalWrite(LED_3, Out_3_State); //Използва се за управление на релето или светодиода
if (Out_3_State == 1) {
digitalWrite(LED_3, HIGH);
} else if (Out_3_State == 0) {
digitalWrite(LED_3, LOW);
}
}
}
// ping на сървъра, за да поддържате връзката mqtt жива
// НЕ се изисква, ако публикувате веднъж на всеки KEEPALIVE секунди
/*
if(! mqtt.ping()) {
mqtt.disconnect();
}
*/
}
// Функция за свързване и повторно свързване, ако е необходимо, със сървъра MQTT.
// Трябва да се извика във функцията на цикъла и тя ще се погрижи за свързването.
void MQTT_connect() {
int8_t ret;
// Спрете, ако вече сте свързани.
if (mqtt.connected()) {
return;
}
Serial. print("Свързване с MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect ще върне 0 за свързан
Serial. println(mqtt.connectErrorString(ret));
Serial. println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // изчакайте 5 секунди
retries--;
if (retries == 0) {
// в общи линии умирам и чакам WDT да ме нулира
while (1);
}
}
Serial. println("MQTT Свързан!");
}