Pomiar temperatury – tinyBrd i wejście analogowe
Nasz sztandarowy przykład dla platformy tinyBrd to pomiar temperatury z użyciem czujnika DS18B20. Działa on świetnie, jednak z naszego punktu widzenia ma jedną wadę. Napięcie zasilające. Co z nim nie tak? Wg karty katalogowej wymaga co najmniej 3V. Przy zasilaniu z dwóch akumulatorów AA osiągamy maks 2.8-2.9V, co już jest poniżej wartości katalogowej. Na szczęście nasze testy pokazują, że DS18B20 dobrze pracuje nawet z napięciem lekko ponad 2.5V ale gwarancji poprawnej pracy nie ma w takim przypadku.
Pomiar temperatury z analogowym czujnikiem
Dla porównania wzięliśmy na warsztat analogowy czujnik MCP9700. Jest to dobrze znany czujnik z naszego Starter Kitu dla Arduino. Prosty w obsłudze (pomiar temperatury to pomiar napięcia), pracuje przy zasilaniu nawet 2.3V, dla tinyBrd wydaje się idealny. Co prawda, gorzej tutaj z dokładnością pomiaru (+/- 2°), ale do prostych zastosowań się nada…
Ponieważ pobór prądu MCP9700 w trakcie pracy to 23 µA, jak dla mnie to za dużo w porównaniu z 5 µA tinyBrd w trybie sleep. Dlatego zamiast zostawić włączony MCP9700 cały czas, włączymy go przed pomiarem, odczekamy chwilę, zmierzymy napięcie i przed pójściem spać z tinyBrd wyłączymy MCP9700.
Najprościej będzie realizować włączenie i wyłączenie przez podpięcie linii zasilania do wyjścia cyfrowego tinyBrd i przez digitalWrite
włączyć zasilanie przed pomiarem. W karcie katalogowej MCP9700 można znaleźć informację, że po włączeniu zasilania napięcie wyjściowe stabilizuje się w czasie ok 0.5 ms. Dlatego wystarczy odczekać 2 ms po włączeniu zasilania, by mieć dobry pomiar.
Podsumujemy – do D1 podłączamy Vcc MCP9700, a sygnał z MCP podłączamy do A0. Przykład z użyciem DS18B20 modyfikujemy w zakładce temperature_meter
. Kod przyjmuje taką postać:
#define SENSOR_PIN A0 #define POWER_SENSOR 1 void temperature_setup() { pinMode(POWER_SENSOR, OUTPUT); analogReference(INTERNAL); }; float temperature_read() { float temp; //power MCP9700 on digitalWrite(POWER_SENSOR, HIGH); //wait for MC9700 settle delay(2); temp = analogRead(SENSOR_PIN) * 1.1 / 1024.0 - 0.5; //power sensor OFF digitalWrite(POWER_SENSOR, LOW); temp = temp / 0.01; // return temp; }
W temperature_setup
ustawiamy napięcie odniesienia przetwornika ADC na tinyBrd na wewnętrzne źródło 1.1V, dzięki czemu napięcie mierzymy z większą dokładnością. Przy czujniku MCP, w zakresie temperatur pokojowych doskonale nam wystarczy ten zakres pomiaru (więcej w tym starszym poście o MCP9700 i Arduino).
Kod został też zmieniony w pierwszej zakładce, bo dla DS18B20 temperature_setup
zwracało wartość, tutaj mamy void
(już wiecie gdzie się natknąłem na void not igonred… ? :) ), także cały kod do pobrania tutaj: tinyBrdTempMCP.
W skrócie – działa rewelacyjnie, temperatura różni nieco się od tej podawanej przez DS18B20, ale w dopuszczalnym zakresie. I w ciągu kilku minut (dosłownie) mamy działający czujnik temperatury wysyłający dane do RaspberryPi. Polecam tinyBrd razem z NRF-Hat, by błyskawicznie mieć bezprzewodową łączność z Raspberry Pi.
Pomiar napięcia przez tinyBrd
Tak naprawdę to chciałem się upewnić, że tinyBrd dobrze radzi sobie z pomiarem napięcia – i faktycznie nie było to problematyczne dzięki użyciu wewnętrznego źródła napięcia odniesienia. tinyBrd, jako kompatybilny moduł z Arduino IDE pozwala się skonfigurować i korzystać jak w przypadku większego Arduino. Dobrze znane funkcje działają tak samo (analogReference
, analogRead
, itp), co pozwala Wam korzystać z zalet tinyBrd (mały pobór mocy i transmisja radiowa) bez konieczności opanowywania rozbudowanego zestawu bibliotek.
Jeżeli trzeba będzie mierzyć napięcie ponad 1.1V, spróbuję użyć odczytu napięcia zasilania oferowane przez bibliotekę Battery (wchodzi w skład Nettigo tinyBrd Core dla Arduino IDE), dokładność powinna być zadowalająca.