ocrobot:modules:lm75
差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 前一修订版 | |||
| — | ocrobot:modules:lm75 [2025/10/11 02:55] (当前版本) – 外部编辑 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(); | ||
| + | } | ||
| + | |||
| + | </ | ||
