Categories
ESP32 ESP8266 NodeMCU

ESP32, SSD1306 и MQTT

В предишната статия показахме как се публикува съобщение чрез 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 разполага с достатъчно оперативна памет, че да може да си позволим да прахосаме няколко килобайта повече.

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *