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

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
dandy010
Příspěvky: 5
Registrován: 03 kvě 2022, 08:21
Reputation: 0

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

Příspěvek od dandy010 » 03 kvě 2022, 08:42

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

Cenda608
Příspěvky: 16
Registrován: 21 úno 2018, 11:16
Reputation: 0

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

Příspěvek od Cenda608 » 03 kvě 2022, 14:11

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




Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

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

Příspěvek od kiRRow » 03 kvě 2022, 16:07

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

dandy010
Příspěvky: 5
Registrován: 03 kvě 2022, 08:21
Reputation: 0

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

Příspěvek od dandy010 » 03 kvě 2022, 18:40

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.

Cenda608
Příspěvky: 16
Registrován: 21 úno 2018, 11:16
Reputation: 0

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

Příspěvek od Cenda608 » 03 kvě 2022, 18:48

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


dandy010
Příspěvky: 5
Registrován: 03 kvě 2022, 08:21
Reputation: 0

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

Příspěvek od dandy010 » 04 kvě 2022, 18:02

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. :)

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

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

Příspěvek od AstroMiK » 04 kvě 2022, 20:12

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'.

dandy010
Příspěvky: 5
Registrován: 03 kvě 2022, 08:21
Reputation: 0

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

Příspěvek od dandy010 » 05 kvě 2022, 09:12

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.

dandy010
Příspěvky: 5
Registrován: 03 kvě 2022, 08:21
Reputation: 0

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

Příspěvek od dandy010 » 10 kvě 2022, 08:56

Takže vyřešeno. Kompletně jsem to předělal v Esphome a funguje to parádně.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 19 hostů