В этом проекте мы соединим датчик температуры LM35 с платой ESP32 чтобы сделать цифровой термометр. Чтобы не задействовать дисплей для отображения значения температуры, как это пришлось бы делать, к примеру, при подключении датчика LM35 к плате Arduino, здесь мы воспользуемся возможностями ESP32 для создания веб-сервера. Ранее мы аналогичный проект рассматривали на основе модуля ESP8266. Также на нашем сайте мы рассматривали подключение датчика LM35 к микроконтроллеру AVR.
Веб-сервер представляет показания температуры непосредственно на веб-странице, доступ к которой возможен через любой стандартный веб-браузер. Такой подход не только модернизирует метод отображения, но и позволяет осуществлять удаленный мониторинг температуры по локальной сети.
Датчик температуры LM35 — это аналоговый датчик, выходной сигнал которого пропорционален температуре в градусах Цельсия. Он обеспечивает диапазон измерения температуры от -55°C до +150°C с точностью +/- 0,75°C. Этот широкий диапазон и высокая точность делают LM35 отличным выбором для различных приложений измерения температуры.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Датчик температуры LM35 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик температуры LM35
Серия LM35 — это точные датчики температуры с выходным напряжением, линейным по отношению к температуре по шкале Цельсия, что устраняет необходимость вычитания постоянного напряжения для масштабирования по шкале Цельсия в отличие от датчиков, откалиброванных по шкале Кельвина. Он достигает типичной точности ±0,25°C при комнатной температуре и ±0,75°C в диапазоне от -55°C до 150°C без внешней калибровки.
Его экономичность обеспечивается подгонкой и калибровкой на уровне пластины. Низкий выходной импеданс LM35, линейный выход и встроенная калибровка облегчают взаимодействие со схемой. Он работает от одного или двух источников питания, потребляя всего 60 мкА, что сводит самонагрев к минимуму до менее 0,1°C в неподвижном воздухе.
Особенности датчика
- Откалиброван непосредственно в градусах Цельсия.
- Линейный при масштабном коэффициенте 10,0 мВ/°C.
- Гарантированная точность 0,5°C (при 25°C).
- Рассчитан на полный диапазон температур от -55°C до 150°C.
- Подходит для удаленного применения.
- Низкая стоимость благодаря обрезке на уровне пластины.
- Работает от 4 до 30 вольт.
- Потребление тока менее 60 мА.
- Низкий самонагрев, 0,08°C всасывание воздуха
- Нелинейность всего 0,25°C.
- Низкоомный выход, 0,1 Ом для нагрузки 1 мА.
Принцип работы датчика температуры LM35
Датчик температуры LM35 работает на основе линейного масштабного коэффициента, определяемого как +10 милливольт (мВ) на градус Цельсия. Это означает, что при каждом увеличении выходного сигнала на 10 мВ с выходного контакта датчика (Vout) показания температуры увеличиваются на 1°C. Например, если датчик выдает 100 мВ на Vout, это соответствует температуре 10°C. Эта линейность справедлива и для отрицательных температур; выходной сигнал -100 мВ указывает на -10°C.
Функциональность датчика вытекает из его внутренней конструкции, включающей два транзистора со значительной разницей в площади эмиттера. Один транзистор имеет в десять раз большую площадь эмиттера, чем другой, что приводит к десятикратной разнице в плотности тока, учитывая, что через оба протекает один и тот же ток. Это несоответствие создает напряжение на резисторе R1, пропорциональное абсолютной температуре, что дает выходной сигнал, который почти линейный в рабочем диапазоне. Любые незначительные отклонения от линейности корректируются специальной схемой, которая регулирует слегка изогнутую зависимость напряжения от температуры.
Усилитель в схеме обеспечивает соответствие напряжения на базе одного транзистора (Q1) значению пропорциональной абсолютной температуре (PTAT) путем сравнения выходов двух транзисторов. Затем другой усилитель преобразует это напряжение PTAT, представляющее абсолютную температуру в градусах Кельвина, в показания в градусах Фаренгейта или Цельсия в зависимости от конкретной модели датчика (LM34 для Фаренгейта, LM35 для Цельсия).
Схема проекта
Схема подключения датчика температуры LM35 к модулю ESP32 представлена на следующем рисунке.
- Подключите VCC LM35 к 5 В (Vin) на ESP32.
- Подключите вывод GND LM35 к выводу GND на ESP32.
- Наконец, подключите Vout (выход) LM35 к одному из аналоговых входных контактов ESP32 (например, GPIO33 ).
Для выполнения соединений может пригодиться макетная плата, позволяющая использовать соединительные провода для легкого подключения LM35 к ESP32 без пайки.
Исходный код программы для считывания значений температуры с LM35
Давайте рассмотрим код для считывания показаний температуры с датчика температуры LM35 с использованием платы ESP32. ESP32 использует другой подход к аналоговому считыванию по сравнению с Arduino, учитывая его рабочее напряжение 3,3 В и возможность калибровки показаний АЦП для более точного измерения напряжения.
Для ESP32 расчет температуры немного адаптирован с учетом его характеристик:
Следующий код считывает данные о температуре с датчика LM35, подключенного к ESP32, и вычисляет температуру как в градусах Цельсия, так и в градусах Фаренгейта. Затем он выводит эти показания температуры на последовательный монитор каждую секунду, что позволяет осуществлять мониторинг выходных данных датчика в реальном времени.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include "esp_adc_cal.h" // Define the GPIO pin where the LM35 temperature sensor is connected #define LM35_SENSOR_PIN 33 // Function prototype for reading and calibrating the ADC value uint32_t readAndCalibrateADC(int rawADCValue); void setup() { // Initialize serial communication at 115200 baud to print the temperature readings Serial.begin(115200); } void loop() { // Variables to store raw ADC value, voltage in millivolts, and temperatures in Celsius and Fahrenheit int rawADCValue = 0; float voltageInMilliVolts = 0.0; float temperatureInCelsius = 0.0; float temperatureInFahrenheit = 0.0; // Read the raw ADC value from the LM35 sensor rawADCValue = analogRead(LM35_SENSOR_PIN); // Calibrate the raw ADC value and convert it to voltage in millivolts voltageInMilliVolts = readAndCalibrateADC(rawADCValue); // Calculate the temperature in Celsius. The LM35 outputs 10mV per degree Celsius. temperatureInCelsius = voltageInMilliVolts / 10; // Convert the temperature to Fahrenheit temperatureInFahrenheit = (temperatureInCelsius * 1.8) + 32; // Print the temperature readings in both Celsius and Fahrenheit Serial.print("Temperature = "); Serial.print(temperatureInCelsius); Serial.print(" °C, "); Serial.print("Temperature = "); Serial.print(temperatureInFahrenheit); Serial.println(" °F"); // Delay for a short period before reading the temperature again delay(1000); // Delay of 1 second } // Function to read and calibrate the raw ADC value to voltage in millivolts uint32_t readAndCalibrateADC(int rawADCValue) { // ADC calibration characteristics esp_adc_cal_characteristics_t adcCharacteristics; // Characterize the ADC at attenuation of 11dB and width of 12 bits esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adcCharacteristics); // Convert the raw ADC value to calibrated voltage in millivolts return esp_adc_cal_raw_to_voltage(rawADCValue, &adcCharacteristics); } |
Загрузите код на плату ESP32. Затем откройте Serial Monitor (окно монитора последовательной связи) после завершения загрузки.
Последовательный монитор покажет значение температуры как в градусах Цельсия, так и в градусах Фаренгейта.
Отображение показаний датчика температуры LM35 на веб-сервере ESP32
Вместо отображения показаний температуры на последовательном мониторе давайте создадим веб-страницу, на которую ESP32 каждую секунду отправляет показания температуры LM35. ESP32 подключается к сети Wi-Fi и размещает веб-сервер, доступный по его IP-адресу. Он отображает обновления температуры в реальном времени и предлагает конечную точку JSON («/readTemp») для получения последних показаний температуры.
Эта веб-страница предназначена для отображения показаний температуры как в градусах Цельсия, так и в градусах Фаренгейта. Стилизованная с помощью CSS для чистого и удобного интерфейса, она имеет адаптивный макет, который подстраивается под мобильные экраны. Веб-страница динамически обновляет данные о температуре каждую секунду с помощью JavaScript, без необходимости обновлять страницу вручную.
Основной .ino-файл
Откройте новый скетч в Arduino IDE и сохраните следующий код под любым именем.
В этих строках измените SSID и пароль Wi-Fi на свои.
1 2 3 |
// Replace these with your WiFi network settings const char* ssid = "*****************"; const char* password = "*****************"; |
Это единственное изменение, которое вам нужно сделать для этого скетча.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
#include <WiFi.h> #include <WebServer.h> #include "esp_adc_cal.h" #include "html.h" WebServer server(80); #define LM35_SENSOR_PIN 33 // Function prototype for reading and calibrating the ADC value uint32_t readAndCalibrateADC(int rawADCValue); // Variables to store raw ADC value, voltage in millivolts, and temperatures in Celsius and Fahrenheit int rawADCValue = 0; float voltageInMilliVolts = 0.0; float temperatureInCelsius = 0.0; float temperatureInFahrenheit = 0.0; // Replace these with your WiFi network settings const char* ssid = "*****************"; const char* password = "*****************"; void MainPage() { String _html_page = html_page; /*Read The HTML Page*/ server.send(200, "text/html", _html_page); /*Send the code to the web server*/ } void Temp() { // Prepare a JSON string that includes both Celsius and Fahrenheit temperatures String json = "{"; json += "\"celsius\": " + String(temperatureInCelsius, 2) + ","; json += "\"fahrenheit\": " + String(temperatureInFahrenheit, 2); json += "}"; server.send(200, "application/json", json); //Send updated temperature values to the web server } void setup(void) { Serial.begin(115200); /*Set the baudrate to 115200*/ WiFi.mode(WIFI_STA); /*Set the WiFi in STA Mode*/ WiFi.begin(ssid, password); Serial.print("Connecting to "); Serial.println(ssid); delay(1000); /*Wait for 1000mS*/ while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.print("."); } Serial.print("Connected to "); Serial.println(ssid); Serial.print("Your Local IP address is: "); Serial.println(WiFi.localIP()); /*Print the Local IP*/ server.on("/", MainPage); /*Display the Web/HTML Page*/ server.on("/readTemp", Temp); /*Display the updated Temperature and Humidity value*/ server.begin(); /*Start Server*/ delay(1000); /*Wait for 1000mS*/ } void loop(void) { // Read the raw ADC value from the LM35 sensor rawADCValue = analogRead(LM35_SENSOR_PIN); // Calibrate the raw ADC value and convert it to voltage in millivolts voltageInMilliVolts = readAndCalibrateADC(rawADCValue); // Calculate the temperature in Celsius. The LM35 outputs 10mV per degree Celsius. temperatureInCelsius = voltageInMilliVolts / 10; // Convert the temperature to Fahrenheit temperatureInFahrenheit = (temperatureInCelsius * 1.8) + 32; server.handleClient(); // Print the temperature readings in both Celsius and Fahrenheit Serial.print("Temperature = "); Serial.print(temperatureInCelsius); Serial.print(" °C, "); Serial.print("Temperature = "); Serial.print(temperatureInFahrenheit); Serial.println(" °F"); // Delay for a short period before reading the temperature again delay(1000); // Delay of 1 second } // Function to read and calibrate the raw ADC value to voltage in millivolts uint32_t readAndCalibrateADC(int rawADCValue) { // ADC calibration characteristics esp_adc_cal_characteristics_t adcCharacteristics; // Characterize the ADC at attenuation of 11dB and width of 12 bits esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adcCharacteristics); // Convert the raw ADC value to calibrated voltage in millivolts return esp_adc_cal_raw_to_voltage(rawADCValue, &adcCharacteristics); } |
Файл html.h
Откройте другой скетч и вставьте следующий HTML-код в редактор скетчей. Сохраните файл под именем «html.h» в той же папке, где находится основной ino- файл.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
const char html_page[] PROGMEM = R"rawString( <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Temperature Monitor</title> <style> body { margin: 0; padding: 20px; /* Add some padding around */ font-family: 'Arial', sans-serif; background-color: #e4f5fc; color: #555; display: block; /* Change from flex to block */ //background-image: linear-gradient(to bottom, #cfd9df 0%, #e2ebf0 100%); } .container { text-align: center; padding: 2em; background: white; border-radius: 10px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); max-width: 500px; margin: 20px auto; /* Adjust top margin, auto for horizontal centering */ } h1 { color: #0d47a1; font-weight: 300; margin-bottom: 0.3em; } .temperature { display: inline-block; background: #0d47a1; color: #fff; padding: 0.3em 1em; border-radius: 5px; margin: 0.5em 0; font-size: 1.5em; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } .temperature span { display: block; font-size: 3em; font-weight: bold; } .degree-symbol { font-size: 0.6em; vertical-align: super; } @media (max-width: 600px) { .container { padding: 1em; margin: 20px auto; /* Adjust for mobile */ } .temperature span { font-size: 2em; } } </style> </head> <body> <div class="container"> <h1>ESP32 LM35 Temperature</h1> <div class="temperature"> <span id="TempValueCelsius">--</span> <span class="degree-symbol">°C</span> </div> <div class="temperature"> <span id="TempValueFahrenheit">--</span> <span class="degree-symbol">°F</span> </div> </div> <script> setInterval(function() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var data = JSON.parse(this.responseText); document.getElementById("TempValueCelsius").innerHTML = data.celsius; document.getElementById("TempValueFahrenheit").innerHTML = data.fahrenheit; } }; xhttp.open("GET", "readTemp", true); xhttp.send(); }, 1000); // Refresh every 1 second </script> </body> </html> )rawString"; |
В менеджере плат выберите используемую вами плату ESP32. Затем выберите 'COM' порт. Наконец, вы можете нажать кнопку загрузки, чтобы загрузить код на плату.
После завершения загрузки кода откройте Serial Monitor (окно монитора последовательной связи). Вы увидите, как ESP32 подключается к сети Wi-Fi, используя учетные данные в коде. После подключения Serial Monitor покажет значение температуры в градусах Цельсия и Фаренгейта. Он также выведет IP-адрес ESP32.
Перейдите в веб-браузер и введите скопированный IP-адрес. После ввода IP-адреса ESP32 в веб-браузер и нажатия Enter вы будете перенаправлены на домашнюю страницу веб-сервера ESP32. Эта страница, как определено в HTML-коде в вашем скетче ESP32, будет отображать данные о температуре, полученные с датчика LM35.
Вы увидите показания температуры в реальном времени в градусах Цельсия и Фаренгейта, визуально представленные в удобном для пользователя формате. Температура на веб-странице будет обновляться с заданными интервалами, обеспечивая мониторинг температуры в реальном времени без необходимости вручную перезагружать страницу.
Те же показания можно увидеть и на мобильной панели управления.
Кроме того, для более интерактивных или управляемых данными приложений доступ к конечной точке «/readTemp» по тому же IP-адресу (например, http:// [ESP32_IP_Address] /readTemp) вернет последние показания температуры в формате JSON.
Эта функция может быть особенно полезна для интеграции данных о температуре в другие приложения или службы, которым требуются данные в реальном времени в программируемом формате.
30 просмотров