Mierzenie temperatury – analogowo: MCP9700

Jednym z podstawowych elementów elektronicznych wykorzystywanych do mierzenia temperatury jest moduł DS18b20. Ten cyfrowy termometr jest całkiem dokładny (±0.5°C), oferuje też możliwość ustawiania  alarmów. Często stosuję go w moich projektach. Ma jednak podstawową wadę: do komunikacji z kontrolerem wykorzystuje protokół 1-Wire. Obsługa DS18b20 przez Arduino wymaga załadowania specjalnej biblioteki. Jeżeli nie zależy Wam na tak dużej dokładności, macie do dyspozycji przetwornik analog-cyfra (ADC) – a we flashu zostają Wam ostatnie wolne komórki pamięci – może warto pomyśleć o czymś znacznie prostszym (i tańszym)? Może MCP9700?

Podobne - a jednak inne: mierniki temperatury DS18b20 (po lewej) i MCP9700
Podobne – a jednak inne: mierniki temperatury DS18b20 (po lewej) i MCP9700

Kabelki…

Czujnik MCP9700 w obudowie T0-92 to 3 piny:
mcp_9700

  • VDD: zasilanie: 2.3 – 5.5V, pobór prądu: do 12uA,
  • VOUT: wyjście: 100mV – 1.75V,
  • GND: masa.

Kilka parametrów, w porównaniu do ds18b20:

Nazwa Typ Min. temp
[°C]
Max. temp
[°C]
Dokładność
[°C]
wyjście Cena
DS18b20 Cyfrowy -55 125 ±0.5 Protokół 1-wire 5 zł
MCP9700 Analogowy: napięcie wyjściowe proporcjonalne do temperatury (wymaga ADC) -40 125 (są wersje 150) ±4 100 mV do 1.75V,
10mV/°C,
500mV = 0°C
1.5 zł

Jak mierzyć?

Zasilony MCP9700 wystawia na pin VOUT napięcie proporcjonalne do temperatury. Minimalne napięcie to 100mV i oznacza temperaturę -40°C.

Na każdy stopień Celsjusza przypada dodatkowe 10mV na wyjściu VOUT. Stąd 0°C to:
40^oC \cdot 10 {{mV} \over {{1^o}C}} = 400mV

Ponieważ minimalne napięcie na VOUT to 100mV, 0°C to 100mV+400mV = 500mV.

Maksymalne napięcie na pinie VOUT to 1.75v. Ponieważ 0°C to 500mV – pozostaje 1.25v na „plusowe” temperatury. Ponieważ napięcie rośnie 10mV/1°C, to 1.25v = 125°C.

Podsumowując, na pinie VOUT możecie oczekiwać:

  • Zmiana o 1°C powoduje zmianę o 10mV na VOUT,
  • -40°C: napięcie 100mV na VOUT,
  • 0°C: 500mV,
  • 125°C: 1.75V

Odczytanie temperatury na MCP9700 wymaga zmierzenia napięcia na pinie wyjściowym VOUT. Wasz mikrokontroler musi być więc wyposażony w przetwornik analog-cyfra (ADC). MCP9700 możecie bezpośrednio podłączyć do Arduino, Digisparka, ESP8266 (np. ESP-12), Nucleo – ale nie do Raspberry Pi, które posiada tylko porty cyfrowe.

Podłączenie do Arduino

Masę czujnika podłączcie do pinu GND Arduino, zasilanie VDD do 5v. Pin VOUT (wyjście z czujnika) podłączcie do jednego z wejść przetwornika A0..A7.

mcp_9700_1

A teraz kod:

Funkcja „analogRead(A0)” pobiera wartość z pinu A0. Wartość ta może zawierać się w przedziale 0..1023 (1024 wartości) odpowiadając napięciu na tym pinie. 0 na pinie A0 będzie oznaczało 0v; 1023: 5v. Wartość napięcia możecie przeliczyć z proporcji:
{{5v}\over{1023}} = {{napiecie} \over {analogRead(A0)}}

Żeby obliczyć temperaturę trzeba jeszcze odjąć 0.5v na 0°C – i resztę podzielić przez 0.01, co odzwierciedla zmianę napięcia co 10mV na 1°C.

Pomiar na szybko

Na szybko zmontowany układ pomiarowy z MCP9700, DS18b20 i miernikiem UT71 z termoparą:

temp_test_00Wyniki:

  • UTC71: 29.1°C
  • MCP9700: 31.13°C
  • DS18b20:29.25°C

Oczywiście to tylko prosty test (a i UT71 szczególnie dokładnie temperatury nie mierzy), ale różnicę sami widzicie. Co jednak trzeba zauważyć: pomiar MCP trwał poniżej 1ms – ds18b20 potrzebował na to prawie 800ms!

Podsumowanie

MCP9700 nie  jest może najdokładniejszy (±4°C), ma węższy zakres temperatury niż ds18b20. Mierników MCP nie możecie również łączyć szeregowo: każdy kolejny wymaga osobnego portu przetwornika ADC. Za to MCP jest prostszy w obsłudze niż jego cyfrowy odpowiednik ds8b20, dużo szybszy – oraz znacznie od niego tańszy.

Źródła

Dodaj komentarz