LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[PROJEKT] Bezprzewodowy termometr – KAmduino UNO, KAmodBT-HC05 oraz modDS18B20

W projekcie wykonamy bezprzewodowy termometr. Z jego pomocą będzie można zmierzyć temperaturę panującą w innym pokoju lub na zewnątrz, a jej wartość będzie wyświetlona na ekranie naszego telefonu komórkowego.

Do realizacji projektu będziemy potrzebować:

Pierwszą czynnością będzie podłączenie czujnika temperatury oraz modułu Bluetooth do KAmduino UNO przy użyciu płytki stykowej oraz przewodów męsko-męskich. Schemat podłączania jest pokazany na rysunku 1.

Rysunek 1. Schemat podłączenia poszczególnych modułów do KAmduino UNO

Pin KAmduin UNO Pin czujnika temperatury
+5V VCC
GND GND
10 DATA
Pin KAmduin UNO Pin modułu Bluetooth
+5V +V
GND GND
+3,3V +3,3V
0 – RX TxD
1 – TX RxD

Najpierw należy podłączyć czujnik temperatury DS18B20. W naszym przypadku znajduje on się w wodoodpornej obudowie, dzięki czemu możemy go zastosować do mierzenia temperatury za naszym oknem nie martwiąc się o warunki atmosferyczne. Za jego pomocą zmierzymy temperaturę z zakresu od -55°C do 125°C. Czujnik wykorzystuje protokół OneWire do przesyłania informacji o zmierzonej temperaturze. Dzięki zastosowaniu tego interfejsu, możemy podłączyć wiele czujników do mikrokontrolera za pomocą tylko jednego przewodu. Aby nasz czujnik działał prawidłowo musimy podłączyć zasilanie 5 V oraz GND. Wyjście czujnika podłączamy do pinu 10 naszego KAmduino UNO (jak na rysunku 1). Ponadto OneWire wymaga podciągnięcia linii danych do zasilania 5 V. Aby to zrealizować między linią danych a zasilaniem 5 V, wstawiamy rezystor 4,7 kΩ.

Następnie podłączamy moduł Bluetooth – KAmodBT-HC05. Zawiera on układ HC-05 który jest zgodny ze specyfikacją Bluetooth 2.0. Do zasilania wymaga on napięcia 3,3 V, również wyprowadzenia jako stan wysoki tolerują napięcie 3,3 V, jednak na płytce modułu znalazły się konwertery stanów logicznych, dzięki którym możemy bezpiecznie podłączyć go do naszego KAmduino UNO (które pracuje na napięciu 5 V). Komunikacja z modułem odbywa się za pomocą interfejsu UART. Modyfikacje parametrów transmisji (prędkość transmisji, ilość bitów danych, nazwę modułu itp.) jest realizowana za pomocą komend AT. W tym celu trzeba podłączyć moduł z konwerterem UART <> USB i wysyłać odpowiednie komendy AT do zmiany parametrów, które są opisane w dokumentacji do modułu HC-05. Po podłączeniu wszystkich elementów nasz układ prezentuje się następująco (rysunek 2):

Rysunek 2. Podłączone moduły (termometru oraz Bluetooth) do płytki KAmduino UNO

Teraz sprawdzimy działanie naszego czujnika temperatury. W tym celu pobieramy bibliotekę OneWire (link do biblioteki znajduje się w sekcji Do Pobrania). Uruchamiamy IDE Arduino, teraz musimy dodać pobraną bibliotekę OneWire do środowiska Arduino, w tym celu przechodzimy do zakładki Szkic >> Dołącz bibliotekę i wybieramy opcje Dodaj bibliotekę .ZIP (rysunek 3). I wybieramy plik, który pobraliśmy przed chwilą.

Rysunek 3. Instalacja biblioteki OneWire

Następnie otwieramy menu Plik >> Przykłady i w sekcji Przykłady z niestandardowych bibliotek odnajdujemy dodaną przed chwilą bibliotekę OneWire i otwieramy przykład o nazwie DS18x20_Temperature ( rysunek 4).

 UWAGA!
Na czas programowania układu należy odłączyć przewody od modułu Bluetooth (zielony i żółty przewód, czyli TX i RX) ponieważ może to powodować problemy z wgraniem programu na płytkę KAmduino UNO. Po wgraniu programu na płytkę należy z powrotem podłączyć moduł KAmodBT-HC05 do płytki KAmduino UNO.

 

Rysunek 4. Otworzenie przykładu DS18x20_Temperature

Następnie wgrywamy otwarty przykład do naszego KAmduino UNO. Po poprawnym wgraniu programu otwieramy monitor portu szeregowego. Jeżeli wszystko podłączyliśmy poprawnie powinniśmy zobaczyć następujący widok (rysunek 5).

Rysunek 5. Monitor portu szeregowego – Przykładowy program na obsługę czujnika z interfejsem OneWire

Na rysunku 5 widzimy działanie przykładu obsługi termometru DS18B20 z wykorzystaniem interfejsu OneWire. Jako pierwsze wyświetlany jest unikatowy adres naszego czujnika. W następnej linii pojawia się informacja jaki model czujnika podłączonego do magistrali OneWire. W kolejnej linii zawarte są dane o temperaturze zapisane w postaci szesnastkowej oraz obliczona wartość sumy kontrolnej CRC. Następnie wyświetlana jest temperatura zmierzona przez czujnik w stopniach Celsjusza oraz Fahrenheita. Na końcu jest podana informacja, że nie znaleziono innych czujników na tej linii. I cała procedura odczytu czujników znajdujących się na danej linii OneWire oraz odczyt temperatury z czujników powtarza się w pętli. Jednak może wystąpić również sytuacja ukazana na rysunku 6.

Rysunek 6. Problem z połączeniem z czujnikiem temperatury

W monitorze pojawia się informacja, że nie udało się znaleźć żadnego czujnika wykorzystującego interfejs OneWire (podpiętego do pinu 10 Arduino zadeklarowanego w programie). W takiej sytuacji należy sprawdzić połączenia miedzy czujnikiem temperatury a płytką KAmduino UNO. Gdy wszystkie połączenia są zgodne ze schematem przedstawionym na rysunku 1, powodem takiego komunikatu może być np. uszkodzony czujnik temperatury.

Jednak gdy wszystko jest w porządku, możemy przystąpić do dalszej części realizacji projektu. W kolejnym kroku zmodyfikujemy użyty przed chwilą przykład. Należy go przystosować do pracy z modułem Bluetooth oraz zmodyfikujemy formę wyświetlania danych.

Listing zmienionego programu pokazany jest poniżej:

#include <OneWire.h>
// Bezprzewodowy Termometr 
// Kamami 2017 r. 
// Autor: Patryk Mądry 
// W oparciu o przykład "OneWire DS18S20, DS18B20, DS1822 Temperature Example" 
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
//
// Kamami 2017 r. 

OneWire  ds(10);  // pin do którego podłączony został nasz czujnik temperatury 

void setup(void) {
  Serial.begin(38400); // Zmieniamy prędkość transmisji na 38400
  Serial.println("Bezprzewodowy termometr");
  Serial.println("Kamami 2017 r.");
  Serial.println("");
}

void loop(void) {
  
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 
  Serial.println();
  while (1)
  {
      ds.reset();
      ds.select(addr);
      ds.write(0x44, 1);        // start conversion, with parasite power on at the end
      
      delay(1000);     // Opóznienie wprowadzone z powodu czasu trwania pomiaru ( około 750 ms) 
      
      present = ds.reset();
      ds.select(addr);    
      ds.write(0xBE);         // Read Scratchpad
    
      //Serial.print("  Data = "); // Zakomentowanie wyświetlania wyniki w postaci szesnastkowej 
      //Serial.print(present, HEX);
      //Serial.print(" ");
      
      for ( i = 0; i < 9; i++) {           // we need 9 bytes
        data[i] = ds.read();
        //Serial.print(data[i], HEX); // Zakomentowanie wyświetlania wyniki w postaci szesnastkowej 
        //Serial.print(" ");
      }
      
      //Serial.print(" CRC="); // Zakomentowanie wyświetlania wartosci CRC
      //Serial.print(OneWire::crc8(data, 8), HEX);
      //Serial.println();
      
      // Konwersja temeperatury 
      
      // Convert the data to actual temperature
      // because the result is a 16 bit signed integer, it should
      // be stored to an "int16_t" type, which is always 16 bits
      // even when compiled on a 32 bit processor.
      int16_t raw = (data[1] << 8) | data[0];
      if (type_s) {
        raw = raw << 3; // 9 bit resolution default
        if (data[7] == 0x10) {
          // "count remain" gives full 12 bit resolution
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      } else {
        byte cfg = (data[4] & 0x60);
        // at lower res, the low bits are undefined, so let's zero them
        if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
        else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
        //// default is 12 bit resolution, 750 ms conversion time
      }
      
      celsius = (float)raw / 16.0;        // Stopnie Celsjusza
      fahrenheit = celsius * 1.8 + 32.0;  // Stopnie Fahrenheita
      Serial.print("Temperatura = ");
      Serial.print(celsius);
      Serial.println("\260C");
      //Serial.print(fahrenheit);
      //Serial.println(" Fahrenheit");
  }
}

Listing 1. Program bezprzewodowego termometru

Pierwszym krokiem jest zmiana prędkości przesyłania danych na porcie szeregowym. W przykładzie korzystaliśmy z prędkości 9600. Natomiast domyślnie w module KAmodBT-HC05 wynosi ona 38400 i taką wartość należy ustawić w naszym programie.

Serial.begin(38400); // Zmieniamy prędkość transmisji na 38400

Nie potrzebujemy cyklicznie otrzymywać danych o adresie oraz o modelu czujniku. Bardziej zależy nam na wartości temperatury zmierzonej przez czujnik DS18B20. Dlatego pomiar oraz wyświetlanie temperatury zostały umieszczone pętli nieskończonej while ( listing 1, linia 68).

Aby nie była wyświetlana wartość zmierzonej temperatury w postaci szesnastkowej, musimy umieścić w komentarzu linie kodu odpowiedzialne za wyświetlanie tej wartości.

      //Serial.print("  Data = "); // Zakomentowanie wyświetlania wyniki w postaci szesnastkowej 
      //Serial.print(present, HEX);
      //Serial.print(" ");
      
      for ( i = 0; i < 9; i++) {           // we need 9 bytes
        data[i] = ds.read();
        //Serial.print(data[i], HEX); // Zakomentowanie wyświetlania wyniki w postaci szesnastkowej 
        //Serial.print(" ");
      }
      
      //Serial.print(" CRC="); // Zakomentowanie wyświetlania wartości CRC
      //Serial.print(OneWire::crc8(data, 8), HEX);
      //Serial.println();

Ostatnim krokiem będzie dodanie jednostek stopni Celsjusza oraz umieszczenie w komentarzu linii kodu odpowiedzialnych za wyświetlania temperatury w skali Fahrenheita. Warto również przetłumaczyć komunikaty na język polski, aby były bardziej zrozumiałe.

Gdy teraz wgramy zmodyfikowany program na płytkę KAmduino UNO i uruchomimy monitor portu szeregowego, zobaczymy następujące widok (rysunek 7).

 UWAGA!
Musimy pamiętać o zmianie wartości szybkości przesyłania w monitorze portu szeregowego (prawy dolny róg okna), musimy ustawić tam wartość 38400 zgodnie z tym, co znajduje się w programie.

Rysunek 7. Monitor portu szeregowego – program po modyfikacji

Informacja o adresie naszego czujnika oraz i modelu jest wyświetlana tylko raz, przy uruchomieniu naszego programu. Następnie co około jedną sekundę dostajemy informacje o zmierzonej wartości temperatury wyrażoną w stopniach Celsjusza. Jednak nadal, aby odczytywać temperaturę, nasza płytka KAmduino UNO musi być podłączona do komputera.

Dane przesyłane przez USB trafiają również na moduł Bluetooth, gdzie mogą być przesyłane bezprzewodowo. Do połączenia z modułem KAmodBT-HC05 możemy wykorzystać moduł Bluetooth znajdujący się w naszym telefonie komórkowym lub jeżeli nasz komputer jest wyposażony w moduł łączności Bluetooth, możemy go wykorzystać do odbierania danych z naszego bezprzewodowego termometru.

Ja zdecydowałem się na odbieranie danych przy pomocy telefonu komórkowego. W moim przypadku jest to telefon z systemem Android, ale w telefonach z innymi systemami operacyjnymi proces parowania i połączenia przebiega analogicznie. Pierwszym krokiem jest sparowanie modułu KAmodBT-HC05 z naszym telefonem komórkowym. W tym celu uruchamiamy Bluetooth w telefonie i przechodzimy do jego ustawień. Należy pamiętać, żeby nasza płytka KAmduino UNO była uruchomiona. Naciskamy przycisk Wyszukaj urządzenie. Na liście dostępnych urządzeń pojawi się nasz moduł KAmodBT-HC05. Wybieramy go.

Rysunek 8. Ustawienia Bluetooth – lista dostępnych urządzeń 

Na liście dostępnych urządzeń pojawi się moduł KAmodBT-HC05. Wybieramy go. Moduł poprosi nas o podanie kodu PIN (domyślny kod to 1234) i wciskamy przycisk OK. Od teraz nasz telefon komórkowy jest sparowany z modułem Bluetooth znajdującym się na płycie stykowej, można to zauważyć poprzez częstotliwość pracy diody zielonej na module KAmodBT-HC05.

Rysunek 9. Parowanie modułu Bluetooth z telefonem komórkowym – podanie kodu PIN

Teraz przechodzimy do sklepu Google Play i wpisujemy w wyszukiwarkę frazę Terminal Bluetooth, i szukamy programu o nazwie Bluetooth Terminal HC-05 i instalujemy goNastępnie otwieramy zainstalowany program, pojawia nam się lista z sparowanymi modułami. Wybieramy z listy nasz moduł KAmodBT-HC05.

Rysunek 10. Bluetooth Terminal HC-05 – lista sparowanych urządzeń 

Od teraz pomiary będą pojawiać się w oknie naszego terminala. Możemy nacisnąć przycisk reset na płytce KAmduino UNO aby zrestartować działanie programu.

Rysunek 11. Okno terminala – zmierzona temperatura przesyłana przy pomocy komunikacji Bluetooth

Aby nasz termometr uczynić bardziej bezprzewodowym, możemy zasilać go z powerbanku. Taki zestaw możemy umieścić na parapecie, a wodoodporną sondę z czujnikiem temperatury umieścić za oknem. W ten sposób możemy bezprzewodowo odczytywać temperaturę na zewnątrz. Nasz termometr możemy rozbudować o inne czujniki, wilgotności, ciśnienia itp. tworząc w ten sposób bezprzewodową stacje pogodową.

 

Działanie pokazane jest na poniższym filmiku:

 

Autor: Patryk Mądry