Categories
ESP8266 NodeMCU

DS18B20 и MQTT

В предишната статия разгледахме стъпките за инсталиране на MQTT брокер. Нека сега да тестваме сървъра при реални условия.

Ще използвам демото, в което измерихме температурата с DS18B20. Но вместо да показваме резултата на локален екран, ще изпратим информацията използвайки MQTT брокер.

Отново свързваме:

  • Пин 1 (левият) на DS18B20 с GND на NodeMCU;
  • Пин 2 (средният) на DS18B20 с D3 на NodeMCU;
  • Пин 3 (десният) на DS18B20 с 3v3 на NodeMCU;
  • Нужен е резистор от 4.7kΩ до 5kΩ между Пин 2 и Пин 3.

Инсталираме библиотеката PubSubClient

Няма да правя демо, което използва некриптирана връзка. Направо ще започнем със SSL без проверка.

Ето го и кода:

#include "OneWire.h"
#include "DallasTemperature.h"
#include "ESP8266WiFi.h"
#include "ESP8266HTTPClient.h"
#include "PubSubClient.h"


// 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";

float previousTemperatureC = 0;
unsigned int secondsCounter = 0;

// пин, на който е свързан DS18B20 на ESP8266 - D3
OneWire oneWire(D3);

DallasTemperature sensors(&oneWire);

BearSSL::WiFiClientSecure ClientSecure;
PubSubClient mqttClient(ClientSecure);

void setup() {
  Serial.begin(115200);

  // задаваме режим клиент на WiFi
  WiFi.mode(WIFI_STA);
  // задаваме SSID и парола за свързване
  WiFi.begin(ssid, password);
  
  // стартираме библиотеката за сензори
  sensors.begin();

  // не проверяваме валидността на сертификата
  ClientSecure.setInsecure();
  // намаляваме размера на буфера, за да спестим памет (не е съвместимо със всички сървъри)
  ClientSecure.setBufferSizes(512, 512);
  // задаваме хост и порт на MQTT клиента
  mqttClient.setServer(mqtt_server, mqtt_port);
}

void loop() {
  // проверяваме дали WiFi е свързан
  if (WiFi.status() == WL_CONNECTED) {
    // проверяваме дали сме свързани с MQTT
    if (!mqttClient.connected()) {
      // извеждаме съобщение
      Serial.println("Свързване с MQTT");
      // свързваме се с MQTT
      if (mqttClient.connect("TempSensor", mqtt_user, mqtt_pass)) {
        // извеждаме съобщение
        Serial.println("Успешно свързване с MQTT");
      } else {
        // извеждаме съобщение
        Serial.println("Невъзможно свързване с MQTT");
      }
    }
    // проверяваме дали сме свързани с MQTT
    if (mqttClient.connected()) {
      // правим заявка към температурния сензор
      sensors.requestTemperatures();
      // присвояваме температурата
      float temperatureC = sensors.getTempCByIndex(0);
      // извеждаме температурата в серийния монитор
      Serial.println(temperatureC);
      // увеличаваме брояча на секунди
      secondsCounter++;
      // проверяваме дали разликата в температурата е повече от 0.1 градуса или са изтекли 10 минути от предишното изпращане на данни
      if ((temperatureC > previousTemperatureC + 0.1) || (temperatureC < previousTemperatureC - 0.1) || (secondsCounter == 600)) {
        // зануляваме брояча на секунди
        secondsCounter = 0;
        // изпращаме текущата температура посредством MQTT
        // първият параметър е тема (topic), вторият е стойността, третрият е задържане (retain)
        mqttClient.publish("Temperature", String(temperatureC).c_str(), true);
        // записваме температура като предишна
        previousTemperatureC = temperatureC;
      }
      // обслужваме процесите на MQTT
      mqttClient.loop();
    }
  }

  // пауза една секунда
  delay(1000);
}

Как работи кода в loop – проверяваме дали има връзка с WiFi и MQTT. При успех прочитаме температурата от DS18B20 и извеждаме на серийния монитор. Ако температурата се различава с повече от 0.1 градуса от предишната комуникация с MQTT или са изтекли повече от 600 секунди (10 минути) тогава изпращаме данните с температурата през MQTT с опция задържане (retain).

Какво означава опция задържане?

Обикновено MQTT брокерът работи като една голяма разклонителна кутия. Ако получи сигнал 123 с етикет abc, то той ще изпрати сигнал 123 на всички абонирани за етикет abc, които в момента са на линия. Но ако някой нов абонат се присъедини след получаването на сигнала, той няма да получи нищо, докато нашето устройство не изпрати нов сигнал. Задържане (retain) казва на MQTT брокера, да запомни нашият сигнал, за да го предаде на новоприсъединилите се клиенти.

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

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