Как работает встроенный датчик температуры в ESP32. ESP32 имеет встроенный датчик температуры, который измеряет температуру кремниевого кристалла процессора, а не окружающей среды. Это важное различие! В первую очередь он предназначен для контроля состояния самого процессора, но не среды вокруг него. Хотя субъективно само собой можно сделать заключение и о температуре вокруг. Особенно близкие показания будут сразу после запуска или после выхода из сна, когда температура кристалла действительно близка к температуре окружающей среды.
Технические особенности:
-
Расположение: Датчик находится внутри самого чипа ESP32
-
Точность: Примерно ±5°C - это оценочное значение для мониторинга перегрева
-
Диапазон: Обычно от -40°C до 125°C (теоретически)
-
Назначение: Предназначен для контроля теплового состояния процессора, а не для точных измерений температуры воздуха
Начнем с кода, который по сути запускает работу этого датчика и вычисляет значение температуры.
Прямой доступ к регистрам (Низкоуровневый)
// Объявление внешней функции для доступа к датчику #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); }
Особенности работы датчика
Физические ограничения:
-
Самонагрев: При активной работе WiFi/Bluetooth температура кристалла повышается на 10-20°C
-
Инерционность: Датчик реагирует на изменения температуры с задержкой
-
Влияние питания: Напряжение питания может влиять на показания
Пример реальных показаний:
-
В режиме простоя: 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); }
📱 Как использовать:
-
Загрузите код на ESP32 через Arduino IDE или PlatformIO
-
Откройте Serial Monitor (115200 бод)
-
Найдите WiFi сеть с названием
ESP32-Temperature -
Подключитесь к ней (пароль:
12345678) -
Откройте браузер и перейдите по адресу
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
🔍 Диагностика проблем:
Если страница не открывается:
-
Проверьте Serial Monitor - там должен быть IP адрес
-
Убедитесь, что подключились к правильной WiFi сети
-
Попробуйте другой браузер или очистите кэш
-
Отключите брандмауэр на время тестирования
📱 Для мобильных устройств:
Код создаёт адаптивную страницу, которая хорошо отображается на:
-
📱 Смартфонах (Android/iOS)
-
💻 Планшетах
-
🖥️ Компьютерах
Это самодостаточное решение - ESP32 не зависит от внешней WiFi сети, всегда доступен как точка доступа и показывает температуру своего процессора через веб-интерфейс.