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.

tinyBrd z MCP9700 - pomiar temperatury z czujnikiem analogowym
tinyBrd z MCP9700

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.

mcp9700
Sposób podłączenia czujnika temperatury MCP9700 do Nettigo tinyBrd

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.