
Интернет-магазин «Неглупый Дом»
LM75 — один из самых старых и простых цифровых датчиков температуры с интерфейсом I2C, а модуль реле в этом проекте превращает показания датчика в реальное управление вентилятором или нагревателем с гистерезисом, чтобы реле не "дребезжало" включениями-выключениями около порога.
LM75 хранит результат последнего измерения температуры в собственном 16-битном регистре, который Arduino читает по I2C без какой-либо формулы пересчёта под конкретный экземпляр датчика (в отличие от аналоговых терморезисторов). Значащими являются 9 старших бит этого регистра, а младшие 7 бит — служебные, поэтому прочитанное 16-битное число сдвигают вправо на 5 бит и умножают на 0.125°C — это и есть шаг одного деления датчика. Адрес датчика на шине I2C по умолчанию 0x48 (при условии, что все адресные выводы A0-A2 модуля посажены на GND, как обычно сделано на готовых платах).
Гистерезис — это разница между температурой включения и температурой выключения нагрузки. Без него, если держать всего одно пороговое значение, реле начало бы щёлкать десятки раз в минуту, когда температура колеблется в районе порога на доли градуса — обычная механическая усталость контактов реле от такой частоты переключений. Поэтому в коде ниже заведены два значения: порог включения и порог выключения, отличающиеся на пару градусов.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <Wire.h>
const int LM75_ADDR = 0x48; // стандартный адрес при A0-A2 на GND
const int RELAY_PIN = 2;
const float TEMP_ON = 28.0; // включаем нагрузку (например, вентилятор) при превышении этой температуры
const float TEMP_OFF = 26.0; // выключаем только после остывания ниже этой — гистерезис 2 градуса
bool relayOn = false;
float readLM75() {
Wire.beginTransmission(LM75_ADDR);
Wire.write(0x00); // регистр температуры
Wire.endTransmission();
Wire.requestFrom(LM75_ADDR, 2);
int16_t raw = (Wire.read() << 8) | Wire.read();
raw = raw >> 5; // значащие 9 бит
return raw * 0.125; // шаг датчика 0.125°C
}
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
}
void loop() {
float temp = readLM75();
Serial.print("Температура: ");
Serial.println(temp);
if (!relayOn && temp >= TEMP_ON) {
relayOn = true;
digitalWrite(RELAY_PIN, HIGH);
Serial.println("Реле включено");
} else if (relayOn && temp <= TEMP_OFF) {
relayOn = false;
digitalWrite(RELAY_PIN, LOW);
Serial.println("Реле выключено");
}
delay(1000);
}
Никаких дополнительных библиотек не требуется — только стандартный `Wire.h`. Если датчик не отвечает — проверьте его реальный адрес отдельным скетчем-сканером шины I2C, он не всегда 0x48, если на плате разведены и подняты адресные перемычки A0-A2.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 207 ₽ 186 ₽ (экономия 21 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.