这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
zh:ocrobot:modules:lm75 [2015/01/13 02:49] – 程磊 | 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 | ||
+ | |||
+ | |||
+ | =====图片===== | ||
+ | ---------------------------- | ||
+ | {{: | ||
+ | =====示例代码===== | ||
+ | ---------------------- | ||
+ | <code cpp> | ||
+ | |||
+ | |||
+ | #include < | ||
+ | #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: | ||
+ | // Bit 0: Stromsparmodus, | ||
+ | // 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/ | ||
+ | // Bit 5-7 müssen 0 sein | ||
+ | // Byte: 7 6 5 4 3 2 1 0 | ||
+ | |||
+ | //char dataString[7]; | ||
+ | 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, | ||
+ | // dtostrf(temp, | ||
+ | Serial.print(" | ||
+ | Serial.println(temp); | ||
+ | | ||
+ | // LM75 Konfigurationsregister auslesen: Device | ||
+ | Serial.print(" | ||
+ | Serial.println(get_LM75_config(0), | ||
+ | | ||
+ | // LM75 Konfigurationsregister setzen: Device, Wert siehe oben | ||
+ | set_LM75_config(0, | ||
+ | | ||
+ | // LM75 Schaltwerte setzen: Device, Register, Wert als double | ||
+ | set_LM75_schaltwert(0, | ||
+ | set_LM75_schaltwert(0, | ||
+ | | ||
+ | // LM75 Schaltwerte auslesen: Device, Register | ||
+ | temp = get_LM75_temperature(0, | ||
+ | Serial.print(" | ||
+ | Serial.println(temp, | ||
+ | temp = get_LM75_temperature(0, | ||
+ | Serial.print(" | ||
+ | Serial.println(temp, | ||
+ | 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); | ||
+ | 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); | ||
+ | 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); | ||
+ | Wire.write(msb); | ||
+ | Wire.write(lsb); | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | |||
+ | </ | ||