В предишната статия показахме как се публикува съобщение чрез MQTT, нека сега се абонираме за MQTT тема (topic).
За целта ще използваме ESP32 и екран SSD1306. С тяхна помощ ще извеждаме резултата получен от предишното демо.
Нека свържем:
GNDна екрана къмGNDнаESP32;VINна екрана към3V3наESP32;SCLна екрана къмSCL (D22)наESP32;SDAна екрана къмSDA (D21)наESP32.
За да може нашата среда Arduino да работи с ESP32 трябва първо да инсталираме нужните библиотеки.
- Стартирайте
Arduino; - Отворете
File > Preferences; - В полето
Additional Boards Manager URLsнатиснете прозорчетата; - В отворилия се прозорец добавете на нов ред
https://dl.espressif.com/dl/package_esp32_index.jsonи натиснетеOkи пакOkна предишния прозорец;

- Отворете
Tools > Board: "…" > Boards Managerи инсталирайтеesp32платформата;

- Изберете
Tools > Board: "..." > ESP32 Arduino > ESP32 Wrover Module.
Ето и малко код за размисъл:
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
#include "WiFi.h"
#include "WiFiClientSecure.h"
#include "PubSubClient.h"
#define SCREEN_WIDTH 128 // OLED широчина на екрана в пиксели
#define SCREEN_HEIGHT 32 // OLED височина на екрана в пиксели
// SSID и парола на домашната ви мрежа
const char *ssid = "TechPotWin";
const char *password = "techpotpass";
const char* mqtt_server = "techpot.w-lab.win";
const int mqtt_port = 8883;
const char* mqtt_user = "techpotwin";
const char* mqtt_pass = "techpotpass";
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
WiFiClientSecure ClientSecure;
PubSubClient mqttClient(ClientSecure);
void setup() {
Serial.begin(115200);
Serial.println();
// I2C адресът е 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// изчистваме буфера
display.clearDisplay();
// чертаем една хоризонтална линия
display.drawLine(0, 7, display.width()-1, 7, WHITE);
// задаваме размер на шрифта
display.setTextSize(1);
// задаваме цвят на шрифта
display.setTextColor(WHITE);
// задаваме позиция на текста
display.setCursor(0, 8);
// извеждаме текст
display.println("TechPot.w-lab.win");
// до сега рисувахме в буфер.
// за да направим промените видими трябва да извикаме display.display();
display.display();
// задаваме режим клиент на WiFi
WiFi.mode(WIFI_STA);
// задаваме параметри за връзка с WiFi
WiFi.begin(ssid, password);
Serial.println("Свързване с WiFi");
// изчакваме успешна връзка с WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
// задаваме хост и порт на MQTT клиента
mqttClient.setServer(mqtt_server, mqtt_port);
Serial.println("Свързване с MQTT");
while (!mqttClient.connected()) {
// свързваме се с MQTT
if (mqttClient.connect("TempScreen", mqtt_user, mqtt_pass)) {
// извеждаме съобщение
Serial.print("Успешно свързване с MQTT");
// задаваме функция за обратно обаждане
mqttClient.setCallback(mqttCallback);
// абонираме се
mqttClient.subscribe("Temperature");
} else {
// извеждаме съобщение
Serial.print("Невъзможно свързване с MQTT");
}
delay(500);
Serial.print(".");
}
Serial.println();
}
// функция за обратно обаждане
void mqttCallback(char* topic, byte* payload, unsigned int length) {
// ако темата е Temperature
if (strcmp(topic, "Temperature") == 0) {
// конвертираме в стринг
payload[length] = '\0';
String temperatureC = String((char*)payload);
// извеждаме в серийния монитор
Serial.println(temperatureC);
// изчертаваме черен правоъгълник за да изтрием предишния резултат
display.fillRect(0, 18, display.width(), 8, BLACK);
// задаваме позиция на текста
display.setCursor(0, 18);
// извеждаме текст
display.print("Temp: ");
// извеждаме текст с текущата температура
display.print(temperatureC);
// извеждаме текст
display.print(" C");
// рисуваме знакът за градус °
display.drawCircle(68, 19, 1, WHITE);
// извеждаме буфера на екрана
display.display();
}
}
void loop() {
// проверяваме дали сме свързани с MQTT
if (mqttClient.connected()) {
// обслужваме процесите на MQTT
mqttClient.loop();
}
}
И резултата:

Голям минус е, че няма BearSSL библиотека за ESP32, но от друга страна ESP32 разполага с достатъчно оперативна памет, че да може да си позволим да прахосаме няколко килобайта повече.
