eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaDziałająca biblioteka do BMP085Re: Działająca biblioteka do BMP085
  • 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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: