Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Измерване на температура чрез Arduino и MLX90614

MLX90614ESF-BAA е инфрачервен сензор за безконтактно измерване на температура. Освен за измерване на стайна температура може да се използва и за засичане на обекти. Моделът -BAA работи на 3V, но издържа напрежение до 3.6V. Информация за измерената температура се връща чрез ШИМ или по I2C.

I2C комуникацията не поддържа някой от стандартните команди като например Sent Byte, Receive Byte, Write Byte и Read Byte. Наличната в Arduino библиотека Wire не може да осъществи комуникацията.

Когато сензорът е сам на шината, може да се открива на адрес 0x00. Адресът е от 7 бита и е последван от бит указващ операцията четене или запис. За достъп до регистъра със стайната температура се използва указател към адреса 0x06, който се намира в RAM паметта на сензора. В EEPROM паметта се намират регистри за настройка, които не е необходимо да се пипат. За получаване на данни от регистъра е необходимо повторно обръщение към адреса 0x00 с бит указващ четене.

Сензорът връща 16 бита с данни за температурата и 8 бита за проверка на данните. След всеки получен байт, микропроцесорът трябва да отговаря с ACK за да получи следващия. Първият получен байт е младшият, а вторият е старшият.

Температурата се изчислява като получената стойност се превърне в десетично число и се умножи по 0.02. За да се получи стойността по Целзий от нея се изважда 273.15. Например, ако първият получен байт има шестнадесетична стойност F7, а вторият 3A, десетичната стойност на 3AF7 е 15095. Като се умножи по 0.02 се получава температура 301,9 градуса по Келвин или 28.75 по Целзий.

Пример

Даденият по-долу код осъществява I2C комуникация със сенозра по линиите SCL и SDA. Микропроцесорът на Arduino превръща получените данни в температура по Целзий и я показва в Serial Monitor.

Сензорът се свързва към Arduino по следната схема:

Vdd и Vss пиновете на сензора се свързват съответно към 3.3V и GND, a SCL и SDA към А5 и А4. Двете съпротивления от по 4.7k се използват за PullUp на линиите SCL и SDA, а кондензаторът от 0.1 uF стабилизира захранващото напрежение.

За да се програмира Arduino с дадения по-долу код, трябва да се инсталира библиотека, написана от Peter Fleury. Файловете, които са необходими на Arduino могат да се изтеглят от тук. Библиотеката се разархивира в libraries от "arduino-00xx" директорията.

След като се инсталира библиотеката, кода който трябва да се зареди на Arduino е следният:

/*

 Описание:
 * Осъществява комуникация с MLX90614 по I2C шина
 * Изисква данни за стайната температура
 * Изчислява стойността и в градуси по Целзий и я извежда
   в Serial Monitor

 Свързване:
 * Vdd -> 3.3V
 * Vss -> GND
 * SCL -> A5 и към 3.3V през 4.7k PullUp
 * SDA -> A4 и към 3.3V през 4.7k PullUp  

 * Tihomir Trifonov (08-2011)
 * с подкрепата на Robotev.com

*/

#include <i2cmaster.h> // библиотека за комуникация по I2C

void setup(){ // начални инициализации

    Serial.begin(9600); // стартира серийна комуникации с PC
    i2c_init();         // инициализира шината за I2C комуникация
}

void loop(){ // програмен цикъл

  int dev = 0x00;    // адрес на сензора
  int data_low = 0;  // първият получен байт
  int data_high = 0; // вторият получен байт
  int pec = 0;       // контролен байт

  //// изисква данни от регистъра за температура
  i2c_start_wait(dev + I2C_WRITE); // започва комуникация 
                                   // със сензора и
  i2c_write(0x06);                 // изисква достъп до регистъра             
                                   // за стайната температура 

  //// прочита данните от сензора    
  i2c_rep_start(dev + I2C_READ); // обръща се отново към сензора  
  data_low = i2c_readAck();      // получава младшия байт
  data_high = i2c_readAck();     // получава старшия байт
  pec = i2c_readAck();           // получава контролния байт
  i2c_stop();                    // прекъсва комуникацията

  //// превръща данните в температура по Целзиий
  double tempData = 0x0000; // празна стойност за температурата
  tempData = (double)(((data_high & 0x007F) << 8) + data_low);
  tempData = (tempData * 0.02) - 0.01; // намира t по Келвин
  float celcius = tempData - 273.15;   // превръща я в t по Целзий

  //// извежда информацията в Serial Monitor
  Serial.print("temperature = ");
  Serial.print(celcius); 
  Serial.println("C ");

  delay(1000); // изчаква 1 секунда
}