Stránka 1 z 1

Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 03 kvě 2022, 08:42
od dandy010
Prosím o pomoc.
Jsem úplný začátečník a vymyslel jsem si projekt teploměru s Wemos D1 mini, oled displejem, led diodou, upozorňující na vysokou vlhkost s čídlem dht22.
Teploměr data odesílá pomocí mqtt na broker Mosquitto na serveru HomeAssistant. Tyto funkce fungují bez problémů.
Dále mám druhý teploměr venku, kde je pouze wemos d1 mini a čidlo ds18b20 a opět odesílá data na broker.
Kód jsem poslepoval z toho co jsem našel na internetu.
Problém mám se zobrazením venkovní teploty na displeji teploměru s displejem. V HomeAssistantu se venkovní teplota ukazuje a aktualizuje správně, ale na displeji s velkým zpožděním a nebo zůstává stále stejná (neaktualizuje se). Už dva týdny se snažím přijít na to, kde je chyba.
Snad jsem to popsal dost srozumitelně. Předem děkuji za případné rady.
Přikládám kód:

Kód: Vybrat vše

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <U8g2lib.h>
#include <DHT.h>

#define wifi_ssid "xxxxxx"
#define wifi_password "xxxxxx"

#define mqtt_server "192.168.1.104"
#define mqtt_client_id "teplomer_kuchyn"
#define mqtt_user "xxx"
#define mqtt_password "xxxxxx"
#define humidity_topic "sensor/h_kuchyn"
#define temperature_topic "sensor/t_kuchyn"

#define DHT_PIN 2 //D4
#define DHTTYPE DHT22

WiFiClient espClient;
PubSubClient client(espClient);
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
DHT dht(DHT_PIN, DHTTYPE);
const int LED = 13;  //D7

void setup() {
Serial.begin(9600);
u8g2.begin();
dht.begin();
pinMode(LED, OUTPUT);

WiFi.begin(wifi_ssid, wifi_password);
Serial.println("Connecting to WiFi..");
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
yield();
}
Serial.println("Connected to the WiFi network");

client.setServer(mqtt_server, 1883);
client.setCallback(callback);

while (!client.connected()) {
Serial.println("Connecting to MQTT...");

if (client.connect(mqtt_client_id, mqtt_user, mqtt_password ))
{
Serial.println("connected to MQTT broker");
}
else
{
Serial.print("failed with state ");
Serial.print(client.state());
delay(500);
}
}
}

void callback(char* topic, byte* payload, unsigned int length)
{
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");

// the payload is a "byte-stream".  Convert this to a printable String object
String message;
for (int i = 0; i < length; i++)
{
message += (char)payload[i];
}
Serial.println(message); // debug print on our Arduino console

float newTemp = dht.readTemperature();
float newHum = dht.readHumidity();

u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_helvR12_tr);
u8g2.setCursor(1, 16);
u8g2.print("Teplota:  ");
u8g2.setFont(u8g2_font_helvR14_tr);
u8g2.setCursor(65, 16);
u8g2.print(newTemp);
u8g2.setFont(u8g2_font_helvR10_tr);
u8g2.print("*C");

u8g2.setFont(u8g2_font_helvR12_tr);
u8g2.setCursor(1, 40);
u8g2.print("Vlhkost:  ");
u8g2.setFont(u8g2_font_helvR14_tr);
u8g2.setCursor(65, 40);
u8g2.print(newHum);
u8g2.setFont(u8g2_font_helvR10_tr);
u8g2.print(" %");

u8g2.setFont(u8g2_font_helvR12_tr);
u8g2.setCursor(1, 64);
u8g2.print("Venku:  ");
u8g2.setFont(u8g2_font_helvR14_tr);
u8g2.setCursor(65, 64);
u8g2.print(message);
u8g2.setFont(u8g2_font_helvR10_tr);
u8g2.print("*C");
}
while ( u8g2.nextPage() );

if(newHum>55.00){
digitalWrite(LED, HIGH);    
}
else if(newHum<55.00){
digitalWrite(LED, LOW);
}
else if(newHum=55.00){
digitalWrite(LED, HIGH);
}
}

void loop() {
client.loop();
client.subscribe("sensor/t_venku");

float teplota = dht.readTemperature();
float vlhkost = dht.readHumidity();

if(vlhkost>55.00){
digitalWrite(LED, HIGH);    
}
else if(vlhkost<55.00){
digitalWrite(LED, LOW);
}
else if(vlhkost=55.00){
digitalWrite(LED, HIGH);
}

client.publish(temperature_topic, String(teplota).c_str(), true);
client.publish(humidity_topic, String(vlhkost).c_str(), true);

delay(5000);
}
EDIT: Používej tag CODE (tlačítko </> ), odsazuj kód (funkce, cykly ...), hned to bude čitelnější. Gilhad

Re: Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 03 kvě 2022, 14:11
od Cenda608
Nejsem si jistý, ale připadá mi že v callbacku nezjišťuješ jestli je přijatá zpráva z tématu které potřebuješ, takže ti tam může skočit cokoliv.
https://randomnerdtutorials.com/esp32-m ... duino-ide/
Navíc tam máš výpis na sériový port, můžeš si zkontrolovat co ti chodí.
Hlavní smyčku dej radši do millis.

Dělal sem projekt podle výše uvedených stránek a šlape 7 měsíců.

Píšu z mobilu




Re: Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 03 kvě 2022, 16:07
od kiRRow
displej se aktualizuje v funkci callback, ale zdá se mi, že ji voláš jen ze setupu ... vidíš ve výpisu seriové linky ty zprávy z té funkce ? "Message arrived on topic: " atp

Re: Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 03 kvě 2022, 18:40
od dandy010
Ve výpisu sériové linky ty zprávy vidím. I v HomeAssistantu se ta teplota aktualizuje správně. Jen na tom displeji ne.

Re: Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 03 kvě 2022, 18:48
od Cenda608
Callback asi volá příkaz client.subscribe, výpis na displej by měl být v hlavní smyčce jak píšeš, takhle se může stát že nic nepřijde / odpojí se Wi-Fi a přestane to vypisovat.

Já bych to udělal asi takhle:
Funkce callback přečte nový message, zkontroluje topic a přiřadí hodnotu z message do proměnné venkovní teploty.

V hlavní smyčce kontrola připojení k Wi-Fi, přes millis 10-20 vteřin (5 vteřin je podle mě zbytečně krátký interval) vyčíst senzor, odeslat na server mqtt, všechny hodnoty vypsat na displej.

Snad sem to napsal srozumitelně, dá se to vyčíst z toho odkazu co sem dával, funguje mi to přes server hiveMQ, nemám veřejnou IP.
Chtělo by to vidět výpis ze seriáku a ten delay 5000 tomu taky asi moc nepomůže.

Odesláno z mého T780H pomocí Tapatalk


Re: Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 04 kvě 2022, 18:02
od dandy010
Já si vážím Vaší snahy o pomoc, ale já jsem opravdu úplný začátečník, takže vlastně nevím, co mi radíte.
Asi bych to potřeboval trochu víc polopatě. Víc jako pro blbce. :)

Re: Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 04 kvě 2022, 20:12
od AstroMiK
Nemám to na čem vyzkoušet, ale postupoval bych asi takhle:

Když se zdá, že všechno kromě displeje funguje, tak bych tu část s displejem zjednodušil na úplné minimum.
Třeba zobrazit jen tu první teplotu. Vyházet všechny ty zbytečnosti kolem a nechat zobrazovat jen obyčejné číslo.

Kód: Vybrat vše

.
.
  u8g2.firstPage();
  do {
      u8g2.setFont(u8g2_font_helvR14_tr);
      u8g2.setCursor(65, 16);
      u8g2.print(newTemp);  
    }
  while ( u8g2.nextPage() );
.
.

Když to bude fungovat, tak postupně krok za krokem přidávat na displej další položky.

Když to zdechne, tak hned uvidíš v jaké řádce je problém a můžeš se na ni zaměřit.
Neznám tu knihovnu. Třeba je to problém s pamětí, nebo tomu vadí to neustálé střídání fontů, nebo zjistíš, že se problém objeví až při pokusu vytisknout tu String proměnnou 'message', která třeba nebude správně ukončena znakem '\0'.

Re: Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 05 kvě 2022, 09:12
od dandy010
Oni ty první řádky (teplota a vlhkost z čidla dht22, připojeného k přímo k wemos) fungují správně, jen ta teplota venku, která příchází pomocí mqtt, se aktualizuje nahodile, třeba jednou za dvě hodiny. Tak si myslím, že je problém někde při předávání hodnoty z mqtt na displej. Ale netuším kde.

Re: Teploměr s oled displejem, led diodou a mqtt odesíláním a příjmem

Napsal: 10 kvě 2022, 08:56
od dandy010
Takže vyřešeno. Kompletně jsem to předělal v Esphome a funguje to parádně.