TCN75A е цифров сензор за измерване на температура от – 40 до 125ºC. Сензорът е разпространен върху брейкаут борд на Microbot.it, който включва всички допълнителни компоненти, необходими за оптималната работа на сензора.
Комуникацията със сензора се ощестява по TWI шина, съвместима с протокола I2C. Това позволява по една линия да бъдат управлявани до 8 сензора. По подразбиране адреса на сензора е 1001000, като най-младшите 3 бита могат да се задават чрез джъмпери върху брейкаут борда.
Сензорът дава достъп до четири регистъра с адреси 00, 01, 10, 11.
Всеки регистър се избира чрез указател към съответния му адрес. Веднъж посочен регистърът остава активен и няма нужда да бъде избиран отново.
Пример
В даденият пример микроконтролерът на 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 преди да повтори цикъла }