用户工具

站点工具


ocrobot:modules:lm75

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
ocrobot:modules:lm75 [2017/10/04 08:44] 弘毅ocrobot:modules:lm75 [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1
行 1: 行 1:
 +====== LM75温度监控模块 ======
 +
 +
 +===== 介绍 =====
 +------------------------------
 +OCROBOT LM75温度监控模块,是一款较高精度的低功耗温度传感器模块,其特有的监控功能,可以将温度的上限及下限配置进传感器,传感器自动监测并提供报警功能,可以释放处理器的有限资源,并不需要处理器实时对温度进行监视。
 +
 +===== 参数 =====
 +-------------
 +**关键特性**
 +  * I²C总线接口
 +  * 独立的漏极开路OS输出可作为中断或比较器/恒温器输入
 +  * 寄存器回读功能
 +  * 上电默认状态允许用作恒温器单机运行
 +  * 3.0V至5.5V电源电压
 +  * 低工作电源电流250µA (典型值)、1mA (最大值)
 +  * 4µA (典型值)关断模式大大降低了功耗
 +  * 同一总线上最多可连接8个LM75
 +
 +
 +=====图片=====
 +----------------------------
 +{{:ocrobot:modules:lm75:lm75.jpg?nolink&500|}}
 +=====示例代码=====
 +----------------------
 +<code cpp>
 +
 +
 +#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();
 +}
 +
 +</code>