SantyagoSantyago
YouTube RSS Google+ Facebook GitHub

Okazje Allegro

LCD OLED 3.1'' SPI SSD1322 ARDUINO kolor żółty

LCD OLED 3.1'' SPI SSD1322 ARDUINO kolor żółty
Kup teraz: 90,00 zł

Przycisk wandaloodporny 16mm, LED RGB, C-P-K, 1NO

Przycisk wandaloodporny 16mm, LED RGB, C-P-K, 1NO
Kup teraz: 32,00 zł

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Sprzęt dostarczają

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Popularne wpisy

Facebook

Google+

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Pirometr z czujnikiem MLX90614ESF-BAA

Kiedy zachodzi konieczność bezdotykowego pomiaru temperatury badanego obiektu, a nie mamy możliwości zamocowania odpowiedniego czujnika temperatury, z pomocą przyjdzie nam pirometr. Jednym z dostępnych tego typu modułów jest GY-906 wykorzystujący czujnik MLX90614ESF-BAA z oferty sklepu Kamami. Wykorzystany tutaj czujnik pozwoli nam zarówno na pomiar temperatury otoczenia jak i badanego obiektu. Pod względem budowy zawiera w sobie zintegrowany wzmacniacz o niskim poziomie szumów, procesor DSP oraz 17-bitowy przetwornik ADC.

MLX90614 jest dostępny w kilku wariantach, różniących się wartością napięcia zasilającego, zakresem pomiaru temperatury otoczenia oraz ogólnym przeznaczeniem.

Pierwszy człon ESF oznacza, że mamy do czynienia z czujnikiem mierzonej temperatury otoczenia z zakresu -40°C…85°C  (pierwsza litera E) oraz obudowie TO-39 (dwie ostatnie litery SF). Gdybyśmy potrzebowali czujnika o większym zakresie wartości temperatur -40°C…125°C, powinniśmy wybrać wersję "K" (czyli MLX90614KSF). Drugi człon BAA informuje nas o napięciu zasilania 3V (pierwsza litera B), natomiast ostatnie dwie litery definiują liczbę stref oraz typ obudowy, który ma bezpośredni wpływ na obszar widzenia FOV (Field of View) o którym nieco później.

Tabela opisu wersji czujnika MLX90614:

  Temperatura otoczenia Obudowa   Zasilanie / Dokładność Liczba stref FOV
MLX90614 E (-40°C…85°C)
K (-40°C…125°C)
SF (TO-39) - A (5V)
B (3V)
D (3V) dokładność medyczna
A - pojedynczy
B - podwójny
C - kompensowany
A - 90°
C - 35°
F - 10°
H - 12°
I - 5°

Powróćmy jednak do naszego modułu, który został konkretnie wyposażony w czujnik MLX90614ESF-BAA. Posiada on już wbudowany stabilizator napięcia 3.3V oraz rezystory podciągające magistralę I2c do zasilania rezystorami o wartości 4.7 kΩ. Wiemy również, że zakresy mierzonych temperatur to: -40°C…85°C dla temperatury otoczenia oraz -40°C…380°C dla temperatury badanego obiektu. Moduł charakteryzuje się dokładnością pomiaru 0.5°C dla zakresu pomiarowego To=0°C…60°C (temperatura obiektu), Ta=0°C…50°C (temperatura otocznia) z rozdzielczością 0.2°C. Największy błąd pomiarowy z jakim przyjdzie nam się spotkać to ±4°C, jednak dla bardzo wysokich temperatur.

Istnieje również wersja "medyczna" czujnika, która charakteryzuje się mniejszym błędem pomiarowym w szczególnym zakresie temperatury badanego obiektu oraz otoczenia. Dla pozostałcyh zakresów obowiązuje wykres powyżej.

Jak wspomniałem wcześniej, czujnik może komunikować się mikrokontrolerem za pomocą magistrali I2c, jednak możliwy jest również odczyt pomiarów za pomocą sygnału PWM o rozdzielczości 10 bitów i okresie 1,024ms, dzięki czemu możliwe jest opracowanie układu bez udziału mikrokontrolera. Domyślnym adresem czujnika na magistrali I2c jest 0x5A. Deklarowany pobór prądu to 2mA podczas normalnej pracy i maksymalnie 6uA w trybie uśpienia. 

Jak działa pirometr?

Każdy przedmiot emituje promieniowanie podczerwone (znane również jako promieniowanie cieplne), które jest odczuwalne, ale nie jest dla nas widoczne. Natężenie tego promieniowania jest tym większe, im wyższa jest temperatura danego przedmiotu.

Powyższe zdjęcie zostało uzyskane za pomocą profesjonalnej kamery FLIR, jednak doskonale oddaje istotę rzeczy. Niestety urządzenia te są bardzo drogie i prędzej spotkamy się z punktowymi przyrządami (pirometrami), szerzej znanymi jako termometrami bez dotykowymi.

Kamera FLIR po lewo / Pirometr UNI-T po prawo

Zadaniem pirometru jest więc zmierzenie natęzenia promieniowana podczerwonego emitowanego przez przedmiot, padającego na obszar aktywny czujnika. Tak zmierzoną wielkość czujnik przelicza na odpowiadającą mu temperaturę przedmiotu. Należy jednak pamiętać, że otrzymana wartość jest wartością uśrednioną całkowitego promieniowania padającego na czujnik, dlatego należy pamiętać o doborze odpowiedniej odległości od badanego obiektu, która nie może być zbyt wielka. Jak wielka? Na to pytanie odpowie nam parametr FOV lub współczynnik odległości do rozmiaru obiektu D:S.

Obszar widzenia FOV, a badany obiekt

FOV jest bardzo istotnym parametrem, który definiuje nam z jakiej maksymalnej odległości możemy zmierzyć temperaturę obiektu o określonym rozmiarze. Żeby to dokładnie zrozumieć, musimy uświadomić sobie fakt, że ze względu na budowę czujnika, obszar z którego odbierane jest emitowane promieniowanie podczerwone wyznaczone jest przez okrąg o określonej średnicy. Drugim ważnym elementem jest zachowanie warunku, aby wyznaczony okrąg znajdował się wewnątrz obiektu. Pamiętajmy, że pirometr wyznacza średnią całkowitego emitowanego promieniowania.

Skoro czujnik przetwarza średnią wartość odbieranego promieniowania, łatwo więc zauważyć, że w drugim przypadku zmierzona temperatura będzie odpowiadała średniej częściowego promieniowaniu emitowanego przez badany obiekt i otoczenia. Co oczywiście przełoży nam się na błędny pomiar.

O tym, jak daleko może znajdować się czujnik od obiektu mówi nam właśnie parametr FOV określony miarą kątową w stopniach.

W zależności od wersji czujnika MLX90614, kąty pola widzenia FOV wynoszą odpowiednio: 90°, 35°, 12°, 10° i 5°. Im mniejszy jest ten kąt, tym dalej może znajdować się czujnik od badanego obiektu.

Dla kątów mniejszych niż 45° obowiązują zależności, dzięki którym określimy jaka może być maksymalna odległość (jeśli znamy rozmiar obiektu) lub jaki jest maksymalny rozmiar obiektu dla zadanej odległości.

S = tan(δ) * D

D = S / tan(δ)


Załóżmy, że chcemy zbadać temperaturę obiektu oddalonego od czujnika o 100 cm o wartości FOV = 10°:

S = tan(δ) * D
S = tan(10°) * 100 cm
S = 0.1763269807 * 100 cm
S = 17.63269807 cm

Zatem z odległości 1 metra, możemy mierzyć temperaturę obiektu większego niż 17cm. Analogicznie, gdybyśmy chcieli wiedzieć z jakiej maksymalnej odległości możemy zbadać temperaturę obiektu o rozmiarze 5 cm? Proszę bardzo:

D = S / tan(δ)
D = 5 cm / tan(10°)
D = 5 cm / 0.1763269807
D = 28.35640909945 cm

Maksymalna odległośc od obiektu o rozmiarze 5 cm to 28 cm.

Dla kątów większych niż 45° do obliczeń przyjmujemy jego połowę, a otrzymany wynik mnożymy przez 2. Tak też musimy postąpić w przypadku naszego badanego dziś modułu, ponieważ jego kąt widzenia to 90°.

S / 2 = tan(δ / 2) * D
S / 2 = tan(90° / 2) * 1 cm
S / 2 = 1 cm
S = 2 cm

Jak widzimy dla kątą FOV 90° z każdym centymetrem odległości od obiektu jego rozmiar musi być co najmniej dwukrotnie większy niż sama odległość. To całkiem sporo, gdyż z odległości 10 cm, minimalny rozmiar obiektu musi mieć co najmniej rozmiar 20cm. Dlatego mierząc temperaturę tym konkretnym czujnikem, odległość musi być możlwie najmniejsza.

Na tym przykładzie również widzimy, że współczynnik D:S wynosi 1:2.

Współczynnik emisyjności ε

Na dokładność pomiaru temperatury ma również współczynnik emisyjności. O co chodzi? Materiały mają różną zdolność emitowania promieniowania podczerwonego ze swojej powierzchni. Wartość ta zależy głównie od barwy powierzchni jak i jej gładkości. Jak wiadomo, materiały o powierzchni szortstkiej i ciemnej mają większą zdolność emisyjną niż materiały o barwie jasnej i gładkiej. Przykładowo ludzka skóra posiada wpółczynnik emisyjności ε = 0.98, ale już wypolerowane na glanc alumunium ε = 0.05. Tak więc również musimy o tym pamętać, mierząc temperaturę obiektu. W naszym MLX90614,fabrycznie ustawiony jest współczynnik ε = 1.0, który możemy zmienić na etapie użytkowania.

Wybrane martiały i współczynnik ε

Materiał ε
Aluminium niepolerowane 0,07
Aluminium polerowane 0,05
Brąz polerowany 0,1
Brąz surowy 0,55
Cegła ogniotrwała 0,94
Cegła standardowa 0,85
Cement 0,54
Chrom polerowany 0,1
Cynk i blacha 0,2
Farba olejowa 0,94
Guma 0,93
Kwarc 0,93
Lakier biały 0,87
Lakier czarny błyszczący 0,87
Lakier czarny matowy 0,97
Lód 0,97
Lódzka skóra 0,98
Miedź oczyszczona, polerowana 0,07
Miedź polerowana 0,07
Mosiądz polerowany 0,03
Mosiądz zmatowiony 0,22
Materiał ε
Ołów błyszczący 0,08
Ołów oksydowany 0,63
Ołów szary 0,28
Papa 0,92
Papier biały 0,9
Papier czarny 0,9
Platyna polerowana 0,08
Porcelana glazurowana 0,92
Puszka polerowana 0,05
Sadza 0,96
Stal walcowana 0,24
Szkło 0,92
Szkło matowe 0,96
Śnieg 0,8
Taśma izolacyjna, czarne tworzywo 0,95
Węgiel drzewny 0,96
Węgiel oczyszczony 0,8
Włókno azbestowe 0,78
Woda 0,98
Złoto polerowane 0,02
Zmrożona ziemia 0,93

Pamięć RAM / EEPROM

Czujnik MLX90614 posiada wbudowaną pamięć, gdzie przechowywane są wyniki pomiarów oraz 64-bajtową pamięć EEPROM (32 x 16 bitowe rejestry), z której możemy odczytać wartości minimalne i maksymalne badanego obiektu, zakres temperatury otoczenia, skonfigurować wyjście PWM, ustawić parametry filtrów FIR/IIR, skorygować współczynnik emisyjności ε oraz odczytać 8-bajtowy identyfikator produktu. Co ciekawe za pomocą specjalnego rejestru możemy zmienić na stałe adres na magistrali I2c, co pozwala nam podłączyć do 127 czujników do jednej szyny.

Struktura pamięci RAM

Nazwa Adres Flagi Uwagi
Raw Data IR channel 1 0x04 R Dane surowe z kanału 1
Raw Data IR channel 2 0x05 R Dane surowe z kanału 2
Ta 0x06 R Temperatura otoczenia
Tobj1 0x07 R Temperatura obiektu (kanał 1)
Tobj2 0x08 R Temperatura obiektu (kanał 2)

Struktura pamięci EEPROM

Nazwa Adres + 0x20 Flagi Uwagi
Tomax 0x00 R/W Maksymalna temperatura obiektu
Tomin 0x01 R/W Minimalna temperatura obiektu
PWMCTRL 0x02 R/W Konfiguracja trybu PWM
Ta range 0x03 R/W Zakres temperatury otoczenia
Emissivity 0x04 R/W Domyślnie 0xFFFF (ε=1.0)
Config Register1 0x05 R/W Konfiguracja filtrów FIR/IIR, wzmocnienia
SMBUS address 0x0E R/W Domyślnie 0x005A (tylko LSB)
ID number 0x1C R Numer identyfikacyjny
ID number 0x1D R Numer identyfikacyjny
ID number 0x1E R Numer identyfikacyjny
ID number 0x1F R Numer identyfikacyjny

Z naszego punktu widzenia  najistotniejsze są rejestry konfiguracji współczynnika emisyjności oraz adresu na szynie I2c. Na pewno przyda nam się również numer identyfikacyjny, gdybyśmy chcieli wiedzieć z którego konkretnie czujnika pochodzą dane w przypadku ich większej ilości. Rejestry 0x00 - 0x03 przydadzą nam się w momencie potrzeby wyjścia danych w formacie PWM (nota aplikacyjna), które nie mają wpływu na wyście w trybie cyfrowym I2c.

Ponieważ nasz czujnik posiada jeden kanał, dostępne dane będą pod adresami rejestrów 0x04. 0x06 oraz 0x07.

Podłączenie do Arduino

Podłączenie modułu nie może być już prostsze. Wystarczy podłączyć zasilanie 5V, masę oraz I2c (piny A4 i A5).

Biblioteka Adafruit

Jeśli potrzebujemy tylko odczytać pomiary z czujnika, możemy skorzystać z gotowej biblioteki Adafruit_MLX90614. Jest ona niestety bardzo prosta i nie umożliwia dostępu do pamięci EEPROM w celu konfiguracji własnego adresu modułu czy zmiany współczynnika emisyjności. Niemniej jednak wykorzystamy nam do prostego przykładu. Za pomocą pomocą poniższego programu odczytamy temperaturę badanego obiektu i temperaturę otoczenia. Tak naprawdę okazuje się, że temperatura otoczenia jest temperaturą samego czujnika. Wyniki możemy prezentować w °C i °F. Jak się okazuje, otrzymane wyniki są powtarzalne i stabilne.

  1. #include <Wire.h>
  2. #include <Adafruit_MLX90614.h>
  3.  
  4. // Adafruit_MLX90614 mlx = Adafruit_MLX90614(0x5A);
  5. Adafruit_MLX90614 mlx = Adafruit_MLX90614();
  6.  
  7. void setup()
  8. {
  9.   Serial.begin(9600);
  10.   mlx.begin();  
  11. }
  12.  
  13. void loop()
  14. {
  15.   Serial.print("*C: Ta = ");
  16.   Serial.print(mlx.readAmbientTempC());
  17.   Serial.print(", To = ");
  18.   Serial.println(mlx.readObjectTempC());
  19.  
  20.   Serial.print("*F: Ta = ");
  21.   Serial.print(mlx.readAmbientTempF());
  22.   Serial.print(", To = ");
  23.   Serial.println(mlx.readObjectTempF());
  24.  
  25.   Serial.println();
  26.   delay(500);
  27. }

Zmiana adresu I2c

Domyślnie czujnik MLX90614 znajduje się pod adresem 0x5A. Gdy zaistnieje jednak potrzeba wykorzystania kilku takich czujników, konieczne będzie nadanie im unikatowych adresów. W przypadku MLX90614 może być to wartość od 0x00 do 0x7F.

Aby zmienić adres czujnika, musimy wpisać nową wartość adresu do pamięci EEPROM o adresie 0x2E. Aby tego dokonać, wpierw musimy zawartość wymazać, a dopiero potem zapisać.

O ile z odczytem zawartości pamięci EEPROM nie ma problemu, to do zapisu będziemy potrzebowali jeszcze wyliczyć kod PEC, który opiera się na CRC8 z wielomianem X8+X2+X1+1 (funkcja crc8())

Nowy adres wpisujemy do zmiennej uint16_t newAddr = 0x70; Ponieważ program wykorzystuje adres rozgłoszeniowy 0x00 do odnalezienia czujnika, należy pamiętać, że czujnik musi znajdować się sam na magistrali I2c podczas całego procesu.

Po wymazaniu i zapisaniu nowej wartości, program będzie czekał 10 sekund, abyśmy mieli czas na odłączenie czujnika od zasilania i ponowne jego podłączenie.

  1. #include <Wire.h>
  2.  
  3. uint16_t newAddr = 0x70;
  4.  
  5. uint8_t crc = 0;
  6. uint8_t addr = 0;
  7.  
  8. uint8_t crc8(uint8_t data)
  9. {
  10.     uint8_t i = 8;
  11.     crc ^= data;
  12.     while (i--) crc = crc & 0x80 ? (crc << 1) ^ 7 : crc << 1;
  13.     return crc;
  14. }
  15.  
  16. uint16_t read16(uint8_t cmd)
  17. {
  18.     uint16_t val;
  19.     uint8_t pec,pec2;
  20.     crc = 0;
  21.     
  22.     Wire.beginTransmission(addr);
  23.     Wire.write(cmd);
  24.     Wire.endTransmission(false);
  25.     
  26.     delayMicroseconds(125);
  27.  
  28.     Wire.requestFrom(addr, (uint8_t)3);
  29.  
  30.     val = Wire.read();
  31.     val |= Wire.read() << 8;
  32.  
  33.     pec = Wire.read();
  34.     
  35.     crc8(addr << 1);
  36.     crc8(cmd);
  37.     crc8((addr << 1) + 1);
  38.     crc8(lowByte(val));
  39.  
  40.     pec2 = crc8(highByte(val));
  41.  
  42.     if (pec != pec2)
  43.     {
  44.        Serial.print("!PEC ERROR! ");
  45.     }
  46.  
  47.     return val;
  48. }
  49.  
  50. void write16(uint8_t cmd, uint16_t data)
  51. {
  52.     uint8_t pec;
  53.     crc = 0;
  54.  
  55.     crc8(addr << 1);
  56.     crc8(cmd);
  57.     crc8(lowByte(data));
  58.     pec = crc8(highByte(data));
  59.  
  60.     Wire.beginTransmission(addr);
  61.     Wire.write(cmd);
  62.  
  63.     Wire.write(lowByte(data));
  64.     Wire.write(highByte(data));
  65.  
  66.     Wire.write(pec);
  67.     
  68.     Wire.endTransmission(true);
  69. }
  70.  
  71. void setup()
  72. {
  73.   Wire.begin();
  74.     
  75.   Serial.begin(115200);
  76.  
  77.   Serial.println("Zapodaj dowolny znak i enter...");
  78.  
  79.   while (!Serial.available()) {  }
  80.  
  81.   if ((addr == 0x00) && (newAddr &= 0x7F))
  82.   {
  83.     Serial.print("Szukam adresu czujnika ... ");
  84.     addr = read16(0x2E);
  85.     Serial.print("0x"); Serial.println(addr, HEX);
  86.     
  87.     if (newAddr != addr)
  88.     {
  89.       Serial.print("Zmienam adres czujnika z ");
  90.       Serial.print("0x"); Serial.print(addr, HEX);
  91.       Serial.print(" na ");
  92.       Serial.print("0x"); Serial.println(newAddr, HEX);
  93.  
  94.       Serial.println("Czyszczenie komorki...");
  95.       write16(0x2E, 0x0000);
  96.       
  97.       delay(1000);
  98.       
  99.       Serial.println("Zapisywanie komorki...");
  100.       write16(0x2E, newAddr);
  101.  
  102.       Serial.println("Gotowe... odlacz i podlacz zasilanie czujnika.");
  103.       Serial.println("Za 10s nastapi ponowne wyszukiwanie adresu.");
  104.  
  105.       for (byte i = 0; i < 10; i++)
  106.       {
  107.         delay(1000); Serial.println("*");
  108.       }
  109.      
  110.       addr = 0;
  111.       Serial.print("Ponownie szukam adresu czujnika ... ");
  112.       addr = read16(0x2E);
  113.       Serial.print("0x"); Serial.println(addr, HEX);
  114.     } else
  115.     {
  116.       Serial.print("Czujnik juz posiada adres ");
  117.       Serial.print("0x"); Serial.print(addr, HEX);
  118.     }
  119.   } else
  120.   {
  121.      Serial.println("Blad. Nowy adres moze byc od 0x01 - 0x7F");
  122.   }
  123. }
  124.  
  125. void loop()
  126. {
  127. }

Zmiana współczynnika emisyjności

Współczynnik emisyjności ustawiamy w rejestrze pamięci EEPROM o adresie 0x24. Jego wartość wylicza się na podstawie poniższego wzoru:

Emissivity = 65535 * ε
dla ε = 0 ... 1

Przykładowo dla wartości ε = 0.98:

Emissivity = 65535 * 0.98 = 64224 = 0xFAE0

Przydatna może okazać się również zależność, dzięki której chcielibyśmy wyznaczyć współczynnik emisyjności ε na podstawie odczytu temperatury z czujnika MLX90614 (Tomeas) i rzeczywistej temperatury zmierzonej termometrem dotykowym (Toreal). Do wyznaczenia współczynnika emisyjności będziemy potrzebowali jeszcze temperatury otoczenia (Ta):

Emissivity = (Tomeas4 - Ta4) / (Toreal4 - Ta4)

Zalecane jest, aby temperatura badanego obiektu była wyższa od temperatury otoczenia co najmniej 5°C.

  1. #include <Wire.h>
  2.  
  3. uint8_t crc = 0;
  4. uint8_t addr = 0x70;
  5.  
  6. char buff[20];
  7.  
  8. uint8_t crc8(uint8_t data)
  9. {
  10.     uint8_t i = 8;
  11.     crc ^= data;
  12.     while (i--) crc = crc & 0x80 ? (crc << 1) ^ 7 : crc << 1;
  13.     return crc;
  14. }
  15.  
  16. uint16_t read16(uint8_t cmd)
  17. {
  18.     uint16_t val;
  19.     uint8_t pec,pec2;
  20.     crc = 0;
  21.     
  22.     Wire.beginTransmission(addr);
  23.     Wire.write(cmd);
  24.     Wire.endTransmission(false);
  25.     
  26.     delayMicroseconds(125);
  27.  
  28.     Wire.requestFrom(addr, (uint8_t)3);
  29.  
  30.     val = Wire.read();
  31.     val |= Wire.read() << 8;
  32.  
  33.     pec = Wire.read();
  34.     
  35.     crc8(addr << 1);
  36.     crc8(cmd);
  37.     crc8((addr << 1) + 1);
  38.     crc8(lowByte(val));
  39.  
  40.     pec2 = crc8(highByte(val));
  41.  
  42.     if (pec != pec2)
  43.     {
  44.        Serial.print("nPEC ERROR! ");
  45.        Serial.print(pec, HEX);
  46.        Serial.print(":");
  47.        Serial.println(pec2, HEX);
  48.     }
  49.  
  50.     return val;
  51. }
  52.  
  53. void write16(uint8_t cmd, uint16_t data)
  54. {
  55.     uint8_t pec;
  56.     crc = 0;
  57.  
  58.     crc8(addr << 1);
  59.     crc8(cmd);
  60.     crc8(lowByte(data));
  61.     pec = crc8(highByte(data));
  62.  
  63.     Wire.beginTransmission(addr);
  64.     Wire.write(cmd);
  65.  
  66.     Wire.write(lowByte(data));
  67.     Wire.write(highByte(data));
  68.  
  69.     Wire.write(pec);
  70.     
  71.     Wire.endTransmission(true);
  72. }
  73.  
  74. void setup()
  75. {
  76.   uint16_t eraw;
  77.   float e;
  78.  
  79.   Wire.begin();
  80.     
  81.   Serial.begin(115200);
  82.  
  83.   Serial.println("Zapodaj dowolny znak i enter...");
  84.  
  85.   while (!Serial.available()) {  }
  86.  
  87.   Serial.print("Aktualny e=");
  88.   eraw = read16(0x24);
  89.   e = eraw / 65535.0;
  90.   Serial.println(e);
  91.  
  92.   eraw = 0.95 * 65535;
  93.   Serial.print("Zapisuje nowa wartosc eraw = ");
  94.   Serial.println(eraw, HEX);
  95.  
  96.   write16(0x24, 0x0000);
  97.   delay(1000);
  98.   write16(0x24, eraw);
  99.   delay(1000);
  100.       
  101.   Serial.print("Aktualny e=");
  102.   eraw = read16(0x24);
  103.   e = eraw / 65535.0;
  104.   Serial.println(e);
  105. }
  106.  
  107. void loop()
  108. {
  109. }

Porównanie na tle innych czujników i przyrządów

Do porównania wyników z naszym czujnikiem wykorzystamy dwa termometry bezdotykowe - medyczny Microlife NC 150 (w trybie pracy pomiaru przedmiotów i płynów) oraz techniczny UNI-T UT300C. Dla wszystkich trzech e=0.95

MLX90614 prezentował prawie identyczne wyniki co Microlife NC150. Zupełnie zaskoczony jestem tutaj UNI-T UT300C. Albo myliła się para konkurencyjna... albo on :)

Mam hipotermię?!

Czy badanym dziś czujnikiem możemy zmierzyć temperaturę ciała? Można, ale tutaj zaczynają się pewne schody. Pomimo znanego współczynnika emisyjności dla ludzkiej skóry ε = 0.98, zmierzona temperatura na dłoni wyniosła 33.2°C. To by wskazywało na stan hipotermii spowodowany zbyt szybkim ochładzaniem organizmu, gdzie temperatura ciała dla zdrowej osoby powinna być w okolicach 36,6°. Nie posiadam jednak typowych objawów hipotermii: zawrotów głowy, odczuwanie niepokoju, brak wrażliwości na bodźce.

Wszystko jest w porządku, ponieważ pirograf nie mierzy temperatury ciała, a temperaturę powierzchni skóry dla której normalna temperatura mieści się w granicy 32°C - 34°C.  Taka temperatura wynika z faktu znaczącego udziału naszej skóry w zachowaniu bilansu cieplnego i termoregulacji ciała. Czy to oznacza, że możemy do niej dodać stałe "kilka stopni", aby otrzymać właściwą temperaturę ciała? Absolutnie nie.

Na rynku są dostępne termometry bezdotykowe, które mierzą temperaturę ciała, zacząłem więc poszukiwać informacji na ten temat, przebywając długą i ciekawą drogę po publikacjach medycznych. I chociaż muszę przyznać, że lekarzy boję się jak braku prądu, to temat okazał się pasjonujący i bardzo ciekawy.

Wśród przeróżnych metod pomiaru temperatury rdzenia (ciała) były i takie, które wykorzystywały metody chirurgiczne. Niestety moja asystentka odmówiła udziału w badaniu, więc niepocieszony czytałem na ten temat co raz więcej. Każda część ciała wydziela inną dawkę ciepła, więc naturalną siłą rzeczy będą różne jego wskazania w różnych jego miejscach. Na dokładniejsze odczyty pozwalają pomiary temperatury w ustach lub w najcieplejszym miejscu - wnętrza ucha. Oczywiście znów metoda inwazyjna, więc asystentka ponownie odmówiła udziału.

Do wyznaczenia temperatury ciała istnieje metoda, która uwzględnia zasady utraty ciepła z powierzchni ludzkiej skóry, znana jako: tętniczy bilans cieplny (AHB - Arterial Heat Balance) dla tętnicy skroniowej, uwzględniającą średnią ważoną pomiędzy temperaturą powierzchni (Ts), a temperaturą otoczenia (Ta).

Tciała = k * (Ts - Ta) + Ts

Pojawia się dodatkowy współczynnik "k", który zależy od szybkości perfuzji krwi, konkretnie przepływu przez tkankę lub narząd. W obszarze tętnicy skroniowej współczynnik "k" wynosi od 0.09 do 0.13. Typowo przyjmuje się wartość k=0.13 oraz ε=0.95. Dalej jednak jest to metoda przybliżona, gdyż na temperaturę skóry wpływa jeszcze wiele innych czynników. Warto do pomiaru temperatury otoczenia Ta skorzystać z dodatkowego czujnika. Zbliżenie MLX90614 na tyle blisko do badanego przedmiotu powoduje jego ogrzanie. W zależności od miejsca (np. czoła) współczynnik "k" będzie naturalnie inny.

Więc jeśli myślicie, że termometr bezdotykowy mierzy naszą temperaturę ciała prawidłowo - to nie - nie mierzy i nigdy nie będzie, jak drogi by nie był.

Ciekawostki warte uwagi

Czy możemy zmierzyć temperaturę powietrza?

I tak, i nie. Nie, ponieważ powietrze nie emituje podczerwieni. Tak, ponieważ możemy zbadać temperaturę wszystkiego, co ma taką samą temperaturę jak powietrze. Na zewnątrz mogą to być liście, drzewa, trwa (w cieniu). Wewnątrz budynku może to być kawałek papieru.

Czy termometr IR jest szkodliwy?

Nie, ponieważ nie emituje żadnego promieniowania, tylko mierzy. W przypadku termometrów z wskaźnikiem laserowym pomagającym na określenie środka badanego obszaru należy pamiętać, aby nie celować wskaźnikiem w oczy. Medyczne termometry z reguły nie posiadają laserowego celownika, a zwykłą, punktową diodę LED, na przykład niebieską.

Z jakich odległości można mierzyć temperaturę?

Promieniowanie podczerwone mieści się w zakresie 8μm do 15μm. Ziemska atmosfera w większości przypadków jest przeźroczysta dla tego zakresu długości fali. Możliwe jest więc zmierzenie temperatury nawet do 100 metrów - o ile nie pada, nie ma mgły, czy większych zanieczyszczeń powietrza. Z odległości 1km również jest to możliwe, ale będziemy potrzebować odpowiedniego tła obiektu do odczytu.

Czy czujnik dzaiała w ciemnościach?

Tak. Właściwość ta szczególnie wykorzystywana jest przez wojsko.

Czy możliwe jest przenikanie badanego obiektu i zmierzenia temperatur w jego środku?

Nie. Wewnętrzna temperatura nie może być zmierzona, chyba że zależy ona od temperatury powierzchni. Takie rzeczy spotkasz tylko w filmach.

Czy mogę zmierzyć temperaturę rybki w akwarium?

Nie. Woda i szkło są przeźroczyste jedynie dla światła widzialnego, ale nie dla podczerwieni.  Promieniowanie podczerwone wysyłane przez rybkę nie przeniknie wody, więc w praktyce zmierzymy tylko temperaturę szkła lub wody. Podobnie mierząc temperaturę swojego pupila, zmierzysz temperaturę jego sierści.

Czy wszystkim obiektom da się zmierzyć temperaturę?

Niektóre materiały są trudne do zmierzenia temperatury - np. złoto czy bardzo lśniące metale. Złoto rozgrzane do temperatury 125°C, będzie odczytane jako ~25°C stopni, ponieważ będziemy mierzyć jedynie odbicie. Możemy zaradzić temu poprzez matowienie powierzchni obiektu lub naklejąjąc na nią zwykłą, czarną taśmę elektroizolacyjną.

Udpstępnij dalej!

http://www.jarzebski.pl/arduino/czujniki-i-sensory/pirometr-z-czujnikiem-mlx90614.html

Reklama

Komentarze Komentarze
Avatar 1
Radek Android 5.1 / Safari 537.36
29 grudzień 2015 - 00:00 Warszawa

Witam, zastanawiam się czy prezentowany we wpisie moduł porometru można by podłaczyć do smartfona przez microusb i oprogramować odczyt temperatury?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
22 styczeń 2016 - 23:28 Bytom

Bezpośrednio nie :) Ale projektując urządzenie już tak

Avatar 1
bogas Android 4.4 / Safari 537.36
12 styczeń 2016 - 10:12 Brak informacji

Witam.
Czy istnieje możliwość zmiany adresu w czujniku HTU21D?
Pozdrawiam, świetna strona.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
22 styczeń 2016 - 23:27 Bytom

Niestety nie wiem, nie miałem jeszcze styczności z tym czujnikiem

Avatar 1
Marhef Windows XP / Mozilla Firefox 43.0
18 styczeń 2016 - 08:12 Brak informacji

Artykuł ten pojawił się ostatnio na stronie majsterkowo.pl (w chwili obecnej w poczekalni), oczywiście bez podania autora. Czyli to plagiat. Proszę zainterweniować u właściciela tamtego bloga.
Pozdrawiam

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
22 styczeń 2016 - 23:27 Bytom

Nic takiego nie widziałem :)

Avatar 1
rs Windows / Safari 537.36
07 marzec 2016 - 16:52 Poznań

Czy możesz coś powiedzieć o wytrzymałości samego czujnika?
Załóżmy że jego "szkiełko" byłoby narażone na drobne uszkodzenia fizyczne, czy jest możliwość osłonięcia go jakimś materiałem?

Avatar 1
Misio Linux x86_64 / Safari 537.36
02 marzec 2017 - 22:04 Brak informacji

Tak, płytką z germanu (jest transparentny dla promieniowania podczerwonego)...

Avatar 2
chak Windows XP / Safari 537.36
14 kwiecień 2016 - 09:32 Brak informacji

Dzień dobry
Potrzebuję wsparcia w zbudowaniu urządzenia w oparciu o Arduino do pomiaru temperatur. Kilka zdalnych czujników do badania ciągłego w zakresie od kilkunastu stopni do 200. Dalej kilka czujników do ciągłej prezentacji temperatury w zakresie od kilkunastu do 100stopni. Prezentacja temperatur ma być przedstawiona na laptopie. Oddalenie od obiektów o kilkanaście do kilkudziesięciu metrów. Dokładność to kilka stopni. Budowałem już kilka urządzeń na Arduino, jak również sprowadzałem z Chin części, ale tym razem nie mam czasu. Chciałbym to komuś zlecić. Nie potrzebuję obudowy do urządzeń. Wszystko może być na rozlokowane w pobliżu laptopa, a czujniki oddalone na kablach. Ultradźwiękowy czujnik odległości na 30m skrętce komputerowej sprawował się bardzo dobrze. Rozumiem, że wszystkiego nie da się zrobić na jednym Arduino. Zależy mi też na ciągłym pomiarze pracy pewnego urządzenia, a sygnał chciałbym wziąść bocznika amperomierza - dwie sztuki. Tutaj wizualizacja musiałaby wyglądać na ekranie laptopa tak jak dwa duże zegary ciśnienia. Urządzenia muszą mieć łatwą możliwość montażu i demontażu. Pracuję na statku i ma mi to służyć pomocą przez 2, 3 miesiące, a potem chcę zabierać do domu. chak.

Avatar 1
piotrek Mac OS X / Safari 603.2.4
21 czerwiec 2017 - 13:17 Brak informacji

Wow, ale wyczerpujacy artykuł ! bomba.

Robiłem pomiar tym samym czujnikiem z adafruit, pomiar temp wody w kapilarze, niestety trzeba zblizyc czujnik na 1,5 mm do kapilary zeby pokazywal poprawnie temperature, jakakolwiek zmiana o 100um powoduje blad pomiaru nawet o stopien/dwa.
I to chyba wyklucza ten czujnik z precyzyjnych zastosowan. Ale moze sie myle..
Czy autor zna jakies inne sensowne metody pomiaru z zewnatrz (bez zamaczania czujnika w plynie) ?
kapilara ma 10 mm srednicy

Skomentuj wpis