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
ESP32 BLE špatné zobrazení hodnoty
-
- Příspěvky: 13
- Registrován: 10 čer 2022, 10:00
- Reputation: 0
Re: ESP32 BLE špatné zobrazení hodnoty
Moc jsem na to nekoukal, ale podle toho odkazu na dtostrf máš špatně deklarace.
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)
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[4];
dtostrf(hum, -4, 1, humidityTemp); // -4 nebo 4 mělo by to fungovat stejně
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'}
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ě
-
- Příspěvky: 13
- Registrován: 10 čer 2022, 10:00
- Reputation: 0
Re: ESP32 BLE špatné zobrazení hodnoty
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.
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.
Re: ESP32 BLE špatné zobrazení hodnoty
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.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host