Датчик TMP117 поддерживает интерфейс I2C и работает от напряжения 3.3 В, что совместимо с ESP32.
TMP117 | ESP32 | Примечание |
---|---|---|
VCC (3.3V) | 3.3V | Питание 3.3 В |
GND | GND | Общий земляной провод |
SDA | GPIO21 (по умолчанию) | Линия данных I2C |
SCL | GPIO22 (по умолчанию) | Линия тактирования I2C |
ALERT (опционально) | Любой GPIO | Прерывание при выходе за диапазон |
Код для чтения температуры с TMP117 на ESP32 (Arduino IDE)
#include <Wire.h> #define TMP117_ADDR 0x48 // Адрес по умолчанию (может быть 0x49, 0x4A, 0x4B в зависимости от настроек ADR0/ADR1) void setup() { Serial.begin(115200); Wire.begin(); // Инициализация I2C (SDA=21, SCL=22 по умолчанию) // Проверка наличия датчика Wire.beginTransmission(TMP117_ADDR); if (Wire.endTransmission() == 0) { Serial.println("TMP117 найден!"); } else { Serial.println("TMP117 не отвечает!"); while(1); } } void loop() { float temperature = readTMP117Temperature(); Serial.print("Температура: "); Serial.print(temperature); Serial.println(" °C"); delay(1000); } float readTMP117Temperature() { uint8_t data[2]; // Указываем регистр температуры (0x00) Wire.beginTransmission(TMP117_ADDR); Wire.write(0x00); Wire.endTransmission(); // Читаем 2 байта Wire.requestFrom(TMP117_ADDR, 2); if (Wire.available() == 2) { data[0] = Wire.read(); data[1] = Wire.read(); } // Преобразуем в температуру (1 LSB = 0.0078125 °C) int16_t rawTemp = (data[0] << 8) | data[1]; return rawTemp * 0.0078125; }
Примечания
-
Адрес I2C:
-
По умолчанию
0x48
, но может быть изменен перемычками (ADR0/ADR1). -
Возможные адреса:
0x48
,0x49
,0x4A
,0x4B
.
-
-
Подтяжка резисторов:
-
На шине I2C должны быть подтягивающие резисторы (~4.7 кОм) на линии SDA и SCL к 3.3 В.
-
-
Проверка подключения:
-
Если датчик не определяется, проверьте адрес с помощью I2C сканера.
-
Если вы имели в виду другой датчик (например, TMP102 или LM75), схема будет похожей, но адрес и регистры могут отличаться. Уточните модель, если нужно скорректировать ответ.
Если подтягивающие резисторы на линиях SDA и SCL будут 3.3 кОм (вместо классических 4.7 кОм), это тоже допустимо и даже может улучшить работу шины I2C на высоких скоростях.
Особенности использования резисторов 3.3 кОм
-
Более сильная подтяжка → быстрее нарастание фронта сигнала.
-
Подходит для более высоких скоростей I2C (например, 400 кГц и выше).
-
Уменьшает влияние паразитных емкостей на длинных проводах.
-
-
Больший ток потребления (но не критично):
-
При 3.3 В ток через резистор:
I=VR=3.3 В3300 Ом≈1 мАI=RV=3300Ом3.3В≈1мА -
Для ESP32 и TMP117 это безопасно.
-
-
ESP32 чувствителен к перегрузке линий → но 3.3 кОм не вызовет проблем.
Схема подключения (с резисторами 3.3 кОм)
ESP32 (3.3V) ────┬───────── VCC (TMP117) │ 3.3kΩ ← Подтяжка к 3.3 В │ ESP32 (GPIO21) ──┴───────── SDA (TMP117) ESP32 (3.3V) ────┬───────── (доп. питание, если нужно) │ 3.3kΩ ← Подтяжка к 3.3 В │ ESP32 (GPIO22) ──┴───────── SCL (TMP117) GND (ESP32) ────────────── GND (TMP117)
Проверка работы
-
Осциллографом:
-
Убедитесь, что нет "лесенки" на сигнале (слишком большая емкость).
-
Проверьте, что фронты сигналов четкие.
-
-
Логическим анализатором:
-
Если есть ошибки (NACK, зависания), попробуйте:
-
Уменьшить скорость I2C (например, до 100 кГц).
-
Увеличить резисторы до 4.7 кОм.
-
-
Вывод
Резисторы 3.3 кОм — отличный выбор для I2C с ESP32 и TMP117, особенно если:
-
Используются короткие провода (до 20–30 см).
-
Нужна высокая скорость (400 кГц и более).
Если же связь нестабильна, попробуйте:
-
Уменьшить скорость I2C (
Wire.setClock(100000)
). -
Добавить экранирование проводов.
-
Вернуться к 4.7 кОм.