Dokładny pomiar temperatury za pomocą Arduino

10

Próbuję zbudować termostat z Arduino. Chcę zasilać go za pomocą baterii / ładowarki telefonu komórkowego, co sprawia, że ​​napięcie systemowe jest dość zmienne. W tej chwili używam Arduino Uno, ale kiedy będzie gotowy, przeniosę go na Lilypad.

Najpierw próbowałem użyć czujnika temperatury TMP36 . Jak dotąd była to kompletna porażka. Chociaż sam czujnik wydaje się bardzo stabilny, nie mogę znaleźć sposobu, aby dokładnie zmierzyć jego napięcie.

Korzystanie z wbudowanego odniesienia 5 V dla czujników analogowych w ogóle nie działa - nawet zasilanie z USB arduino + 5 V w rzeczywistości wynosi + 4,8 V (co przesuwa zmierzoną temperaturę o kilka stopni). Gdy płyta jest zasilana z akumulatora, napięcie spada do około 4 V i mierzy temperaturę rakiet. Próbowałem również użyć + 3.3V z płyty jako odniesienia. Wydaje się być bardziej stabilny, gdy płytka jest zasilana z USB, ale jego napięcie spada po uruchomieniu z akumulatora.

Czy istnieje inny sposób niezawodnego pomiaru napięcia wyjściowego czujnika?

W drugim etapie planuję użyć termistorów. Właśnie zamówiłem kilka termistorów 20K .

Z tego, co rozumiem, powinny być łatwiejsze do dokładnego zmierzenia, jeśli zbuduję dzielnik napięcia i użyję V_in jako napięcia odniesienia dla ADC.

Kilka pytań na ich temat:

  • Czy sensowne jest stosowanie kilku dzielników napięcia z innym stałym rezystorem w celu zwiększenia dokładności?
  • Mogę użyć programowalnego pinu jako V_in i mierzyć temperaturę za pomocą kilku różnych poziomów napięcia. Chociaż nie jest dla mnie jasne, czy rzeczywiście zwiększy to dokładność.
Usov
źródło
Proszę zamieścić kod konwersji temperatury.
geometrikal
Proszę zdefiniować, co rozumiesz przez „dokładnie”. Jakiego rodzaju rozdzielczość temperatury i absolutna dokładność próbujesz osiągnąć?
Joe Hass,
Mam nadzieję uzyskać rozdzielczość około 1-2 stopni. Bezwzględny błąd kalibracji wynoszący 1-2 stopnie również powinien być odpowiedni. Z tego, co rozumiem, stosunkowo łatwo jest uzyskać punkt odniesienia w 0 ° C i wydaje mi się, że mogę uzyskać drugi (znacznie bardziej szorstki) punkt w temperaturze pokojowej przez kalibrację krzyżową czujników.
Usov
1-2 stopnie dla temperatur w zakresie 5-25 ° C.
Usov
@geometrikal W tej chwili nie mam go pod ręką, ale w zasadzie jest taki sam jak wszyscy: upuść pierwszą próbkę, poczekaj kilka milisów, próbkuj jeszcze kilka razy i uśrednij próbki. Następnie przeskaluj według tego, co Twoim zdaniem jest napięciem odniesienia.
Usov

Odpowiedzi:

2

Wygląda na to, że zdajesz sobie sprawę z problemu ze zmianą napięcia odniesienia, a jeśli używasz urządzenia takiego jak TMP36 (stałe 10mV / degC), nic nie możesz zrobić poza użyciem napięcia odniesienia z układu w celu ustabilizowania rzeczy.

Jednak jeśli używasz RTD lub termistora, problem nie powstanie. Ty ADC dokonuje pomiaru ratiometrycznego - porównuje wejście ADC z napięciem odniesienia ALE, jeśli zasilasz RTD lub termistor (za pomocą odpowiedniego rezystora) z tego samego napięcia odniesienia, nie wpłynie to na odczyty. Jeżeli wartość referencyjna wzrośnie o 10%, to również napięcie w ADC.

Andy aka
źródło
4

Myślę, że powinieneś rozważyć użycie cyfrowego czujnika temperatury, takiego jak DS18B20 / DS18S20, ponieważ nie zależy on od dokładności ATmega ADC do pomiaru sygnału anaolg, używa 1-przewodowego protokołu cyfrowego do raportowania temperatury.

Zapoznaj się z następującymi samouczkami
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino

alexan_e
źródło
2
Ta odpowiedź nie jest zbyt pomocna, chyba że wyjaśnisz, dlaczego OP powinien przejść na inny czujnik, a nie uzasadniłeś tego. Podanie linków w odpowiedzi nie jest dobrym pomysłem, ponieważ często padają, a treść odpowiedzi jest zagubiona.
Joe Hass,
Zamiast pisać własną odpowiedź w tym samym stylu, zredagowałem ten A, aby rozwiązać problem podniesiony przez Joe.
RedGrittyBrick,
@JoeHass Jedyną alternatywą niż linkowanie do artykułów zewnętrznych jest dołączenie kodu w odpowiedzi, ale nie mam własnego kodu do załączenia i dołączanie komuś innego kodu bez jego zgody nie byłoby uczciwe. Nawet jeśli linki znikną, bibliotekę Arduino można łatwo znaleźć za pomocą Google i DS18B20 jako słowa kluczowego. Jeśli chodzi o wyjaśnienie, to był mój błąd, pomyślałem, że wspomnienie, że czujnik jest cyfrowy, wyjaśniłoby mój punkt widzenia.
alexan_e
Dziękuję za komentarz. Z jakiegoś powodu cyfrowe czujniki są dość trudne do znalezienia. Ani lokalni dostawcy (Maplin), ani tani (er) faceci online (korzystałem ze Spiraltronics) nie sprzedają żadnych. 3 funty za dostawę pop + nadal sprawia, że ​​jest to stosunkowo kosztowna opcja.
Usov
@Usov Sądząc z linków, które podałeś, zakładam, że mieszkasz w Wielkiej Brytanii. Zwykle kupuję te komponenty tanio z Chin, ale znalazłem je również na ebay.uk za 1,49 £, może ci pasują
alexan_e
3

Twój pomiar będzie tak dobry, jak dobre napięcie odniesienia dla ADC. Arduino domyślnie używa napięcia zasilania jako napięcia odniesienia, ale w twoim przypadku właściwym sposobem byłoby użycie pinu Aref arduino. Musisz zdobyć specjalny układ zwany „napięciem odniesienia” i podłączyć go do pinu Aref, a następnie ustawić ADC, aby używał zewnętrznego odniesienia w kodzie Arduino ( analogReference(EXTERNAL))

Napięcie odniesienia należy wybrać tak, aby pełne odchylenie czujnika temperatury mieściło się w napięciu referencyjnym. TMP36 będzie wytwarzał napięcie ~ 1,5 V @ 100 ° C, więc do pomiaru temperatury do 100 ° C należy użyć wartości odniesienia powyżej 1,5 V. Chcesz, aby odniesienie było jak najbliżej maksymalnego napięcia mierzonego, jak to możliwe, aby uzyskać jak największą rozdzielczość.

Atmega328p ma dwa wewnętrzne odniesienia, których można używać bez żadnych zewnętrznych komponentów. Jeden ma 1,1 V, drugi 2,56 V. Zazwyczaj mają nieco gorszą dokładność niż w przypadku zewnętrznego komponentu dedykowanego. Sprawdź dokumentację Arduino pod kątem analogReference i arkusza danych Atmega328p w celu uzyskania wewnętrznej dokładności odniesienia.

Jeśli naprawdę chcesz uzyskać orzechy o różnych zakresach, możesz użyć kilku zewnętrznych odniesień i przełączać je za pomocą przełącznika analogowego, takiego jak 74hc4051. Lub możesz przełączać się między dwoma wewnętrznymi odniesieniami.

Z termistorami uzyskasz lepsze wyniki, jeśli zamiast stałego opornika zastosujesz źródło prądu stałego. Z drugiej strony - głupi opornik zasilany ze stabilnego napięcia odniesienia działałby dobrze.

Wybierając odniesienie zewnętrzne, upewnij się, że masz wystarczające napięcie, aby pomieścić jego napięcie spadające podczas zasilania z akumulatorów, a akumulatory są rozładowane. Vref + Vdropout <Vbat-min.

miceuz
źródło
Dzięki za komentarz. To w zasadzie ten sam komentarz, który otrzymałem dzisiaj - zbuduj własne napięcie odniesienia na diodzie Zenera lub uzyskaj dedykowany regulator niskiego napięcia dla AREF.
Usov
Dlaczego lepsze wyniki przy stałym prądzie i termistorze?
geometrikal
2

Brak stabilnego odniesienia ADC jest w rzeczywistości objawem innego problemu w twoim obwodzie: nie dostarczasz wystarczająco wysokiego napięcia do płytki. Wskazuje na to spadek napięcia 5 V do 4 V oraz spadek napięcia 3,3 V.

Regulator napięcia (MC33269D-5.0 IIRC) na płycie Arduino ma zanikające napięcie ~ 1,0 V, dlatego należy zapewnić mu napięcie co najmniej 6 V, aby uzyskać stabilne napięcie wyjściowe 5 V. Baterie AA zaczynają się przy 1,5-1,6 V i są prawie rozładowane przy 1,1 V, więc musisz zasilić płytę co najmniej 6 bateriami AA, aby uzyskać stabilną moc przez cały okres eksploatacji baterii.

Przy prawidłowym zasilaniu można użyć wewnętrznego odniesienia ADC lub linii 5 V lub 3,3 V. Ponieważ czujnik temperatury zmienia się o około 10 mV na stopień Celsjusza, można użyć dzielnika napięcia, aby ustawić napięcie odniesienia równoważne maksymalnemu oczekiwanemu napięciu wyjściowemu czujnika (np. Dla 50 stopni C). To da dokładniejszy pomiar.

Jeśli chcesz użyć mniej niż 6 baterii AA, wypróbuj przetwornicę podwyższającą napięcie DC-DC, np. Https://www.sparkfun.com/products/10968 . . Połączony przykład pobiera 1 V - 4 V i wytwarza 5 V. Wyjście będzie podawane bezpośrednio na styk 5 V Arduino, omijając jego regulator.

Aby karta działała dłużej na bateriach, przełącz MCU w tryb uśpienia między odczytami czujnika. Biblioteka Rocketscream o niskiej mocy jest świetna do tego celu. Ale jest to naprawdę przydatne, gdy używa się wydajnego regulatora / przetwornicy DC-DC, ponieważ standardowy regulator Arduino zużywa 10 mA sam w sobie!

geometrikal
źródło
1

Odpowiedź na pytanie Czy istnieje inny sposób niezawodnego pomiaru napięcia wyjściowego czujnika?

ADC wykorzystuje napięcie odniesienia do konwersji z analogowej na cyfrową. Jeśli więc nastąpi zmiana napięcia odniesienia, zmienią się wartości przeliczone (tj. Wartość cyfrowa). Wartość cyfrowa będzie inna dla tego samego wejścia analogowego, jeśli zmieni się napięcie odniesienia.

Jedną łatwą opcją jest użycie wewnętrznego napięcia odniesienia wewnątrz Arduino (tj. Kontrolera Atmega).

Zobacz poniższy link, w którym podano przykładowy kod do użycia wewnętrznego ADC (nazwa funkcji Arduino - analogReference (DEFAULT))

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

Myślę, że to rozwiąże twój problem i nie ma potrzeby przestawiania się na termistory.

robomon
źródło
Nie jestem pewien, jak „Hacking Wifi Finder” jest istotny - nie mogę znaleźć niczego istotnego. Odnośnie wewnętrznego odniesienia ADC - pisałem o tym. Nie działa, nawet gdy Arduino jest zasilany z USB. A kiedy płyta jest zasilana z baterii telefonu komórkowego (3,7 - 4,5 V), jest jeszcze gorzej.
Usow
Przepraszamy za błąd kopiowania / wklejania. Wkrótce poprawi link!
robomon
@Usov link poprawiony!
robomon
Wewnętrzna 1,1 V może unosić się o ponad 10% zgodnie ze specyfikacją atmega328. Nie wydaje się to również bardzo wiarygodnym odniesieniem.
Usov