ESP32 BLE špatné zobrazení hodnoty

Odpovědět
MiraVorlik
Příspěvky: 13
Registrován: 10 čer 2022, 10:00
Reputation: 0

ESP32 BLE špatné zobrazení hodnoty

Příspěvek od MiraVorlik » 10 čer 2022, 10:05

Ahoj, programuji 2 ks ESP32 v Arduino IDE a komunikaci mezi nimi. Prakticky vše funguje dle návodu v tomto odkazu:

https://randomnerdtutorials.com/esp32-b ... er-client/

Problém mám v případě kde na serveru upravím kód a chci mít hodnoty pouze na jedno desetinné místo tedy třeba u vlhkosti:

static char humidityTemp[6];
dtostrf(hum, 6, 1, humidityTemp);

-problém zde je že mi na displeji posune zobrazení o jedno místo doprava. Ok tedy zadám aby příkaz dtostrf řadil z leva tedy:

static char humidityTemp[6];
dtostrf(hum, -6, 1, humidityTemp);

popř. ideální případ:

static char humidityTemp[4];
dtostrf(hum, -4, 1, humidityTemp); // -4 nebo 4 mělo by to fungovat stejně



-bohužel v tu chvíli je zobrazení na svém místě ale za hodnotou se na displeji který je připojen na klienta objeví znak "?". To samé když hodnoty pole měním na menší atd., zkoušel jsem snad všechny kombinace příkazu dtostrf ale vždy otazník na konci jen když dám ty první hodnoty je to v pořádku ale posunuté doprava o znak. Kontroloval jsem v mobilu pomocí sceneru co mi z toho leze za hodnoty a úplně v pořádku Value: (0x) 36-34-2-34, "64,4" tedy přesně to co potřebuji. Ale na straně klienta je po překladu na konci otazník. Jediná změna oproti programu odkazu je výměna knihovny pro displej za u8g2.lib. Nenapadá někdo kde se tam ten otazník bere?

Vypadá to jako by na straně klienta očekával prostě 2 desetinná místa a když nedostane hodnotu hodí tam otazník ale v kodu klienta nic takového nevidím.
Zde podrobnosti o příkazu dtostrf:
https://www.programmingelectronics.com/dtostrf/

Díky za rady ;-)

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: ESP32 BLE špatné zobrazení hodnoty

Příspěvek od gilhad » 10 čer 2022, 10:43

Moc jsem na to nekoukal, ale podle toho odkazu na dtostrf máš špatně deklarace.
Obrázek
Obrázek

Kód: Vybrat vše

static char humidityTemp[4];
dtostrf(hum, -4, 1, humidityTemp); // -4 nebo 4 mělo by to fungovat stejně
Tohle ti do pole 4 znaků zapíše 5 hodnot (čili ti to nevyhnutelně zapíše mimo to pole a něco tam náhodně přepíše)
Nemluvě o tom, že pokud dáš třeba hum=100 tak ti to tam zapíše těch hodnot 6 (čili 2 mimo to deklarované pole)

Kód: Vybrat vše

{'1', '0', '0', '.', '0', '\0'}
Podle toho jak to máš deklarované (a jak to zoptimalizuje překladač), tak si těma zápisama mimo pole taky můžeš přepisovat jiné proměnné. A naopak zápisem do těch proměnných přepisovat konec toho řetězce - čili se tam jednak můžou objevovat nesmyslné znaky, jednak při vypisování ten řetězec může taky najednou dosáhnout prakticky libovolné délky (nejde říct, jak daleko za koncem toho pole to najde nějakou nulu, která by ten řetězec ukončila)

Takže bych dal minimálně

Kód: Vybrat vše

static char humidityTemp[6];
dtostrf(hum, -4, 1, humidityTemp); // -4 nebo 4 mělo by to fungovat stejně

MiraVorlik
Příspěvky: 13
Registrován: 10 čer 2022, 10:00
Reputation: 0

Re: ESP32 BLE špatné zobrazení hodnoty

Příspěvek od MiraVorlik » 10 čer 2022, 10:54

Aha, tu větu o přidání jednoho prostoru pro "/0" jsem nepostřehl. Vím že 100 tam nikdy nebude a mínusové hodnoty (třeba pro teplotu) taky ne. Ale až budu doma vyzkouším tedy toto:

static char humidityTemp[6];
dtostrf(hum, -4, 1, humidityTemp);

Dle mého názoru jsem ale i tuto kombinaci zkoušel. Nejsem si ale jistý tak uvidíme a dám vědět ;-) Díky za radu.

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: ESP32 BLE špatné zobrazení hodnoty

Příspěvek od gilhad » 10 čer 2022, 12:12

Tak ono v C je naprosto běžné ukončovat řetězce ASCII znakem 0, který se do délky řetězce nepočítá, ale místo pro něj je nutno alokovat.

Odpovědět

Kdo je online

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