ИМС MCP9808 представляет собой высокоточный датчик температуры с интерфейсом I2C, диапазон измерения датчика от -40°C до 125°C, погрешность измерения не превышает ±0.25°C.
Характеристики
- Напряжение питания: 2.7-5.5 В;
- Ток потребления: 200 мкА;
- Пределы измерения температуры: от -20 до +100 °C;
- Точность измерения температуры: до ±0.25°C;
- Выход: I2C 400 кГц, выбор адреса по входам A0-A2;
- Разрешение выхода: 0.5, 0.25, 0.125 или 0.0625 °C/бит (9, 10, 11, 12 бит);
Ниже показано тестовое включение датчика температуры выполненного в виде модуля. Адрес MCP9808 можно изменить при помощи пинов A0, A1, A2 подавая на них логическую единицу. По умолчанию пины A0, A1, A2 притянуты к массе. Одновременно можно подключить к одной шине I2C до 8-и MCP9808.
0 0 0 = 0x18
0 0 1 = 0x19
0 1 0 = 0x1A
0 1 1 = 0x1B
1 0 0 = 0x1C
1 0 1 = 0x1D
1 1 0 = 0x1E
1 1 1 = 0x1F
Дополнительно модуль имеет выход ALERT (с открытым стоком) который меняет свое логическое состояние если температура выходит за пределы запрограммированной температуры (эта функция не используется в скетче примера).
Подключение датчика к Arduino достаточно простое, помимо питания необходимо соединить линии SDA и SCL модуля с платой Arduino (SDA = A4, SCL = A5).
#include<Wire.h> // A2 A1 A0 address // 0 0 0 0x18 default address // 0 0 1 0x19 // 0 1 0 0x1A // 0 1 1 0x1B // 1 0 0 0x1C // 1 0 1 0x1D // 1 1 0 0x1E // 1 1 1 0x1F #define Addr 0x18 void setup(){ Wire.begin(); Serial.begin(9600); Wire.beginTransmission(Addr); Wire.write(0x01); Wire.write(0x00); Wire.write(0x00); Wire.endTransmission(); Wire.beginTransmission(Addr); Wire.write(0x08); Wire.write(0x03); // +0.0625°C Wire.endTransmission(); } void loop(){ byte data[2]; Wire.beginTransmission(Addr); Wire.write(0x05); Wire.endTransmission(); Wire.requestFrom(Addr, 2); if(Wire.available() == 2){ data[0] = Wire.read(); data[1] = Wire.read(); } int temp = ((data[0] & 0x1F)*256 + data[1]); if(temp > 4095){temp -= 8192;} float cTemp = temp * 0.0625; Serial.print("T = ");Serial.print(cTemp);Serial.println(" C"); delay(1000); }
Ниже показан пример применения датчика температуры MCP9808, информация о температуре будет выводится на дисплей 0.54″ 14-segment LED на базе драйвера HT16K33 (ссылка на описание дисплея — http://rcl-radio.ru/?p=108647).
Дисплей 0.54″ 14-segment LED HT16K33 Backpact представляет собой четырех разрядный 14 сегментный (15 сегмент — запятая на каждом разряде) индикатор которым управляет светодиодный драйвер HT16K33.
Для управления дисплеем используется библиотека 4x14LED.zip , которая рассчитана для работы в среде Arduino IDE и поддерживает платы Arduino Nano и UNO. Библиотека содержит несколько функций, которые позволяют выводить цифры и символы, управлять запятыми.
#include<Wire.h> // A2 A1 A0 address // 0 0 0 0x18 default address // 0 0 1 0x19 // 0 1 0 0x1A // 0 1 1 0x1B // 1 0 0 0x1C // 1 0 1 0x1D // 1 1 0 0x1E // 1 1 1 0x1F #define Addr 0x18 #include <4x14LED.h> // http://rcl-radio.ru/wp-content/uploads/2021/09/4x14LED.zip HT4x14LED led; void setup(){ Wire.begin(); Serial.begin(9600); led.init(1); led.brig(1); led.blink(1); led.clear(); Wire.beginTransmission(Addr); Wire.write(0x01); Wire.write(0x00); Wire.write(0x00); Wire.endTransmission(); Wire.beginTransmission(Addr); Wire.write(0x08); Wire.write(0x03); // +0.0625°C Wire.endTransmission(); } void loop(){ byte data[2]; Wire.beginTransmission(Addr); Wire.write(0x05); Wire.endTransmission(); Wire.requestFrom(Addr, 2); if(Wire.available() == 2){ data[0] = Wire.read(); data[1] = Wire.read(); } int temp = ((data[0] & 0x1F)*256 + data[1]); if(temp > 4095){temp -= 8192;} float cTemp = temp * 0.0625; Serial.print("T = ");Serial.print(cTemp);Serial.println(" C"); led.print(cTemp*10, 3, 0x1201, -1,-1,-1); delay(1000); }