Как работает встроенный датчик температуры в ESP32. ESP32 имеет встроенный датчик температуры, который измеряет температуру кремниевого кристалла процессора, а не окружающей среды. Это важное различие! В первую очередь он предназначен для контроля состояния самого процессора, но не среды вокруг него. Хотя субъективно само собой можно сделать заключение и о температуре вокруг. Особенно близкие показания будут сразу после запуска или после выхода из сна, когда температура кристалла действительно близка к температуре окружающей среды.

Технические особенности:

  1. Расположение: Датчик находится внутри самого чипа ESP32

  2. Точность: Примерно ±5°C - это оценочное значение для мониторинга перегрева

  3. Диапазон: Обычно от -40°C до 125°C (теоретически)

  4. Назначение: Предназначен для контроля теплового состояния процессора, а не для точных измерений температуры воздуха

Начнем с кода, который по сути запускает работу этого датчика и вычисляет значение температуры.

Прямой доступ к регистрам (Низкоуровневый)

// Объявление внешней функции для доступа к датчику
#ifdef __cplusplus
extern "C" {
#endif

/*
 * Функция temprature_sens_read() предоставляет доступ к датчику
 * через регистры процессора. Она возвращает сырое значение.
 */
uint8_t temprature_sens_read();


bbr class="token macro property"br class="token macro property"#ifdef __cplusplus } #endif void setup() { Serial.begin(115200); Serial.println("ESP32 CPU Temperature - Вариант 2"); } void loop() { // Чтение сырого значения температуры (в градусах Фаренгейта) uint8_t raw_temp = temprature_sens_read(); /* * Преобразование в градусы Цельсия: * 1. Вычитаем 32 (точка замерзания по Фаренгейту) * 2. Делим на 1.8 (соотношение шкал) * * Примечание: Датчик изначально калиброван в Фаренгейтах */ float temperature_c = (raw_temp - 32) / 1.8; Serial.print("Сырое значение: "); Serial.print(raw_temp); Serial.print("F -> "); Serial.print(temperature_c); Serial.println(" °C"); delay(2000); }

Особенности работы датчика

Физические ограничения:

  1. Самонагрев: При активной работе WiFi/Bluetooth температура кристалла повышается на 10-20°C

  2. Инерционность: Датчик реагирует на изменения температуры с задержкой

  3. Влияние питания: Напряжение питания может влиять на показания

Пример реальных показаний:

  • В режиме простоя: 35-45°C

  • При активной работе WiFi: 45-65°C

  • При перегрузке процессора: до 85°C

  • Критический уровень: выше 85°C (может привести к троттлингу (самоотключение по температуре))

...и еще один код, где ESP32 создаёт свою точку доступа (WiFi-сеть) и веб-сервер для отображения температуры процессора через прямое чтение регистров:

/*
 * ESP32 как точка доступа с веб-сервером температуры процессора
 * Низкоуровневый доступ к датчику через temprature_sens_read()
 */

// Низкоуровневый доступ к датчику температуры
#ifdef __cplusplus
extern "C" {
#endif
uint8_t temprature_sens_read(); // Встроенная функция ESP32
#ifdef __cplusplus
}
#endif

#include <WiFi.h>
#include <WebServer.h>

// Настройки точки доступа ESP32
const char* ap_ssid = "ESP32-Temperature";  // Имя вашей точки доступа
const char* ap_password = "12345678";       // Пароль (минимум 8 символов)

// Создаем веб-сервер на порту 80
WebServer server(80);

float cpuTempC = 0.0;   // Температура в Цельсиях
float cpuTempF = 0.0;   // Температура в Фаренгейтах

// Функция чтения температуры процессора
float readCPUTemperature() {
  uint8_t rawTemp = temprature_sens_read();  // Чтение из регистра датчика
  return (rawTemp - 32) / 1.8;               // Конвертация в °C
}

// Главная страница веб-сервера
void handleRoot() {
  // Обновляем показания температуры
  cpuTempC = readCPUTemperature();
  cpuTempF = (cpuTempC * 9.0 / 5.0) + 32.0;

  // Генерируем HTML страницу
  String html = "<!DOCTYPE html>";
  html += "<html lang='ru'>";
  html += "<head>";
  html += "<meta charset='UTF-8'>";
  html += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
  html += "<title>Температура ESP32</title>";
  
  // CSS стили
  html += "<style>";
  html += "body { font-family: Arial, sans-serif; text-align: center; padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; }";
  html += ".container { max-width: 600px; margin: 0 auto; background: rgba(255,255,255,0.1); border-radius: 20px; padding: 30px; backdrop-filter: blur(10px); }";
  html += "h1 { margin-bottom: 30px; }";
  html += ".temp-box { background: rgba(255,255,255,0.2); border-radius: 15px; padding: 20px; margin: 20px 0; }";
  html += ".temp-value { font-size: 3em; font-weight: bold; margin: 10px 0; }";
  html += ".temp-unit { font-size: 0.5em; opacity: 0.8; }";
  html += ".btn { background: #4CAF50; color: white; border: none; padding: 12px 24px; border-radius: 8px; font-size: 16px; cursor: pointer; margin: 10px; transition: all 0.3s; }";
  html += ".btn:hover { background: #45a049; transform: scale(1.05); }";
  html += ".info { margin-top: 30px; font-size: 0.9em; opacity: 0.8; }";
  html += "</style>";
  
  // JavaScript для автообновления
  html += "<script>";
  html += "let autoRefresh = true;";
  html += "function refreshData() { location.reload(); }";
  html += "function toggleAutoRefresh() {";
  html += "  autoRefresh = !autoRefresh;";
  html += "  document.getElementById('toggleBtn').textContent = autoRefresh ? 'Отключить автообновление' : 'Включить автообновление';";
  html += "}";
  html += "setInterval(() => { if(autoRefresh) refreshData(); }, 5000);"; // Обновление каждые 5 сек
  html += "</script>";
  
  html += "</head>";
  html += "<body>";
  html += "<div class='container'>";
  
  // Заголовок
  html += "<h1>🌡️ Температура процессора ESP32</h1>";
  
  // Отображение температуры
  html += "<div class='temp-box'>";
  html += "<h2>Текущая температура</h2>";
  html += "<div class='temp-value'>";
  html += String(cpuTempC, 1); // Один знак после запятой
  html += "<span class='temp-unit'>°C</span>";
  html += "</div>";
  html += "<div style='font-size: 1.5em;'>";
  html += String(cpuTempF, 1) + " °F";
  html += "</div>";
  html += "</div>";
  
  // Кнопки управления
  html += "<button class='btn' onclick='refreshData()'>🔄 Обновить сейчас</button>";
  html += "<button class='btn' id='toggleBtn' onclick='toggleAutoRefresh()'>Отключить автообновление</button>";
  
  // Информационный блок
  html += "<div class='info'>";
  html += "<p><strong>IP адрес:</strong> " + WiFi.softAPIP().toString() + "</p>";
  html += "<p><strong>Точка доступа:</strong> " + String(ap_ssid) + "</p>";
  html += "<p><strong>Метод измерения:</strong> прямое чтение регистров процессора</p>";
  html += "<p><strong>Точность:</strong> ±5°C (показывает температуру кристалла)</p>";
  html += "<p>📱 Подключитесь к WiFi сети <strong>" + String(ap_ssid) + "</strong><br>";
  html += "и перейдите по адресу: <strong>http://" + WiFi.softAPIP().toString() + "</strong></p>";
  html += "</div>";
  
  html += "</div>"; // Закрываем container
  html += "</body>";
  html += "</html>";
  
  server.send(200, "text/html", html);
}

// API для получения данных в JSON формате
void handleAPI() {
  cpuTempC = readCPUTemperature();
  cpuTempF = (cpuTempC * 9.0 / 5.0) + 32.0;
  
  String json = "{";
  json += "\"temperature_c\":" + String(cpuTempC, 2) + ",";
  json += "\"temperature_f\":" + String(cpuTempF, 2) + ",";
  json += "\"unit_c\":\"°C\",";
  json += "\"unit_f\":\"°F\",";
  json += "\"timestamp\":\"" + String(millis()) + "\"";
  json += "}";
  
  server.send(200, "application/json", json);
}

// Страница 404 для несуществующих адресов
void handleNotFound() {
  String message = "404: Страница не найдена\n\n";
  message += "Доступные адреса:\n";
  message += "/ - Главная страница с температурой\n";
  message += "/api - Данные в JSON формате\n";
  
  server.send(404, "text/plain", message);
}

void setup() {
  // Настраиваем Serial для отладки
  Serial.begin(115200);
  delay(1000);
  
  Serial.println("\n\n========================================");
  Serial.println("      ESP32 Точка доступа + Веб-сервер");
  Serial.println("========================================");
  
  // Запускаем точку доступа
  Serial.print("Создание точки доступа: ");
  Serial.println(ap_ssid);
  
  WiFi.softAP(ap_ssid, ap_password);
  
  // Получаем IP адрес точки доступа
  IPAddress apIP = WiFi.softAPIP();
  
  Serial.print("✅ Точка доступа создана! IP: ");
  Serial.println(apIP);
  Serial.print("SSID: ");
  Serial.println(ap_ssid);
  Serial.print("Пароль: ");
  Serial.println(ap_password);
  Serial.println("========================================");
  
  // Настраиваем маршруты веб-сервера
  server.on("/", handleRoot);      // Главная страница
  server.on("/api", handleAPI);    // API JSON
  server.onNotFound(handleNotFound); // Обработка 404
  
  // Запускаем веб-сервер
  server.begin();
  Serial.println("✅ HTTP сервер запущен");
  Serial.println("========================================");
  Serial.println("\n📱 ИНСТРУКЦИЯ:");
  Serial.println("1. Подключитесь к WiFi сети: " + String(ap_ssid));
  Serial.println("2. Пароль: " + String(ap_password));
  Serial.println("3. Откройте браузер и перейдите по адресу:");
  Serial.println("   http://" + apIP.toString());
  Serial.println("========================================\n");
}

void loop() {
  // Обрабатываем клиентские запросы
  server.handleClient();
  
  // Выводим температуру в Serial каждые 5 секунд
  static unsigned long lastUpdate = 0;
  if (millis() - lastUpdate > 5000) {
    cpuTempC = readCPUTemperature();
    Serial.print("Температура процессора: ");
    Serial.print(cpuTempC);
    Serial.print(" °C, ");
    Serial.print((cpuTempC * 9.0 / 5.0) + 32.0);
    Serial.println(" °F");
    lastUpdate = millis();
  }
  
  delay(10);
}

📱 Как использовать:

  1. Загрузите код на ESP32 через Arduino IDE или PlatformIO

  2. Откройте Serial Monitor (115200 бод)

  3. Найдите WiFi сеть с названием ESP32-Temperature

  4. Подключитесь к ней (пароль: 12345678)

  5. Откройте браузер и перейдите по адресу http://192.168.4.1

🔧 Что делает этот код:

 
Функция Описание
WiFi.softAP() Созёт точку доступа ESP32
temprature_sens_read() Низкоуровневое чтение температуры из регистров
WebServer server(80) Веб-сервер на стандартном порту HTTP
Автообновление Страница обновляется каждые 5 секунд
JSON API /api возвращает данные в JSON формате

⚙️ Кастомизация:

// Измените параметры точки доступа:
const char* ap_ssid = "Моя_ESP32";      // Любое имя
const char* ap_password = "мой_пароль"; // Минимум 8 символов

// Измените интервал автообновления (мс):
setInterval(() => { ... }, 10000); // Вместо 5000 на 10000 для 10 секунд

📊 Особенности низкоуровневого метода:

// Как работает temprature_sens_read():
// 1. Читает сырое значение из внутреннего регистра датчика
// 2. Возвращает температуру в градусах Фаренгейта
// 3. Требует преобразования: (°F - 32) / 1.8 = °C
uint8_t raw = temprature_sens_read(); // Пример: 145°F
float celsius = (raw - 32) / 1.8;     // ≈ 62.8°C

🔍 Диагностика проблем:

Если страница не открывается:

  1. Проверьте Serial Monitor - там должен быть IP адрес

  2. Убедитесь, что подключились к правильной WiFi сети

  3. Попробуйте другой браузер или очистите кэш

  4. Отключите брандмауэр на время тестирования

📱 Для мобильных устройств:

Код создаёт адаптивную страницу, которая хорошо отображается на:

  • 📱 Смартфонах (Android/iOS)

  • 💻 Планшетах

  • 🖥️ Компьютерах

Это самодостаточное решение - ESP32 не зависит от внешней WiFi сети, всегда доступен как точка доступа и показывает температуру своего процессора через веб-интерфейс.