Руководство по датчикам температуры LM35, LM335 и LM34 с Arduino
В этом руководстве показано, как использовать датчики температуры LM35 (LM35DZ), LM335 и LM34 с платой Arduino. Мы покажем, как подключить датчики и написать код для получения показаний температуры. В завершение мы создадим пример проекта для отображения показаний датчика на OLED-дисплее.
Знакомство с датчиками температуры LM35, LM335 и LM34
LM35, LM335 и LM34 — это линейные датчики температуры, которые выдают напряжение, пропорциональное значению температуры.
Датчик температуры |
Выходное напряжение |
Линейность |
|---|---|---|
LM35 (LM35DZ) |
пропорционально температуре в Цельсиях (°C) |
10 мВ/°C |
LM335 |
пропорционально температуре в Кельвинах (°K) |
10 мВ/°K |
LM34 |
пропорционально температуре в Фаренгейтах (°F) |
10 мВ/°F |
Эти датчики работают аналогичным образом, но откалиброваны по-разному для выдачи напряжения, пропорционального различным единицам измерения температуры.
LM35 выдаёт 10 мВ на каждый градус Цельсия повышения температуры. Аналогичным образом LM335 выдаёт 10 мВ на каждый градус Кельвина повышения температуры, а LM34 выдаёт 10 мВ на каждый градус Фаренгейта повышения температуры.
Например, если LM35 выдаёт напряжение 345 мВ, это означает, что значение температуры составляет 34,5 °C.
Для получения дополнительной информации об этих датчиках вы можете обратиться к их техническим описаниям (datasheet):
Где купить?
Вы можете перейти на Maker Advisor, чтобы найти лучшую цену на датчики температуры в различных магазинах:
Распиновка LM35 (LM35DZ)
LM35 имеет всего три вывода: VCC, Vout и GND.
Ниже приведены соединения, которые необходимо выполнить между LM35 и Arduino:
LM35 / LM34 |
Arduino |
|---|---|
VCC |
5V |
Vout |
Любой аналоговый пин |
GND |
GND |
Примечание: если вы используете датчик температуры LM34, его распиновка совпадает с распиновкой LM35.
Распиновка LM335
Распиновка датчика температуры LM335 немного отличается.
LM335 |
Arduino |
|---|---|
Adj |
Не подключать |
Vout |
Любой аналоговый пин (подтянуть резистором 2 кОм) |
GND |
GND |
Вывод Adj можно использовать для калибровки датчика и получения более точных показаний температуры. В этом руководстве мы не будем использовать этот вывод, поэтому он должен оставаться неподключённым.
Схема подключения
Следуйте одной и той же схеме подключения, если вы используете датчик температуры LM35 или LM34. Если вы используете LM335, следуйте немного другой схеме.
LM35 и LM34 с Arduino
LM335 с Arduino
Код — Чтение температуры
Следующий код считывает температуру с датчика LM35 и отображает показания в мониторе порта (Serial Monitor). Этот код также совместим с LM335 и LM34 — вам просто нужно раскомментировать некоторые строки в коде, чтобы использовать нужный датчик.
/*
* Rui Santos
* Complete Project Details https://RandomNerdTutorials.com
*/
const int sensorPin = A0;
float sensorValue;
float voltageOut;
float temperatureC;
float temperatureF;
// uncomment if using LM335
//float temperatureK;
void setup() {
pinMode(sensorPin, INPUT);
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(sensorPin);
voltageOut = (sensorValue * 5000) / 1024;
// calculate temperature for LM35 (LM35DZ)
temperatureC = voltageOut / 10;
temperatureF = (temperatureC * 1.8) + 32;
// calculate temperature for LM335
//temperatureK = voltageOut / 10;
//temperatureC = temperatureK - 273;
//temperatureF = (temperatureC * 1.8) + 32;
// calculate temperature for LM34
//temperatureF = voltageOut / 10;
//temperatureC = (temperatureF - 32.0)*(5.0/9.0);
Serial.print("Temperature(ºC): ");
Serial.print(temperatureC);
Serial.print(" Temperature(ºF): ");
Serial.print(temperatureF);
Serial.print(" Voltage(mV): ");
Serial.println(voltageOut);
delay(1000);
}
Как работает код
Вы начинаете с определения пина, к которому подключён выход датчика. Это должен быть аналоговый пин. Мы используем пин A0, но вы можете использовать любой другой аналоговый пин.
const int sensorPin = A0;
Определите переменную, которая будет хранить аналоговое значение, считанное с датчика:
float sensorValue;
Переменная voltageOut будет хранить фактическое значение выходного напряжения, поступающего от датчика.
float voltageOut;
Затем создайте переменные, которые будут хранить значение температуры. Здесь мы создаём переменные temperatureC и temperatureF для хранения температуры в градусах Цельсия и Фаренгейта соответственно.
float temperatureC;
float temperatureF;
Если вы используете датчик LM335, вам также потребуется переменная для хранения температуры в Кельвинах. Поэтому, если вы используете этот датчик, вам нужно раскомментировать следующую строку:
//float temperatureK;
В setup() объявите sensorPin как вход:
pinMode(sensorPin, INPUT);
Инициализируйте последовательное соединение (Serial) со скоростью 9600 бод. Вам нужно инициализировать последовательное соединение, чтобы отображать показания в мониторе порта (Serial Monitor):
Serial.begin(9600);
В loop() считайте значение, поступающее от датчика, и сохраните его в переменной voltageOut. Для чтения аналогового значения с Arduino достаточно использовать функцию analogRead() и передать в качестве аргумента пин, который вы хотите считать.
voltageOut = analogRead(sensorPin);
Как упоминалось ранее, эти датчики выдают значение напряжения, пропорциональное температуре.
Аналоговые значения, считываемые Arduino, могут иметь значение от 0 до 1024, где 0 соответствует 0 В, а 1024 — 5 В. Таким образом, мы можем легко получить выходное напряжение датчика в мВ.
voltageOut = (sensorValue * 5000) / 1024
В случае датчика LM35 мы видели, что 10 мВ соответствует повышению температуры на один градус Цельсия. Таким образом, температура в градусах Цельсия соответствует напряжению, считанному с датчика в мВ, делённому на 10 мВ.
temperatureC = voltageOut / 10;
Чтобы получить температуру в градусах Фаренгейта, нам просто нужно использовать формулу преобразования Цельсий -> Фаренгейт:
temperatureF = (temperatureC * 1.8) + 32;
Если вы используете LM335 или LM34, для получения температуры применяются те же вычисления. Вам просто нужно помнить, что LM335 возвращает температуру в градусах Кельвина, а LM34 — в градусах Фаренгейта. Затем вы можете преобразовать значения в другие единицы, если это необходимо.
Наконец, выведите показания датчиков в монитор порта (Serial Monitor) в градусах Цельсия и Фаренгейта.
Serial.print("Temperature(ºC): ");
Serial.print(temperatureC);
Serial.print(" Temperature(ºF): ");
Serial.print(temperatureF);
В целях отладки мы также выводим напряжение.
Serial.print(" Voltage(mV): ");
Serial.println(voltageOut);
Цикл loop() повторяется каждую секунду.
delay(1000);
Демонстрация
Загрузите код в Arduino IDE. Не забудьте выбрать правильную плату и COM-порт в меню Tools.
После этого откройте монитор порта (Serial Monitor) со скоростью 9600 бод. Вы должны получать новые показания температуры каждую секунду. Вы можете накрыть датчик пальцем, чтобы увидеть, как значения температуры увеличиваются.
Показания температуры на OLED-дисплее
В этом разделе мы покажем вам, как отобразить показания датчика на OLED-дисплее.
Подробное руководство по использованию OLED-дисплея с Arduino смотрите в следующей статье:
Необходимые компоненты
Для этого проекта вам понадобятся следующие компоненты:
Плата Arduino (смотрите Лучшие стартовые наборы Arduino)
Датчик температуры LM35 (или LM335, LM34)
Резистор 2 кОм (при использовании LM335)
Вы можете воспользоваться приведёнными выше ссылками или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения
Подключите все компоненты, как показано на следующей схеме:
Установка библиотек для OLED
Для управления OLED-дисплеем вам нужны библиотеки adafruit_SSD1306.h и adafruit_GFX.h. Следуйте приведённым ниже инструкциям для установки этих библиотек.
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек (Library Manager).
Введите «SSD1306» в поле поиска и установите библиотеку SSD1306 от Adafruit.
После установки библиотеки SSD1306 от Adafruit введите «GFX» в поле поиска и установите эту библиотеку.
После установки библиотек перезапустите Arduino IDE.
Код — Отображение показаний на OLED
После сборки схемы и установки необходимых библиотек загрузите следующий код на плату Arduino.
/*
* Rui Santos
* Complete Project Details https://RandomNerdTutorials.com
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int sensorPin = A0;
float sensorValue;
float voltageOut;
float temperatureC;
float temperatureF;
// uncomment if using LM335
//float temperatureK;
void setup() {
pinMode(sensorPin, INPUT);
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop() {
sensorValue = analogRead(sensorPin);
voltageOut = (sensorValue * 5000) / 1024;
// calculate temperature for LM35 (LM35DZ)
temperatureC = voltageOut / 10;
temperatureF = (temperatureC * 1.8) + 32;
// calculate temperature for LM335
//temperatureK = voltageOut / 10;
//temperatureC = temperatureK - 273;
//temperatureF = (temperatureC * 1.8) + 32;
// calculate temperature for LM34
//temperatureF = voltageOut / 10;
//temperatureC = (temperatureF - 32.0)*(5.0/9.0);
Serial.print("Temperature(ºC): ");
Serial.print(temperatureC);
Serial.print(" Temperature(ºF): ");
Serial.print(temperatureF);
// clear display
display.clearDisplay();
// display temperature Celsius
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(temperatureC);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// display temperature Fahrenheit
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(temperatureF);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("F");
display.display();
delay(1000);
}
Демонстрация
Поздравляем! Вы завершили проект. Теперь вы можете проверить показания датчика на OLED-дисплее. Новые показания температуры отображаются каждую секунду.
Заключение
LM35, LM335 и LM34 — это линейные датчики температуры, которые выдают напряжение, пропорциональное значению температуры. Они могут питаться от пина 5V Arduino, а для считывания напряжения используется аналоговый пин.
Считывание напряжения с датчика не сложнее, чем использование функции analogRead() на пине датчика. Затем достаточно выполнить простое вычисление, чтобы получить температуру в нужных единицах измерения.
Мы надеемся, что это руководство оказалось для вас полезным. У нас есть другие руководства по датчикам и модулям Arduino, которые могут вам понравиться: