В setup() мы должны запустить порт последовательной связи, потому что мы будем использовать монитор последовательного порта для вывода результатов.
8 совместимых с Arduino датчиков температуры для ваших электронных проектов
Считывание значений температуры с помощью Arduino — очень полезная задача. Существует широкий спектр температурных датчиков с различными функциями, которые вы можете использовать в своих проектах.
В этой статье мы собрали 8 доступных температурных датчиков, совместимых с Arduino и другими платами разработки (например, ESP32 или ESP8266).
DHT11
DHT11 — это цифровой датчик температуры, который измеряет температуру и относительную влажность.
Этот датчик содержит микросхему, которая выполняет аналого-цифровое преобразование и выдает цифровой сигнал с температурой и влажностью. Это позволяет легко работать с любым микроконтроллером, включая Arduino.
Ниже приведены основные технические характеристики датчика температуры DHT11:
- Протокол связи: 1-Wire
- Диапазон питания: от 3 до 5,5 В
- Диапазон температур: от 0 до 50 ºC (+/- 2ºC)
- Диапазон влажности: от 20 до 90% (+/- 5%)
- Период выборки: 1 секунда
- Библиотеки Arduino: Adafruit DHT Library, Adafruit Unified Sensor Library
DHT22
Датчик температуры DHT22 очень похож на DHT11. DHT11 очень похож на DHT11; он также измеряет температуру и влажность и имеет ту же распиновку. Он немного дороже, но более точен и имеет более широкий диапазон измерения температуры и влажности.
Ниже перечислены основные характеристики датчика температуры DHT22:
- Протокол связи: 1-Wire
- Диапазон питания : от 3 до 6 В
- Диапазон температур: от -40 до 80 ºC (+/- 0,5ºC)
- Диапазон влажности: от 0 до 100% (+/- 2%)
- Период выборки: 2 секунды
- Библиотеки Arduino: Adafruit DHT Library, Adafruit Unified Sensor Library
Подключение
Датчик TMP35 имеет три контакта (три нити). Посмотрите на датчик со стороны этих проводов и отрежьте их вверх, как показано на рисунке,
Левая сторона — положительный контакт питания (от +2,7 В до 5,5 В), средняя — выход на блок управления, правая — отрицательный контакт питания (земля).
Датчик является аналоговым, т.е. на его выходе не 0 или 1, а напряжение в диапазоне от 0 до 5 вольт. Поэтому нам нужно вспомнить раздел об аналого-цифровом преобразовании (АЦП) сигналов на Arduino. Поскольку Arduino Uno имеет шесть аналоговых входов (A0-A5), мы подключаем наш датчик в соответствии со следующей схемой:
Внешний вид макета
Принципиальная схема
Вот как должна выглядеть собранная схема.
Программа
Подключив датчик температуры к Arduino, начните писать программу. Сначала мы извлекаем необработанный сигнал с аналогового входа на последовательный порт, чтобы понять, как изменяется значение на входе A0. Нам нужна простая программа:
int raw = 0; float temp = 0; void setup()void loop()
Внимание, математика! В программе мы видим выражение
temp = ( raw/1023.0 )*5.0*1000/10,
Он необходим для преобразования аналогового сигнала датчика в градусы Цельсия. Вот в чем проблема. Все аналоговые датчики имеют одно важное свойство — отношение количества вольт к единице измерения. Например, в техническом описании датчика tmp35 указано, что каждый градус измеренной температуры соответствует 10 милливольтам напряжения на выходе. Исходя из этого соображения, мы сначала преобразуем значение, считанное с помощью analogRead, в число вольт:
Напряжения = (значение АЦП / 1023) * 5.
Этот процесс называется нормализацией. Здесь 1023 — максимальное значение, которое может выдать 10-битный АЦП, встроенный в Arduino Uno; 5 — рабочее напряжение АЦП.
Затем мы преобразуем эти вольты в градусы Цельсия:
Градусы = (Вольты * 1000) / 10
Переведите вольты в милливольты (*1000) и разделите на 10 (то же число из таблицы данных!).
В общем, даже если ничего не ясно, загрузите программу в Arduino и наблюдайте за температурой окружающей среды. В нашей лаборатории, например, датчик оценивал температуру следующим образом:
Это очень хорошая цена. Теперь поднесите устройство к открытому окну (на улице зима с температуро й-10°C):
Это работает! Датчик немедленно регистрирует падение температуры.
Делаем термостат
Теперь добавим в программу действие, которое активируется, когда температура опускается ниже установленного порога. Предположим, что этот порог составляет 15°C. Самое простое, что мы можем сделать, это включить светодиод №13 на Arduino. Вот программа:
int raw = 0; float temp = 0; void setup()void loop() Кто-то забывает закрыть окно - температура опускается ниже 15 градусов - загорается светодиод. Закройте окно, активно дышите - светодиод гаснет. Представьте, что вы не включаете светодиод, а подаете сигнал на реле, которое включает обогреватель в комнате. У вас полный термостат!
Если вы немного измените программу, вы можете контролировать не уменьшение, а превышение установленного значения. Например, было бы практично контролировать температуру в серверной комнате и включать капот, когда температура поднимается до 40 градусов!
Библиотеки
Существует несколько библиотек для этого датчика:
- “Официальная” библиотека DallasTemperature.h, для работы которой также понадобится библиотека OneWire.h.
- Наша библиотека microDS18B20
В примерах на этом сайте используется модель microDS18B20, поскольку она во много раз легче и проще в использовании, чем официальная модель. Библиотека включена в файл комплекта GyverKIT, и последняя версия может быть установлена/обновлена в любое время через менеджер библиотек microDS18B20, встроенный в Arduino. Краткую документацию можно найти по ссылке выше, а основные примеры - в самой библиотеке.
Работа с microDS18B20
Без адресации
В этом режиме датчик подключается к клемме на MCU, и ему не нужно заранее считывать адрес и записывать его в программу. Можно подключить несколько датчиков, и каждый датчик имеет свой собственный вывод, см. пример one_pin_one_sensor.
MicroDS18B20 датчик1? MicroDS18B20 sensor2; // .С адресацией
В этом режиме к одному выводу MCU можно подключить сколько угодно датчиков, но для работы с ними в программе необходимо прописать уникальные адреса датчиков. В момент считывания адреса к контакту может быть подключен только один датчик! В качестве примера можно привести 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() // в противном случае генерируется ошибкагде readTemp() запрашивает данные от датчика и возвращает true, если они были считаны правильно. После этого вы можете получить текущую температуру с помощью getTemp(), которая больше не запрашивает температуру датчика, а выводит результат readTemp().
Примеры
Библиотека позволяет работать по схеме "один датчик - один терминал", где не нужно получать адрес датчика. Достаточно подключить его и использовать:
// датчик лучше читать без адресации, экономится много памяти #include MicroDS18B20 sensor; void setup()void loop()/> #include MicroDS18B20 sensor; // Датчик на D2 void setup()void loop()/>= 800) > Каждый датчик имеет свой уникальный адрес. Его можно прочитать следующим образом: Этот код выводит в порт адрес подключенного датчика.
#include MicroDS18B20 sensor; // Создаем безадресный термометр на выводе D2 uint8_t address8; // Создаем таблицу адресов void setup()void loop()/>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()void loop()/> // Количество датчиков для упрощения #define DS_SENSOR_AMOUNT 5 // Создаем двумерную таблицу с адресами uint8_t addr8 = ;<,, ,, ,>; #include // укажите DS_ADDR_MODE для подключения блока адресации // и массива датчиков на выводе D2 MicroDS18B20 sensorDS_SENSOR_AMOUNT; void setup().>void loop()/>= 1000) Serial.println(); // запрос нового for (int i = 0; i >> Модуль датчика температуры KY-013
Датчик является аналоговым, но его следует использовать не для измерения конкретных температур, а для контроля нарушения предельных значений.
В общем, проблематично использовать датчик температуры KY-013 в качестве термометра. Он лучше подходит для включения устройства при определенной температуре и выключения при другой температуре. Сначала нужно выяснить, какое напряжение присутствует на аналоговом входе при нужной температуре, а затем написать код на основе этих значений.
Принципиальная схема
При работе с датчиком попробуйте поменять заземление и питание, часто маркировка бывает неправильной.
Схема для работы
void setup()
void loop() Вы можете найти KY-013 в магазине