Moje arduino měří teplotu a dává hodnoty jako: 28,58 stupňů Celsia. Chtěl bych to zaokrouhlit na jedno desetinné místo. Proměnnou jsem mohl zkrátit odříznutím „8“, což by snížilo 28,5. Přesto to připadá trochu jako podvádění, protože matematické není správné. Ví někdo, jak zaokrouhlovat nahoru / dolů. Což by ukázalo moji pokušení jako 28.6.
Je zapotřebí další rady. Posílám tempature Serial na můj RPi, který má spuštěný kód pythonu. Navrhli byste zaokrouhlení v kódu Arduino nebo v kódu Pythonu.
Předem děkujeme!
Komentáře
Odpovědět
Pokud vím, Serial.print (nebo println) se zaokrouhluje nahoru a dolů. Jediné, co musíte udělat, je vzít proměnnou float a udělat Serial.print( value, 1);
Bez dalšího parametru je vybrána výchozí hodnota, což jsou 2 desetinná místa: Serial.print( value, 2);
Proč chcete zkrátit bajty přes sériové číslo? Stejně tak můžete poslat dvě desetinná místa a zpracovat hodnotu v Pythonu.
Komentáře
- O tom je poslední část mé otázky; ) přemýšlel, kde zpracovat, v pythonu na mém Rpi nebo před odesláním.
- Jakékoli zaokrouhlování by mělo být provedeno co nejblíže konečnému výstupu. Pokud je váš sériový port dostatečně rychlý, odešlete 2 nebo 3 číslice a zaokrouhlete, když Pi vydává data. Nechcete ' výpočty založit na zaokrouhlených hodnotách, pokud vám to pomůže, což přináší možnost chyb. To znamená, že ' je úplná ztráta času odesíláním náhodných čísel, pokud má teplotní senzor chybu +/- 1 stupeň, může být užitečné první desetinné místo, cokoli po tom je nesmyslné.
- Dobře, souhlasím! Je přesnější zpracovat v konečné fázi, ale přesnost senzoru tam není, takže ušetřím šířku pásma pomocí Serial.print (hodnota, 1);
Odpovědět
V C můžete zaokrouhlit vynásobením významnosti, přidáním +0,5, zaokrouhlením dolů (rovná se přetypování na celé číslo) a rozdělením.
float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0);
28.6 bude:
float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6
V Pythonu je to stejné (kromě operátoru cast je int ( …)
Aktualizace: pro záporná čísla +0,5 by měla být -0,5
Kredity pro Edgar Bonet: použití kulatých děl pro kladná i záporná čísla:
float f_rounded = round(f * 10) / 10.0;
Komentáře
- Tím se zaokrouhlí
-28.58
na-28.5
. - @JohnnyMopp Aktualizoval své odpovědi, děkuji za komentář
- Proč ne jen
float f_rounded = round(f * 10) / 10.0;
? Toto zpracovává pozitivní i negativní případy.
Serial.print()
provést zaokrouhlení, protože na odpověď @Jot '.