-
Data: 2014-04-24 20:04:54
Temat: Re: Działająca biblioteka do BMP085
Od: "Pszemol" <P...@P...com> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]"Atlantis" <m...@w...pl> wrote in message
news:ljb6vm$mdt$1@portraits.wsisiz.edu.pl...
> W dniu 2014-04-24 01:31, Pszemol pisze:
>
>> Podejrzewałbym następujące linie Twojego kodu:
>>
>> 1) itoa(pressure, result, 10);
>
> Dokładnie, ta diagnoza okazała się być poprawną. Najpierw nie
> zauważyłem, że itoa() przyjmuje short inta, a potem przeoczyłem literkę
> "l" w tokenie obsługującym przesyłaną wartość w sprintf_P. Zaowocowało
> to takim samym błędem.
>
> Teraz wszystko działa, otrzymuję ciśnienie o prawdopodobnej wartości.
No to fajnie :-)) Cieszę się, że mi kryształowa kula wciąż działa dobrze ;-)
> Jeśli chodzi o temperaturę, to zastosowana biblioteka zwraca ją jako
> double. Myślę, że nie będę się już bawił w jej przerabianie, zresztą
> miło byłoby, gdyby wynik był zwracany w normalnych jednostkach, a nie
> 0,1 stopnia C.
>
> Włączanie operacji zmiennoprzecinkowych w stdio.h raczej nie chodzi w
> grę. Nie dosyć, że kod od tego tyje, to jeszcze zużywane są cykle
> procesora.
>
> Dobrze pamiętam tę sztuczkę?
>
> double temperature = bmp085_gettemperature();
> int16_t intpart = (int16_t)temperature;
> int16_t decpart = ((int16_t)(temperature*2)%2);
> sprintf_P(pAnswer, PSTR("+TEMP: %d.%d\r\n"), intpart, decpart);
Hm... Sprawdźmy na szybko... :-)
Temperatura pokojowa, załóżmy 21,563C.
Mamy więc wartość zmiennej 'temperature' w dziesiątych Celciusza: 215.63
A więc wartość intpart jest automagicznie 215, tu OK.
Wartość decpart obliczamy, w kolejności, mnożąc 215.63*2 = 431.26
Teraz rzutujemy takiego doubla do inta, mamy 431.
Reszta z dzielenia tego 431 przez 2 wyjdzie nam 1.
Czyli sprintf wyświetli 215.1 zamiast 215.63 - kiepsko.
Lepiej chyba zrobić tak:
double dblTemperature = bmp085_gettemperature();
int iTemperature = ( dblTemperature < 0 ) ? dblTemperature - 0.5 :
dblTemperature + 0.5;
sprintf(pAnswer, "+TEMP: %d.%d\r\n"), iTemperature, iTemperature%10);
Podstawmy nasz przykład z dblTemperature = 215.63.
iTemperature = (int)(216.13);
Zatem
iTemperature = 216
Dla wartości z przedziału < xx.5, np dblTemperature = 215.33.
iTemperature = (int)(215.83);
Zatem
iTemperature = 215
Dla temperatur ujemnych, np dblTemperature = -215.63.
iTemperature = (int)(-216.13);
Zatem
iTemperature = -216
Ale nie bardzo rozumiem czemu skoro już masz typ zmiennej double
w swoim kodzie, a więc musiałeś włączyć takie liczby, nie?
Czemu więc nie zrobisz po prostu tak:
double dblTemperature = bmp085_gettemperature();
sprintf_P(pAnswer, PSTR("+TEMP: %.1f\r\n"), dblTemperature/10.0);
I od razu uwaga, pewnie zauważyłeś dodałem przedrostki oznaczające
typ zmiennej... Tak się po prostu łatwiej czyta kod, zwłaszcza jak używasz
zmiennych o bardzo różnych typach które dawałyby niebezpieczne efekty
przy cichym (domyślnym) rzutowaniu przez kompilator...
Takie przedrostki to popularna konwencja zwana "notacją węgierską",
warto się jej od razu nauczyć i trzymać nawet w małych programach
a jak wejdzie Ci w nawyk to będziesz miał później jak znalazł ;-)
http://pl.wikipedia.org/wiki/Notacja_w%C4%99gierska
Następne wpisy z tego wątku
- 24.04.14 21:01 Sylwester Łazar
- 24.04.14 21:01 Sylwester Łazar
- 24.04.14 21:05 Pszemol
- 24.04.14 21:10 Grzegorz Niemirowski
- 24.04.14 21:14 Sylwester Łazar
- 24.04.14 21:28 Pszemol
- 24.04.14 21:28 Pszemol
- 24.04.14 21:31 Grzegorz Niemirowski
- 24.04.14 23:15 Pszemol
- 25.04.14 08:05 Zbych
- 25.04.14 14:00 Pszemol
- 25.04.14 14:08 Sylwester Łazar
- 25.04.14 14:55 Pszemol
- 25.04.14 15:09 Zbych
- 25.04.14 17:04 Pszemol
Najnowsze wątki z tej grupy
- Microsoft, C/C++ na Rust - news
- Pierwsza mapa kosmosu w 102 długościach fal podczerwieni! To początek nowej ery w astronomii
- Rosjanie chwalą się prototypem komputera kwantowego. "Najważniejszy projekt naukowy Rosji"
- zasilacz
- Zegary DCF
- pompa CO
- 2,5 x więcej niż Li-Ion
- Tfu! Przeklety prostokąt (czyli UPS i "sinus modyfikowany")
- Dalekopis T100 - problem z powrotem karetki
- Diody LED - oświetlenie na choinkę
- ale wiesz, że są gotowce?
- jak wykryć zapalenie żarówki?
- Cyna dylemat
- Mierniki poziomu glukozy (CGM, FGM)
- A Szwajcarzy kombinują tak: FinalSpark grows human neurons from stem cells and connects them to electrode arrays
Najnowsze wątki
- 2026-01-02 Microsoft, C/C++ na Rust - news
- 2026-01-01 szyby macie całe?
- 2026-01-01 Najbogatsi ludzie na świecie są jeszcze bogatsi. Bezprecedensowa skala zysków
- 2026-01-01 Najbogatsi ludzie na świecie są jeszcze bogatsi. Bezprecedensowa skala zysków
- 2026-01-01 Wszystkiego najlepszego
- 2025-12-31 Czy potrafisz wskazać różnice? [TVN v. RMF]
- 2025-12-31 I kolejny jebnięty
- 2025-12-31 Myślenice => Specjalista ds. kontrolingu <=
- 2025-12-31 Ostróda szlachetnie walczy
- 2025-12-31 Pierwsza mapa kosmosu w 102 długościach fal podczerwieni! To początek nowej ery w astronomii
- 2025-12-31 Rosjanie chwalą się prototypem komputera kwantowego. "Najważniejszy projekt naukowy Rosji"
- 2025-12-31 Rosjanie chwalą się prototypem komputera kwantowego. "Najważniejszy projekt naukowy Rosji"
- 2025-12-31 Pieniadze-cuchna-oddechem-nawalonego-tatusia
- 2025-12-31 Iran na skraju gospodarczego upadku. Na ulicach Teheranu (znów) wrze. To może być cios dla reżimu
- 2025-12-30 zasilacz




5 Najlepszych Programów do Księgowości w Chmurze - Ranking i Porównanie [2025]