用户工具

站点工具


ocrobot:modules:lm75

LM75温度监控模块

介绍


OCROBOT LM75温度监控模块,是一款较高精度的低功耗温度传感器模块,其特有的监控功能,可以将温度的上限及下限配置进传感器,传感器自动监测并提供报警功能,可以释放处理器的有限资源,并不需要处理器实时对温度进行监视。

参数


关键特性

  • I²C总线接口
  • 独立的漏极开路OS输出可作为中断或比较器/恒温器输入
  • 寄存器回读功能
  • 上电默认状态允许用作恒温器单机运行
  • 3.0V至5.5V电源电压
  • 低工作电源电流250µA (典型值)、1mA (最大值)
  • 4µA (典型值)关断模式大大降低了功耗
  • 同一总线上最多可连接8个LM75

图片


示例代码


 
#include <Wire.h>
#define SensorAdresse 0x4F // Basisadresse für ersten Temperatursensor
 
// Registerparameter fuer get_LM75_temperature
#define TEMP 0  // Temperaturregister anw?hlen
#define UNTEN 2 // Register für den unteren Schaltwert anw?hlen
#define OBEN 3  // Register für den oberen Schaltwert anw?hlen
 
// LM75 Configuration Register Registeradresse: 1
// Bit 0: Stromsparmodus, bei 1 geht Temperatursensor in den Stromsparmodus (keine Messung, aber aktive Steuerung) Ausgang wird auch abgeschaltet
//                        bei 0 geht Temperatursensor aus dem Stromsparmodus (Messung) Ausgang wird wieder freigegeben  
// Bit 1: Interrupt Modus, bei 1 schaltet der Ausgang sowohl bei oberen als auch unteren Schwellwert ein, wird zurückgesetzt durch Auslesen des Registers
//                         bei 0 schaltet der Ausgang bei oberen Schaltpunkt ein und bei unteren aus (default 80°C / 75°C)
// Bit 2: OS-Pin bei 1 wird das Verhalten des Ausgangs invertiert, Ausgang ist eingeschalten innerhalb der Schwellwerte
//               bei 0 Ausgang schaltet bei überschreiten der eingestellten Schwellwerte
// Bit 3 und 4: Wert 0-3, besagt wieviele Messzyklen abgewartet wird, bis Ausgang aktiv/inaktiv wird, wenn die Bedingung erfüllt ist (verhindert Flattern des Ausgangs)
// Bit 5-7 müssen 0 sein
// Byte: 7 6 5 4 3 2 1 0
 
//char dataString[7]; // gelesene Temperatur als String aufbereitet: (-xx)x.x
double temp; // gelesene Temperatur als double
 
void setup() { 
  Wire.begin();
  Serial.begin(9600);
  delay(1000);
} 
 
void loop()  
{  
// Temperatur aus LM75 auslesen
  temp = get_LM75_temperature(0, TEMP); //(Device)Wert vom 1. Temperatursensor lesen (0-7, je nach Jumperstellung am Board, 2. Parameter wie oben definiert)
 // dtostrf(temp, 4, 1, dataString); //dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf); (standard avr-libc function)
  Serial.print("Gemessene Temperatur: ");
  Serial.println(temp);
 
// LM75 Konfigurationsregister auslesen: Device
  Serial.print("Konfigurations-Register: "); 
  Serial.println(get_LM75_config(0), HEX);
 
// LM75 Konfigurationsregister setzen: Device, Wert siehe oben
  set_LM75_config(0, 0);
 
// LM75 Schaltwerte setzen: Device, Register, Wert als double 
  set_LM75_schaltwert(0, UNTEN, 16);     //解除警报温度下限
  set_LM75_schaltwert(0, OBEN, 20);     //报警温度上限
 
// LM75 Schaltwerte auslesen: Device, Register
  temp = get_LM75_temperature(0, UNTEN);
  Serial.print("UNTEN: "); 
  Serial.println(temp, 1);
  temp = get_LM75_temperature(0, OBEN);
  Serial.print("OBEN: "); 
  Serial.println(temp,1);
  delay(5000);
}
 
// LM75 Temperatur auslesen. Device = 0-7, regx = TEMP, OBEN, UNTEN (Registerauswahl)  
double get_LM75_temperature(int device, int regx) 
{
  int8_t msb;
  int8_t lsb;
  int8_t msb1;
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(regx);
  Wire.endTransmission();
  Wire.beginTransmission(SensorAdresse + device);
  Wire.requestFrom(SensorAdresse + device, 2);
  if (Wire.available()) {
     msb1 = Wire.read();
     msb = msb1 << 1; // Vorzeichenbit entfernen, verbliebener Wert ist nun doppelt so gro?
     lsb = Wire.read();
  }
  // h?chstes bit von lsb sagt aus, ob 0,5 Grad dazu addiert werden sollen
  lsb = (lsb & 0x80 ) >> 7; // nun ist lsb = 0 oder 1
  Wire.endTransmission();
  if (msb1 < 0x80) { // Positiver Wert?
    return double(msb + lsb)/2; // positiver Wert
  }  
  else {
    return double(msb + lsb)/2 - 128; // negativer Wert
  }  
}
 
// LM75 Konfigurationsregister setzen, Werte wie oben definiert
void set_LM75_config(int device, byte value) 
{
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(1); // Select Konfigurationsregister
  Wire.write(value);
  Wire.endTransmission();
}
 
// LM75 Konfigurationsregister auslesen, device = 0-7
byte get_LM75_config(int device) 
{
  byte reg;
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(1); // Select Konfigurationsregister
  Wire.endTransmission();
  Wire.requestFrom(SensorAdresse + device, 1);
  if (Wire.available()) { 
     reg = Wire.read();
  }
  Wire.endTransmission();
  return reg;
} 
 
// LM75 Schaltwerte setzen, device = 0-7, regx = Wert, Grad als double
void set_LM75_schaltwert(int device, byte regx, double grad) 
{
  int8_t msb;
  int8_t lsb = 0;
  uint8_t y = 0;
  boolean neg = false;
  if (grad < 0) {
    msb = abs(int(grad))+128;
  }
  else {  
    msb = abs(int(grad));
  }
  if (grad - abs(int(grad)) > 0) {
    lsb = 0x80;
  }
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(regx); // Selektiere oberes oder unteres Register
  Wire.write(msb);
  Wire.write(lsb);
  Wire.endTransmission();
}
ocrobot/modules/lm75.txt · 最后更改: 2023/06/07 04:23 由 127.0.0.1