Как подключить датчик температуры к ардуино
Перейти к содержимому

Как подключить датчик температуры к ардуино

  • автор:

Урок 16. Подключение датчика DHT11 к Arduino UNO. Выводим температуру и влажность на LCD 1602 I2C дисплей

В этом уроке мы рассмотрим самый популярный датчик температуры DHT11. Научимся считывать показания датчика и выводить на LCD 1602 I2C дисплей.

Нам понадобится:

  • Arduino
  • Перемычки или Набор проводов для макетирования 65 шт.
  • Провода Папа-Мама
  • Breadboard
  • Резисторы
  • DHT11 цифровой датчик температуры и влажности
  • Символьный дисплей голубая подсветка LCD1602 IIC/I2C или Символьный дисплей зеленая подсветка LCD1602 IIC/I2C

Для реализации проекта нам необходимо установить библиотеки:

  • LiquidCrystal_I2C1602V1 Библиотека
  • Библиотека для подключения DHT11

Схема подключения:

Этом уроке к arduino uno будет подключено два модуля, датчик температуры и влажности DHT11 и символьный дисплей LCD1602 IIC/I2.

1) Датчик DHT11 с помощью которого будем получать данные о температуре и влажности окружающей среды, подключается следующим образом.

Описание подключения DHT11 к Arduino:

DHT11 Arduino
1 контакт 5V
2 контакт Pin 2
3 контакт Через резистор 10 kOm к 5V
4 контакт GND

2) Теперь подключаем символьный дисплей LCD1602 IIC/I2C к Arduino uno, на который будет выводиться информация о температуре и влажности.

Arduino LCD1602 IIC/I2C Цвет проводов на фото
GND GND Черный
5V VCC Красный
A4 SDA Коричневый
A5 SCL Серый

Скетч:

Не забудьте установить библиотеки указанные в начале урока.

#include #include LiquidCrystal_I2C lcd(0x27, 16, 2); #include dht11 sensor; #define DHT11PIN 2 byte degree[8] = // кодируем символ градуса < B00111, B00101, B00111, B00000, B00000, B00000, B00000, >; void setup() < lcd.init(); lcd.backlight(); lcd.createChar(1, degree); // Создаем символ под номером 1 >void loop()

Демонстрация работы:

Датчик температуры TMP36 и его подключение к Arduino

Аналоговый датчик температуры TMP36 компании Analog Devices позволит вам легко получать достаточно точные показания температуры в диапазоне от -40 до +150°C. К тому же его очень просто подключить к Arduino.

Датчик температуры TMP36
Этот датчик температуры является твердотельным, то есть для измерения температуры в нем не используется ртуть как в термометрах или термисторы (резисторы, чувствительные к температуре).

Вместо этого в нем используется тот факт, что при возрастании температуры напряжение на диоде возрастает в известной пропорции. Технически, на самом деле это падение напряжения между базой и эмиттером (Vbe) транзистора. После усиления такого изменения напряжения легко получить аналоговый сигнал, который будет прямо пропорционален температуре.

Датчик температуры TMP36
Поскольку эти датчики не имеют движущихся частей, они точны, никогда не изнашиваются, не нуждаются в калибровке и могут работать в жестких условиях окружающей среды. Кроме того, они очень дешевые и очень просты в использовании.

Выходной диапазон напряжения TMP36 составляет от 0.1В (-40°C) до 2.0В (150°C), но после 125°C точность измерения уменьшается. Подаваемое напряжение от 2.7В до 5.5В, потребление тока всего 0.05 мА.

Как измерять температуру

Использовать TMP36 для измерения температуры достаточно просто, нужно соединить его левый контакт с напряжением 2.7-5.5В, а правый с землей. Тогда на среднем выводе будет присутствовать напряжение, линейно пропорциональное температуре.

Датчик температуры TMP36 и его подключение к Arduino

Чтобы перевести напряжение в температуру просто воспользуйтесь следующей формулой (Vout измеряется в милливольтах):

Температура в °C = [Vout — 500] / 10

Например, выходное напряжение составляет 1 В, это значит, что температура равна ((1000 мВ — 500) / 10) = 50 °C.

Если вы используете датчики температуры типа LM35 и ему подобные, то ориентируйтесь на линию ‘a’ графика, показанного выше. Формула тогда будет следующая:

Температура в °C = Vout / 10

Проблема при использовании нескольких датчиков

Если вы используете несколько датчиков температуры, то можете заметить, что показания температуры непостоянны. Это значит, что датчики влияют друг на друга, когда цепь считывания аналогового сигнала переключается с одного вывода на другой. Вы можете исправить это, организовав задержку между двумя считываниями.

Подключаем датчик температуры к Arduino, Подключение датчика довольно простое
В данном случае мы подключили датчик к напряжению 5 В, но также можно его подключать к 3.3 В. Не важно к какой линии питания вы его подключите, его выходное напряжение все равно не превысит 2 В. С учетом того, что АЦП в Arduino 10-и разрядный, то будет справедлива следующая формула:

Напряжение на выводе в мВ = (показания АЦП) * (5000/1024)

Эта формула преобразует число от 0 до 1023 с АЦП в 0-5000мВ (= 5В). При использовании питания 3.3 В формула будет следующая:

Напряжение на выводе в мВ = (показания АЦП) * (3300/1024)

Далее, чтобы перевести милливольты в температуру, нужно воспользоваться формулой:

Температура в цельсиях = [(аналоговое напряжение в мВ) — 500] / 10

Простой термометр на Arduino

Нижеприведенный пример кода показывает, насколько просто можно сделать термометр на Arduino. В данном случае в последовательный порт выводятся показания температуры в цельсиях и фаренгейтах.

int sensorPin = 0; //аналоговый ввод для выхода датчика TMP36 //разрешение 10 мВ / градус цельсия со смещением на 500 мВ //для отрицательной температуры void setup() < Serial.begin(9600); >void loop() < //считываем напряжение датчика int reading = analogRead(sensorPin); // преобразуем показания в напряжение, для 3.3v используйте значение 3.3 float voltage = reading * 5.0; voltage /= 1024.0; // выводим напряжение Serial.print(voltage); Serial.println(" volts"); // теперь выводим температуру float temperatureC = (voltage - 0.5) * 100 ; //исходя из 10 мВ на градус со смещением 500 мВ Serial.print(temperatureC); Serial.println(" degrees C"); // в фаренгейтах float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0; Serial.print(temperatureF); Serial.println(" degrees F"); delay(1000); //ждем секунду >

Повышаем точность измерения температуры

Для получения более точного результата с меньшим уровнем шумов можно задействовать опорное напряжение 3.3V с ARef. На рисунке ниже показана схема соединения. Следует отметить, что TMP36 в этом случае подключен к аналоговому вводу A1. Также не следует забывать, что при использовании вывода 3.3v в качестве опорного в коде нужно прописывать analogReference(EXTERNAL).

#define aref_voltage 3.3 // подтягиваем 3.3V к ARef int tempPin = 1; // подсоединяем датчик теперь к аналоговому вводу 1 int tempReading; void setup(void) < Serial.begin(9600); analogReference(EXTERNAL); >void loop(void) < tempReading = analogRead(tempPin); Serial.print("Temp reading = "); Serial.print(tempReading); // сырые данные // преобразуем эти данные в напряжение относительно опорного напряжения float voltage = tempReading * aref_voltage; voltage /= 1024.0; // выводим напряжение Serial.print(" - "); Serial.print(voltage); Serial.println(" volts"); // выводим температуру float temperatureC = (voltage - 0.5) * 100 ; Serial.print(temperatureC); Serial.println(" degrees C"); // в фаренгейтах float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0; Serial.print(temperatureF); Serial.println(" degrees F"); delay(1000); >

Arduino и термометр DS18B20

DS18B20 – высокоточный цифровой датчик температуры. Основные характеристики:

  • Диапазон: -55.. 125 °C
  • Точность: 0.5 °C
  • Разрешение: 9.. 12 бит (0.48.. 0.06 °C)
  • Питание: 3-5.5V
  • Период выдачи результата:
    • 750 мс при точности 12 бит
    • 94 мс при точности 9 бит

    В наборе идёт датчик в герметичном исполнении со стандартным гнездом (шаг 2.54 мм) для подключения

    Подключение

    Датчик имеет следующие назначения пинов:

    Датчик подключается к любому цифровому пину Arduino, но пин должен быть подтянут к питанию резистором 4.7 кОм. На один пин можно подключить несколько датчиков DS18B20.

    В рамках набора GyverKIT резистор на 4.7 кОм можно заменить двумя резисторами на 10 кОм (есть в комплекте), подключенными параллельно:

    Библиотеки

    Для этого датчика есть несколько библиотек:

    • “Официальная” библиотека DallasTemperature.h, для работы которой также понадобится библиотека OneWire.h.
    • Наша библиотека microDS18B20

    В примерах на этом сайте мы будем использовать microDS18B20, так как она в несколько раз легче и проще в использовании, чем официальная. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию microDS18B20. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

    Работа с microDS18B20

    Без адресации

    В этом режиме на один пин МК подключается один датчик, для работы с ним не требуется предварительного чтения адреса и записи его в программу. Можно подключить несколько датчиков, каждому указать свой пин, см. пример one_pin_one_sensor.

    MicroDS18B20 sensor1; MicroDS18B20 sensor2; // . и так далее

    С адресацией

    В этом режиме можно подключить сколько угодно датчиков на один пин МК, но для работы с ними понадобится занести в программу уникальные адреса датчиков. В момент чтения адреса к пину должен быть подключен только один датчик! Пример – address_read. Для дальнейшей работы адреса хранятся в массивах на стороне программы и передаются датчикам при инициализации, пин указывается один и тот же:

    uint8_t addr1[] = ; uint8_t addr2[] = ; MicroDS18B20 sensor1; MicroDS18B20 sensor2; // . и так далее

    Также адрес можно сменить во время работы программы, см. документацию.

    Чтение температуры

    Чтение температуры делится на два этапа – запрос и получение данных. Запрос делается функцией requestTemp() . После получения запроса датчик начинает измерение температуры, которое длится от 90 до 750 мс в зависимости от настроенной точности (по умолчанию точность максимальная, преобразование длится 750 мс). Если прочитать температуру до окончания преобразования – датчик вернёт результат предыдущего измерения, поэтому в примерах используется задержка или опрос по таймеру на 1 секунду. Получить температуру можно при помощи getTemp() [float] или getTempInt() [int]. Если принятые данные повреждены или датчик отсутствует на линии – функция вернёт предыдущее успешно прочитанное значение температуры.

    Примечание: при повторных вызовах getTemp() не запрашивает с датчика новую температуру (долгое выполнение функции), вместо этого она просто возвращает предыдущий результат до тех пор, пока не будет сделан новый запрос requestTemp().

    В версии библиотеки 3.5 появилась возможность отдельно запросить температуру и определить корректность полученных данных, чтобы только после этого их прочитать и применить в программе – функция readTemp() . Также это позволяет определить состояние подключения и всё ли в порядке с датчиком. Для чтения температуры рекомендуется использовать конструкцию вида:

    if (sensor.readTemp()) value = sensor.getTemp(); // else отработка ошибки

    где readTemp() запрашивает данные с датчика и возвращает true , если они прочитаны корректно. После этого можно забрать текущую температуру из getTemp() , которая уже не запрашивает температуру с датчика, а отдаёт прочитанный в readTemp() результат.

    Примеры

    Без адресации

    Библиотека позволяет работать по схеме “один датчик – один пин”, в которой адрес датчика получать не нужно. Достаточно подключить и использовать:

    // один датчик лучше читать без адресации, это сильно экономит память #include MicroDS18B20 sensor; void setup() < Serial.begin(9600); >void loop() < // запрос температуры sensor.requestTemp(); // вместо delay используй таймер на millis(), пример async_read delay(1000); // проверяем успешность чтения и выводим if (sensor.readTemp()) Serial.println(sensor.getTemp()); else Serial.println("error"); >

    Без адресации асинхронный опрос

    #include MicroDS18B20 sensor; // датчик на D2 void setup() < Serial.begin(9600); >void loop() < // конструкция программного таймера на 800 мс static uint32_t tmr; if (millis() - tmr >= 800) < tmr = millis(); // читаем прошлое значение if (sensor.readTemp()) Serial.println(sensor.getTemp()); else Serial.println("error"); // запрашиваем новое измерение sensor.requestTemp(); >>

    Чтение адреса

    Каждый датчик имеет свой уникальный адрес. Его можно прочитать следующим образом:Данный код выводит в порт адрес текущего подключенного датчика.

    #include MicroDS18B20 sensor; // Создаем термометр без адреса на пине D2 uint8_t address[8]; // Создаем массив для адреса void setup() < Serial.begin(9600); >void loop() < // читаем адрес термометра в указанный массив if (sensor.readAddress(address)) < // если успешно, выводим Serial.print('<'); for (uint8_t i = 0; i < 8; i++) < Serial.print("0x"); Serial.print(address[i], HEX); // Выводим адрес if (i < 7) Serial.print(", "); >Serial.println('>'); > else Serial.println("Not connected"); delay(1000); >

    Опрос датчиков с адресацией

    Зная адреса датчиков, можно подключить несколько штук на один пин и обращаться к ним в коде следующим образом:

    #include #define DS_PIN 2 // пин для термометров // Уникальные адреса датчиков - считать можно в примере address_read uint8_t s1_addr[] = ; uint8_t s2_addr[] = ; MicroDS18B20 sensor1; // Создаем термометр с адресацией MicroDS18B20 sensor2; // Создаем термометр с адресацией void setup() < Serial.begin(9600); >void loop() < // асинхронное чтение нескольких датчиков смотри в примере async_read_many sensor1.requestTemp(); // Запрашиваем преобразование температуры sensor2.requestTemp(); delay(1000); // ожидаем результат Serial.print("t1: "); if (sensor1.readTemp()) Serial.println(sensor1.getTemp()); else Serial.println("error"); Serial.print("t2: "); if (sensor2.readTemp()) Serial.println(sensor2.getTemp()); else Serial.println("error"); >

    Удобный опрос массива датчиков

    // количество датчиков для удобства #define DS_SENSOR_AMOUNT 5 // создаём двухмерный массив с адресами uint8_t addr[][8] = < , , , , , >; #include // указываем DS_ADDR_MODE для подключения блока адресации // и создаём массив датчиков на пине D2 MicroDS18B20 sensor[DS_SENSOR_AMOUNT]; void setup() < Serial.begin(9600); // устанавливаем адреса for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < sensor[i].setAddress(addr[i]); >> void loop() < // конструкция программного таймера на 1c static uint32_t tmr; if (millis() - tmr >= 1000) < tmr = millis(); // выводим показания в порт for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < Serial.print(sensor[i].getTemp()); Serial.print(','); >Serial.println(); // запрашиваем новые for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < sensor[i].requestTemp(); >> >

    Видео

    Домашнее задание

    • Изучить остальные возможности библиотеки
    • Измерить температуру тела, сравнить со ртутным термометром

    Связанные уроки

    Подключение датчика температуры DS18B20 к Arduino

    В этой статье обсуждаем подключение датчика температуры DS18B20 к Arduino. О подобных устройствах мы говорили мало, но это не означает, что их редко задействуют в современных проектах. Датчики температуры необходимы для контроля не только температурных показателей в помещениях, но и твердых объектов, жидкостей, металлов и т.д. Такие модули легки в сборке и настройке, доступны по цене, функциональны (считывают значения в пределах от −55 до +125 °C), а потому достойны нашего внимания.

    Давайте рассмотрим одно из таких устройств – цифровой температурный датчик DS18B20.

    Его технические параметры:

    • напряжение: 3,3-5V;
    • наибольшее разрешение: 12 бит;
    • диапазон рабочих температур: 55 . +125 С;
    • погрешность ∕ точность: 0,5 С (не более);
    • SRAM (оперативная память, сохранение полученных измерений) и EEPROM (энергонезависимая);
    • имеется уникальный серийный код;
    • длина провода: 10см.

    Распиновка микросхемы:

    Распиновка микросхемы

    Разберем схему подключения, в которой использованы следующие аппаратные компоненты:

    1. плата расширения Arduino Uno;
    2. датчик DS18B20;
    3. коннекторы;
    4. резистор на 4,7 кОм;
    5. макетная плата;
    6. USB-кабель (для подключения к ПК).

    Схема подключения датчика DS18B20 к Arduino

    Схема подключения датчика DS18B20 к Arduino

    Скетч для подключения датчика DS18B20 к Arduino

    В скетче, который зальем ниже, будет использоваться библиотека OneWire. Ее следует скачать и инсталлировать в папку libraries среды разработки Arduino IDE.

    Прописываем скетч:

     #include /* * Описание взаимодействия с цифровым датчиком ds18b20 * Подключение ds18b20 к Arduino через пин 8 */ OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком void setup() < Serial.begin(9600); >void loop() < // Определяем температуру от датчика DS18b20 byte data[2]; // Место для значения температуры ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память delay(1000); // Микросхема измеряет температуру, а мы ждем. ds.reset(); // Теперь готовимся получить значение измеренной температуры ds.write(0xCC); ds.write(0xBE); // Просим передать нам значение регистров со значением температуры // Получаем и считываем ответ data[0] = ds.read(); // Читаем младший байт значения температуры data[1] = ds.read(); // А теперь старший // Формируем итоговое значение: // - сперва "склеиваем" значение, // - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625) float temperature = ((data[1] 

    Особенностью именно этого модуля является способность передавать данные на управляющую плату всего через 1 пин. Это означает, что можно одновременно подключить до 127 таких датчиков (параллельно).

    Как подключить несколько датчиков DS18B20 к Arduino

    Рассмотрим вариант, когда нам необходимо в одной сборке использовать серию датчиков. Для примера, возьмем три датчика темпиротуры DS18B20.

    Мы заменили микроконтроллер на Micro:

    Схема подключения нескольких датчиков DS18B20 к Arduino

    Принципиальная схема:

    Схема подключения нескольких датчиков DS18B20 к Arduino

    Пример скетча:

     // библиотека для работы с протоколом 1-Wire #include // библиотека для работы с датчиком DS18B20 #include // сигнальный провод датчика #define ONE_WIRE_BUS 5 // создаём объект для работы с библиотекой OneWire OneWire oneWire(ONE_WIRE_BUS); // создадим объект для работы с библиотекой DallasTemperature DallasTemperature sensors(&oneWire); // создаём указатель массив для хранения адресов датчиков DeviceAddress *sensorsUnique; // количество датчиков на шине int countSensors; // функция вывода адреса датчика void printAddress(DeviceAddress deviceAddress) < for (uint8_t i = 0; i < 8; i++)< if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); >> void setup() < // инициализируем работу Serial-порта Serial.begin(9600); // ожидаем открытия Serial-порта while(!Serial); // начинаем работу с датчиком sensors.begin(); // выполняем поиск устройств на шине countSensors = sensors.getDeviceCount(); Serial.print("Found sensors: "); Serial.println(countSensors); // выделяем память в динамическом массиве под количество обнаруженных сенсоров sensorsUnique = new DeviceAddress[countSensors]; // определяем в каком режиме питания подключены сенсоры if (sensors.isParasitePowerMode()) < Serial.println("Mode power is Parasite"); >else < Serial.println("Mode power is Normal"); >// делаем запрос на получение адресов датчиков for (int i = 0; i < countSensors; i++) < sensors.getAddress(sensorsUnique[i], i); >// выводим полученные адреса for (int i = 0; i < countSensors; i++) < Serial.print("Device "); Serial.print(i); Serial.print(" Address: "); printAddress(sensorsUnique[i]); Serial.println(); >Serial.println(); // устанавливаем разрешение всех датчиков в 12 бит for (int i = 0; i < countSensors; i++) < sensors.setResolution(sensorsUnique[i], 12); >> void loop() < // переменная для хранения температуры float temperature[10]; // отправляем запрос на измерение температуры всех сенсоров sensors.requestTemperatures(); // считываем данные из регистра каждого датчика по очереди for (int i = 0; i < countSensors; i++) < temperature[i] = sensors.getTempCByIndex(i); >// выводим температуру в Serial-порт по каждому датчику for (int i = 0; i < countSensors; i++) < Serial.print("Device "); Serial.print(i); Serial.print(" Temp C: "); Serial.print(temperature[i]); Serial.println(); >Serial.println(); // ждём одну секунду delay(1000); > 

    Создавайте собственные проекты с термометрами – это увлекательно и несложно! А мы прощаемся – до новых встреч!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *