Arduino Polska Forum

Pełna wersja: DS18S20 - długi czas odczytywania temperatury
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.

bullseye

Jak w temacie, mam podpiety czujnik temperatury z biblioteką DallasTemperature.h.
Rozdzielczość ustawiłem na 9bitów, a mimo to czas odczytu temperatury mam na poziomie 750ms, co uniemożliwia czasami użycia przycisku.

Komenda do odczytywania temperatury to:
Kod:
sensors.requestTemperatures();

    temp = sensors.getTempC(test);
Jest możliwość skrócenia tego czasu ?
Witam,
Wystarczy spojrzeć w notę katalogowa. Ta stoi, że max czas konwersji to 750 ms. Wątpię żeby dało się to skrócić przy takiej rozdzielczości.
Pozdrawiam,
Tomek

bullseye

Wdg mnie 750ms jest przy 12bitach, a ja operuję na 9:
Kod:
0 0 9 93.75ms (tCONV/8)
I dlatego dziwię się skąd mam 750ms
Witam,
A jaki jest czas dla 12-tu bitów?
Pozdrawiam,
Tomek.

bullseye

Ale ja chce 9bitow i o to sie mi rozchodzi Smile
chyba ze to sztywne 12 jest i tylko konwertuje na 9bit ?
Witam,
DS18s20 ma 9 bitów rozdzielczości
DS18b20 ma programowalne od 9 do 12.
W tytule wątku jest ten pierwszy.
Pozdrawiam,
Tomek.

bullseye

Czyli nie przeskocze tego i musze zmienic czujnik na wersje B Smile
Witam
To jakiego czujnika użyjesz nie ma znaczenia, gdy chcesz maksymalnie często sprawdzać temp. algorytm   powinien wyglądać tak:
1. Odczytujesz temperaturę.
2. Wysyłasz żądanie konwersji temperatury.

Przejrzyj przykład blinkwithoutdelay oraz przykład w DS WaitforConversion.
W setup wyłączasz oczekiwanie na konwersję sensors.setWaitForConversion(false); dalej dbasz o to sam by nie pytać czujnika o temperaturę szybciej niż po 750ms od wysłania żądania pomiaru    sensors.requestTemperatures();.
Żeby pierwszy odczyt nie był wadliwy żądanie konwersji wysyłasz też przed wyłączeniem oczekiwania w setup. Po zakończeniu pomiaru on sobie siedzi w czujniku i czeka. Jeśli jest to 12bitów to może tam czekać już po 750ms, ale my to olewamy. Korzystamy z tego szkicu do migania LED, tam mamy taki pik co 1s. W tym piku odczytujemy "starą" temperaturę, wiek około 250ms i od razu wysyłamy żądanie pomiaru. Zaglądamy tu w kolejnym piku i tak w koło. Pętla główna programu przelatuje sobie 16mln razy na sekundę i sprawdza czy już, czy już, ale nie, jeszcze, a przelatując sprawdza co tam na pinach, co tam w rejestrach, co tam na UART, itd.  I jest szansa że zauważy naciśnięcie przycisku i inne ważne dla użytkownika rzeczy.
Chcesz sprawdzać temperaturę 9bitową co 100ms, to po prostu zmieniasz pik na 100. Ale też nie wisisz tam 100ms tylko odczyt, żądanie pomiaru i wyjście, powrót za 100ms, odczyt, żądanie pomiaru idt.
Tak samo robimy z eliminacją drgań styków dla przycisku i  żyjemy szczęśliwsi.
Jeśli byś chciał odczytywać temperaturę co 750ms i miał jakieś delay w pętli to mało prawdopodobne by normalne naciśnięcie przycisku trwające 5ms w ogóle zostało zauważone.
Jeśli potrzebujesz odczytywać temperaturę raz na 60s - robimy podobnie, z tym że wprowadzamy jakiś licznik, jeśli jest =59 to start konwersji, a za sekundę odczyt. Bez sensu byłoby odczytywać temperaturę sprzed minuty gdyby taki pik ustawić. W każdej piątej sekundzie? Warunek (licznik%5==0).
Chyba lepiej tak niż samemu sobie zawieszać program.
Pik można ustawić też na 100ms i robić różne ciekawe rzeczy, w pierwszym odczytać DS i zażądać pomiaru, w drugim wilgotność, w trzecim ciśnienie, w czwartym pomiar prędkości wiatru, w piątym pogadać z innym arduino, w szóstym wysłać dane na LCD, w siódmym na serwer, w ósmym na UART, w każdym parzystym zmienić stan led 13 i odcień linijki ws2812b. Robimy to w stałym ustalonym przez siebie rytmie.