Esp+ds18b20+mqtt

Mam kod który odczytuje stan czujnika temperatury i wysyła go poprzez MQTT do HA.
Problem w tym że działa tylko przy odczycie stanu temperatury do 23s. Powyżej tego czasu, wartości są wysyłane (czytam z monitora COM) lecz nie trafiaja do HA jak i do MQTT Explorera.
Chciałbym ustawić dłuższy okres czasu odpytywania.
Czy ktoś może wskazać mi błąd gdzie popełniam. Pingowanie działa przez cały czas, więc to nie błąd połączenia Wifi.

Poniżej kod:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h> 

// WiFi
const char* ssid = "xxx";
const char* wifi_password = "xxx";

// MQTT
const char* mqtt_server = "x.x.x.x";
const char* mqtt_topic = "Temperatura";
const char* mqtt_username = "xxx";
const char* mqtt_password = "xxx";
const char* clientID = "Czujnik_2";

// ds18b20 GPIO pin
const int oneWireBus = 4;

// Initialise the WiFi and MQTT Client objects
WiFiClient wifiClient;
PubSubClient client(mqtt_server, 1883, wifiClient); // 1883 is the listener port for the Broker

// oneWire instance 
OneWire oneWire(oneWireBus);

// Pass oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  Serial.print("Connecting to ");
  Serial.println(ssid);
  // Connect to the WiFi
  WiFi.begin(ssid, wifi_password);
  // Wait until the connection has been confirmed before continuing
  while (WiFi.status() != WL_CONNECTED) {
    delay(5000);
    Serial.print(".");
  }
  // Debugging - Output the IP Address of the ESP8266
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  // Connect to MQTT Broker
  // client.connect returns a boolean value to let us know if the connection was successful
  if (client.connect(clientID, mqtt_username, mqtt_password)) {
    Serial.println("Connected to MQTT Broker!");
  }
  else {
    Serial.println("Connection to MQTT Broker failed...");
  }
   sensors.begin();
}
void loop() {
  sensors.setResolution(11);
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);
  Serial.print(tempC);
  client.publish(mqtt_topic, String(tempC).c_str(), true);
  delay(22000);
}

Może rozłącza cię z brokerem, a ten PubSubClient nie odnawia połączenia?
Ja bym na początek spróbował w pętli loop sprawdzać czy jest połączony i wyświetlać na serialu.

A w ogóle nie lepiej wgrać ESPEasy?

Delay() powinno być zabronione :slight_smile:
Zamiast delay, zrób loop’a nieblokującego.

void loop() {
  if (millis() - lastMillis > 1 * 60 * 1000UL) {  // get values every 1 minute
    lastMillis = millis();
    getValues = true;
 }

  if (getValues) {
     getValues = false;
     sensors.setResolution(11);
     sensors.requestTemperatures();
     float tempC = sensors.getTempCByIndex(0);
     Serial.print(tempC);
     client.publish(mqtt_topic, String(tempC).c_str(), true);
  }
}

…lub bardziej złożony harmonogram

Aż taki dobry to nie jestem w tym.
Dopiero raczkuje w ESP, przez weekend coś spróbuję ogarnąć.
Dziękuję za podpowiedzi.

No dobra, ESPeasy wgrane, teraz pytanie czy lepiej wysylac dane przez MQTT czy też zaimplementować ESPHome do HA

Po co wymyślać koło na nowo? Zastosuj ESPHome lub Tasmota. ESPHome działa po API, Tasmota potrzebuje do komunikacji z HA MQTT.

Są różne motywacje, jeden potrzebuje coś “zrobić” i zapomnieć, drugi przy okazji czegoś nauczyć.
Traktowanie Tasmota itp. jako “pacaneum” na wszystko prowadzi do myślenia, że gdy czegoś nie obsługuje to to nie istnieje :wink:
Zauważ ile jest tematów p.t.“Tasmota… problem”. W niektórych przypadkach łatwiej napisać 10 linijek kodu niż przeglądać morze opcji i działa to zgodnie oczekiwaniami.
Podobne myślenie pokutuje o NR.
Ponieważ potrafiłbym to zrobić na “piechotę” - jako mało interesujący projekt też użyłbym tasmoty.
“… po co pocierasz te dwa patyki, zamiast jak normalny człowiek poczekać na burzę…” :wink:

Po co pocierasz te dwa patyki, zamiast jak normalny człowiek użyć zapalniczki… :wink:

1 Like

No dobra Panowie, schodzimy z tematu.
Na jednych zainstalowałem ESP easy + bramka MQTT, na innych przez HA ESPhome.
Pytanie co do pierwszego sposobu, w jaki sposób można kontrolować czy dany czujnik lub ESP jest podłączony i “żyje”?
W ESPhome, jest odrazu informacja Unvailable co jest bardzo przydatne.

I jeszcze jedno pytanie: jak skonfigurować yaml do wgrania esp, przy podłączeniu DS18b20 do dwóch osobnych GPIO np D4 i D5.

taka opcja i pochodne nie działają :frowning:

dallas:
  - pin: GPIO4
sensor:
  - platform: dallas
    name: "Czujnik 03-1"
    address: "0xfc3c01b556059028"

  - pin: GPIO5
sensor:
  - platform: dallas
    name: "Czujnik 03-2"
    address: "0xea3c01f096432328"

Jeśli się nie mylę integracja 1-wire w ESPHome jest taka dość uboga i umożliwia użycie tylko jednej magistrali.

Jakkolwiek korzystając z tego faktu możesz podpiąć oba czujniki do tego samego GPIO (dzięki wykorzystaniu adresowania można podpiąć więcej niż 2).

W takim wypadku będziesz miał jakoś tak

dallas:
  - pin: GPIO4
sensor:
  - platform: dallas
    name: "Czujnik 03-1"
    address: "0xfc3c01b556059028"
  - platform: dallas
    name: "Czujnik 03-2"
    address: "0xea3c01f096432328"

Dziękuje, również to doczytałem na innych forach,
W Tasmocie też nie mogę skonfigurować aby na osobnych GPIO mieć podpięte czujniki, działa tylko pod jedno GPIO, z różnym adresowaniem.
Wybór pada na espeasy +mqtt, jeszcze tylko musze znaleźć informację, jak kontrolować czy jest łączność między HA a modułami z czujnikami.

Jest w ustawieniach MQTT