#1 Logger temperatury [Arduino + czytnik microSD + DS18B20]

Po zakupie Arduino szybko przychodzi moment, w którym chcielibyśmy przygotować coś, co ma szansę nam się przydać. Właśnie takim układem się dzisiaj zajmiemy. Przygotujemy prosty zewnętrzny logger temperatury, który będzie zapisywał odczyty na karcie micro SD.

Wpis podzieliłem na 2 artykuły, aby był bardziej czytelny – w pierwszej części zajmiemy się obsługą czujnika natomiast w drugim czytnikiem kart micro SD i zapisem informacji.


Potrzebne elementy

Zaczniemy od przygotowania wszystkich elementów. Nie będziemy potrzebowali zbyt wiele, wystarczy:

  • Arduino (w tym wypadku UNO – instrukcja może delikatnie różnić się dla innych modeli)
  • Czytnik kart microSD (ja zastosuję moduł zawierający stabilizator napięcia i bufor)
  • Sonda wodoodporna wyposażona w cyfrowy termometr DS18B2 (lub sam termometr w obudowie THT)
  • Rezystor 4.7 K
  • trochę przewodów połączeniowych
  • płytka stykowa
  • karta micro SD o dowolnej pojemności

Wpierw przyjrzyjmy się naszemu termometrowi DS18B2. Żeby go obsługiwać potrzebne nam będą dwie biblioteki, które bardzo ułatwią pracę prace z nim. Będą to:

Pobieramy je, a następnie dodajemy do aplikacji Arduino klikając “szkic” –> “dołącz bibliotekę” –> “dodaj bibliotekę .zip” –> wybieramy pobrane biblioteki.


Podłączenie czujnika

Gdy mamy już potwierdzenie, że biblioteki zostały dodane, możemy przejść do sprawdzenia adresu. Podłączmy sondę – czerwony przewód do +5V w Arduino, czarny do GND, natomiast żółty do pinu nr 2 wraz z rezystorem podciągającym, tak jak to zostało pokazane poniżej.

termometr


Programowanie

Czujnik posługuje się interfejsem One Wire więc, aby móc się z nim wymieniać danymi potrzebujemy jego 64-bitowy adres, który można łatwo odczytać za pomocą poniższego programu:

#include <OneWire.h>
OneWire onewire(7);

void setup() {
  while(!Serial);
  Serial.begin(9600);
}

void loop() {
  byte address[8];
  
  onewire.reset_search();
  while(onewire.search(address)) {
    if (address[0] != 0x28)
      continue;
      
    if (OneWire::crc8(address, 7) != address[7]) {
      Serial.println(F("1-Wire bus connection error!"));
      break;
    }
    
    for (byte i=0; i<8; i++) {
      Serial.print(F("0x"));
      Serial.print(address[i], HEX);
      
      if (i < 7)
        Serial.print(F(", "));
    }
    Serial.println();
  }
  
  while(1);
}

Wgrywamy program do naszego Arduino i uruchamiamy “Monitor szeregowy”. Jeżeli wszystko poprawnie podłączyliśmy, powinien ukazać nam się nasz adres, a właściwie nie nasz, tylko czujnika. U mnie wygląda to tak:

0x28, 0xAB, 0xAF, 0x1E, 0x0, 0x0, 0x80, 0x47

Znamy już adres więc nie pozostało nam nic innego jak odczytać temperaturę. Wgrywamy do Arduino poniższy program pamiętając o zmianie adresu na ten, który odczytaliśmy.

#include <OneWire.h> // dodajemy potrzebne biblioteki
#include <DS18B20.h>

byte address[8] = {0x28, 0xAB, 0xAF, 0x1E, 0x0, 0x0, 0x80, 0x47}; // podajemy odczytany wcześniej adres
#define ONEWIRE_PIN 2 // definiujemy pin do które podłączony jest czujnik, w naszym wypadku pin 2

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

void setup() {
  Serial.begin(9600);
  sensors.begin();
  sensors.request(address);
}

void loop() {
  if (sensors.available())   {
    float temperature = sensors.readTemperature(address);
    Serial.print(temperature);
    Serial.println(F(" 'C"));
    sensors.request(address);
  }
}

Jeżeli nadal wszystko jest dobrze, to po uruchomieniu “monitora szeregowego” powinny nam się ukazać odczyty z termometru.

Dodatkowo już jakiś czas temu w Arduino IDE dodano opcję automatycznego tworzenia wykresów z odczytów. Wystarczy kliknąć “narzędzia” –> “monitor portu szeregowego” (grafika #1 i grafika #2).

Na tym zakończymy tę część. Dowiedzieliśmy się jak korzystać z DS18B20 i jak odczytywać z niego temperaturę. W kolejnym artykule dowiecie się natomiast jak zapisać te dane na karcie pamięci. … Druga część artykułu!

Karol Wojsław

Karol Wojsław - założyciel i redaktor Mechatrobot.pl. Interesuje sie elektroniką oraz informatyką.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.