Высокоточный датчик температуры MCP9808 (Arduino)

ИМС 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);
}

Добавить комментарий

Войти с помощью: