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

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

TCN75A е цифров сензор за измерване на температура от – 40 до 125ºC. Сензорът е разпространен върху брейкаут борд на Microbot.it, който включва всички допълнителни компоненти, необходими за оптималната работа на сензора.

Комуникацията със сензора се ощестява по TWI шина, съвместима с протокола I2C. Това позволява по една линия да бъдат управлявани до 8 сензора. По подразбиране адреса на сензора е 1001000, като най-младшите 3 бита могат да се задават чрез джъмпери върху брейкаут борда.

Сензорът дава достъп до четири регистъра с адреси 00, 01, 10, 11.

  • За достъп до измерената температура се използва указател към адреса 00. Регистърът връща от 9 до 12 бита, в зависимост от зададената резолюция. За да се изчисли температурата в градуси, двоичното число, съставено от битовете се превръща в десетично и се разделя на 16.

  • На адрес 01 се намира регистърът за конфигуриране на сенозра. Чрез 5ти и 6ти бит се задава разделителната способност на АЦП-то т.е. резолюцията на измерване.

Всеки регистър се избира чрез указател към съответния му адрес. Веднъж посочен регистърът остава активен и няма нужда да бъде избиран отново.

Пример

В даденият пример микроконтролерът на Arduino комуникира със сензора посредством протокола I2C. Сензорът измерва температурата с резолюция 0.0625 и съхранява данните в регистъра за температурата. Микроконтролерът прочита данните от него, изчислява стойността и я извежда в Serial Monitor.

Vcc се свързва към 5V захранващо напрежение, а GND е към пин GND на Аrduino. SDA и SCL пиновете се свързват съответно към входовете А4 и А5.

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

/*

 Описание:
 * Осъществява комуникация с TCN75A по TWI шина
 * Задава резолюцията на измерване
 * Прочита данните за температурата и ги преобразува
   в градуси
 * Извежда информацията в Serial Monitor

 Свързване:
 * SDA -> А4 
 * SCL -> А5
 * Vcc -> 5V
 * GND -> GND

 * Tihomir Trifonov (08-2011)
 * email:tisho@inbox.oco

 * с подкрепата на Robotev.com

 */

#include <Wire.h> // библиотека за използване
                  // на протокола I2C

int reading = 0;       // съхранява данните от сензора
float temperature = 0; // съхранява изчислената температура

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

  Serial.begin(9600); // започва серийна комуникация с PC   
  Wire.begin();       // започва комуникация по TWI шината            

  ///// задава резолюция на измерването 
  Wire.beginTransmission(B1001000); // обръща се към сенозра 
  Wire.send(0x01);                  // посочва регистър 01
  Wire.send(0x60);                  // задава резолюция 0.0625
  Wire.endTransmission();           // прекъсва връзката 

  ///// избира регистъра за измерената температура  
  Wire.beginTransmission(B1001000); // обръща се към сензора 
  Wire.send(0x00);                  // посочва регистър 00
  Wire.endTransmission();           // прекъсва връзката
}

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

  ////// получава данни от регистъра за температура и ги обработва 
  Wire.requestFrom(B1001000, 2); // изисква 2 байта от сензора                                                                              
  reading = Wire.receive();      // записва първият получен байт 
                                 // в целочислена променлива и го
  reading = reading << 8;        // измества 8 позиции наляво  
  reading |= Wire.receive();     // записва следващия байт върху
                                 // освободените позиции и измества
  reading = reading >> 4;        // всички битове 4 позиции надясно

  ///// от получените данни изчислява температурата 
  temperature = (float)reading/16; // разделя на 16 получената след
                                   // манипулацията стойност      

  ///// извежда температурата в Serial Monitor-а    
  Serial.println(temperature,3); // всяка стойност е на нов ред
                                 // с 3 цифри след запетаята

  delay(500); // изчаква 500ms преди да повтори цикъла
}