micro:bit:termometr – podłączenie MCP9700 do micro:bit (i lm285)

Rozmawialiśmy poprzednio na temat trochę „oszukanego” pomiaru temperatury. Okazało się, że micro:bit właściwie nie mierzy temperatury zewnętrznej a raczej temperaturę obudowy kontrolera napędzającego micro:bit. Nie jest to specjalnie dokładny pomiar, ale działa.

Przykładowy program wyświetlający temperaturę po wciśnięciu przycisku „A” składa się… z trzech bloczków:

Problem polega na tym, że czujnik… jest wbudowany w płytkę – a nawet w kontroler:). Żeby dokonać pomiaru trzeba więc umieścić całego micro:bit w mierzonym otoczeniu… Niezbyt to wygodne, prawda? Można temu jednak zaradzić podłączając zewnętrzny czujnik temperatury. Jeden z najprostszych to MCP9700.

MCP9700

Na blogu znajdziecie pełny opis miernika miałem MCP9700 i kilka przykładów jego wykorzystania. W skrócie: miernik sprzedawany jest w obudowie to-92.

mcp_9700

Piny:

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

Jego największą ceną jest niska cena i bardzo prosta obsługa.

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

Wystarczy zmierzyć napięcie na pinie VOUT. Każde 0.01v (10mV) to 1ºC – licząc od -40ºC z przesunięciem o 100mV (-40ºC to 100mV). Stąd 0ºC to napięcie 40*10mV=400mV plus początkowe 100mV – razem 0.5V.  I tak aż do 125ºC (125*0.01 – czyli 1.75V).

Podłączenie MCP do micro:bit

Żeby ułatwić sobie podłączenie, do nóżek miernika dolutowałem przewody z krokodylkami:

Krokodylki podłączyłem do micro:bit:

  • Czerwony (zasilanie)-> do pinu 3v
  • Czarny (masa) -> do pinu GND
  • Zielony (dane) -> do pinu 0.

Pin 0 jest nie tylko wyjściem/wejściem cyfrowym. Jest również jednym z wejść do przetwornika analog/cyfra. Innymi słowy – może mierzyć przyłożone do niego napięcie.

Program  do mierzenia temperatury z MCP9700

Krótki program wyświetli na ekranie temperaturę z miernika:

Po wciśnięciu klawisza „A”, program wyświetla strzałkę w lewo (west) – a potem temperaturę z czujnika mcp9700. Po wciśnięciu klawisza B program wyświetla strzałkę w prawo (east) – a po niej temperaturę z wbudowanego czujnika.

Dla mcp9700 trzeba odczytać napięcie z nóżki VOUT. Podłączyłem ją do pinu „0”, który jest wejściem wbudowanego w micro:bit przetwornika analog/cyfra.

Wyjście z funkcji „analogRead()” może zawierać się od 0..1023. Prawdziwe napięcie „voltage” można oczytać z proporcji:
{{analogRead(0)}\over{voltage}}={1024 \over {3v}}

Przy zasilaniu z usb, napięcie stabilizowane jest na poziomie 3v (o tym poniżej). 3v stanowi więc napięcie odniesienia dla przetwornika analog-cyfra. 3v to 1023. Stąd napięcie „voltage” zmierzone na pinie a0 to:
{voltage}={{analogRead(0) \cdot 3v}\over {1024}}

Problem z tym wzorem polega na tym, że micro:bit posługuje się liczbami całkowitymi. Stąd wynik dzielenia będzie miał raczej kiepską rozdzielczość:) Ale, skoro napięcie MCP wzrasta o 0.01v (10mV) na 1ºC, może łatwiej od razu obliczyć temperaturę? Trzeba jeszcze odjąć 50 stopni na minimalną temperaturę (-40 stopni i 100mV przesunięcia):
{temperatura}={{analogRead(0) \cdot 300}\over {1024}} - 50

Teraz działanie wykona się prawidłowo.

1023 – 1024? Dyskusja stara jak… arduino – albo przetworniki analog-cyfra. Jest kilka ciekawych stron na ten temat, np. Measuring Voltage: Arduino ADC Resolution and Accuracy.

Poważny problem

Program zawiera pewien poważny błąd. Zakłada, że napięcie referencyjne dla przetwornika analog-cyfra (odczytuje napięcie mcp9700) to 3v. I tak będzie – ale jedynie w przypadku zasilania z USB.

Napięcie odniesienia będzie równe napięciu zasilania. Napięcie z USB jest specjalnie stabilizowane na poziomie 3v. Jeżeli jednak zasilicie micro:bit przez pin 3v lub port baterii, napięcie odniesienia przetwornika analog-cyfra… może się zmieniać i wcale nie musi być równe 3v! Na przykład bateria – w miarę czasu będzie się wyczerpywać, jej napięcie spadnie. W tym momencie założone we wzorze „3v” odniesienia (lub 300 we wzorze)… nie będzie miało nic wspólnego z rzeczywistością. „1023” zwrócone przez analogRead() będzie oznaczało 3.0v – a za kilka godzin jedynie 2.8v. Obliczenia temperatury na takiej podstawie będą bezsensowne.

Właśnie zmierzyłem napięcie między pinami GND i 3v przy zasilaniu z USB… wyniosło 3.2084v…

Potrzebujemy więc pewnego wzorca napięcia, którego będziemy pewni. Powiedzmy, że mamy do dyspozycji układ, który zawsze, niezależnie od zasilania będzie dawał 1.2v. Jeżeli zmierzycie jego napięcie za pomocą analogRead(), wtedy otrzymacie, że np. wartość 100 oznacza 1.2v. Napięcie czujnika można wtedy obliczyć z prostej proporcji. Będziemy niezależni od napięcia zasilania.

Kontroler micro:bit zawiera źródło odniesienia 1.2v. Niestety nie można go przełączyć z poziomu bloczków JavaScript. Dodatkowo, zewnętrzne źródło można dokładnie pomierzyć i dodatkowo skalibrować kod.

LM285

LM285 to tanie i proste w użyciu źródło odniesienia napięcia.

 

Badałem, jak LM285 zachowuje się w zależności od napięcia zasilania. micro:bit wymaga co najmniej 1.8v do działania. Absolutnie maksymalne napięcie zasilania  kontrolera to 3.9v. Ja zbadałem zachowanie źródła odniesienia LM285 w granicach – 1.3 – 3.5v. W tym zakresie na wyjściu LM285 napięcie wyniosło 1.232v – a zmieniało się jedynie na ostatniej cyfrze – od 1.2322 do 1.2327v. Użyłem tu rezystora 3.3kΩ.

LM285 i micro:bit

Wpadłem na dość oryginalny pomysł, jak połączyć LM285 z czujnikiem temperatury. Wykorzystałem napięcie zasilające czujnik – a całość zamknąłem… w klocku lego:)

Najpierw wydrążyłem klocek lego:

W jego bokach wywierciłem otwory 3mm:

Prze otwory przeciągnąłem przewody:

Żółty krokodyl będzie wyprowadzeniem odniesienia napięcia z lm285. Sam układ wlutowałem „na pająka”:

Pozostało unieruchomić wszystko gorącym klejem, zamknąć od dołu kolejnym klockiem – i gotowe:

Poprawiony program z napięciem odniesienia

Odniesienie napięcia podłączyłem do pinu 1. Podobnie jak i „0”, można przez niego odczytać wartość napięcia. I teraz: wiem, że wartość odczytana z P1 – odpowiada 1.23v

A więc:
{{P1} \over {1.23}}={{P0} \over {x}}

x będzie napięciem na pinie P0 – czyli z czujnika:
{x} = {{{1.23} \cdot {P0}} \over {P1}}

Nowy program:

Źródła

2 komentarze do “micro:bit:termometr – podłączenie MCP9700 do micro:bit (i lm285)”

Dodaj komentarz