Датчик температуры и влажности (Troyka-модуль)
Датчик температуры и влажности способен определять температуру и влажность окружающей среды.
Подключение и настройка
Датчик общается с управляющей электроникой по трём проводам.
При подключении к Arduino или Iskra JS удобно использовать Troyka Shield. С Troyka Slot Shield можно обойтись без лишних проводов.
Примеры работы
Рассмотрим примеры работы датчика температуры и влажности DHT11 в зависимости от управляющей платформы.
Пример для Arduino
В качестве примера выведем в Serial-порт текущее значение температуры и влажности. Для запуска примера скачайте и установите библиотеку TroykaDHT.
// библиотека для работы с датчиками серии DHT #include // создаём объект класса DHT // передаём номер пина к которому подключён датчик и тип датчика // типы сенсоров: DHT11, DHT21, DHT22 DHT dht(4, DHT11); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); dht.begin(); } void loop() { // считывание данных с датчика dht.read(); // проверяем состояние данных switch(dht.getState()) { // всё OK case DHT_OK: // выводим показания влажности и температуры Serial.print("Temperature = "); Serial.print(dht.getTemperatureC()); Serial.println(" C \t"); Serial.print("Temperature = "); Serial.print(dht.getTemperatureK()); Serial.println(" K \t"); Serial.print("Temperature = "); Serial.print(dht.getTemperatureF()); Serial.println(" F \t"); Serial.print("Humidity = "); Serial.print(dht.getHumidity()); Serial.println(" %"); break; // ошибка контрольной суммы case DHT_ERROR_CHECKSUM: Serial.println("Checksum error"); break; // превышение времени ожидания case DHT_ERROR_TIMEOUT: Serial.println("Time out error"); break; // данных нет, датчик не реагирует или отсутствует case DHT_ERROR_NO_REPLY: Serial.println("Sensor not connected"); break; } // ждём две секунды delay(2000); }
Пример для Iskra JS
Выведем данные температуры и влажности в консоль Espruino Web IDE.
// подключаем библиотеку DHT11 и создаём объект для работы с датчиком var dht = require("DHT11").connect(P4); // считываем данные с датчика // выводим показания температуры и влажности в консоль dht.read(function (a) { console.log("Temp is "+a.temp.toString()+" and RH is "+a.rh.toString()); });
Протокол датчика DHT
Выходом датчика является цифровой сигнал. Температура и влажность передаются по одному сигнальному проводу ( S ). DHT11 общается с принимающей стороной, такой как Arduino по собственному протоколу. Коммуникация двунаправлена и в общих чертах выглядит так:
Микроконтроллер говорит о том, что хочет считать показания. Для этого он устанавливает сигнальную линию в 0 на некоторое время, а затем устанавливает её в 1
Сенсор подтверждает готовность отдать данные. Для этого он аналогично сначала устанавливает сигнальную линию в 0, затем в 1
После этого сенсор передаёт последовательность 0 и 1, последовательно формирующих 5 байт (40 бит). В первых двух байтах передаётся температура, в третьем-четвёртом — влажность, в пятом — контрольная сумма, чтобы микроконтроллер смог убедиться в отсутствии ошибок считывания
Благодаря тому, что сенсор делает измерения только по запросу, достигается энергоэффективность: пока общения нет, датчик потребляет ток 100 мкА.
Элементы платы
Датчик DHT11
Цифровой датчик DHT11 является составным датчиком, который выдаёт калиброванный цифровой сигнал с показаниями температуры и влажности.
Сенсор включает в себя резистивный компонент измерения влажности и компонент измерения температуры с отрицательным температурным коэффициентом (NTC), которые подключены к высокопроизводительному 8-битному микроконтроллеру.
Каждый датчик DHT11 проходит калибровку на заводе изготовителе. Коэффициенты калибровки хранятся в однократно программируемой энергонезависимой памяти и используются во внутренних процессах обработки сигнала.
Контакты подключения 3-проводного шлейфа
Модуль подключается к управляющей электронике по трём проводам. Назначение контактов 3-проводного шлейфа:
Питание ( V ) — красный провод. На него должно подаваться напряжение питания от 3,3 до 5 В;
Земля ( G ) — чёрный провод. Должен быть соединён с землёй микроконтроллера;
Сигнальный ( S ) — жёлтый провод. Подключается к цифровому выходу микроконтроллера. Через него сенсор общается с микроконтроллером по собственному протоколу.
Датчик температуры DS18B20: подключение, распиновка и примеры работы
Цифровой датчик DS18B20 измерит температуру в воде, на земле и даже в космосе.
Датчик способен считывать показания температуры в диапазоне от −55 до +125 °C и передавать данные на управляющую плату всего через один пин.
Распиновка
Цвет провода | Контакт | Функция | Подключение |
---|---|---|---|
Жёлтый / Белый | S | Сигнальный | Подключите к пину ввода-вывода микроконтроллера через резистор 4,7 кОм. |
Красный | V | Входное напряжение (+) | Подключите к плюсу источника питания. |
Чёрный | G | Входное напряжение (−) | Подключите к минусу источника питания. |
Примеры работы для Arduino
Датчик общается с управляющей платой по протоколу 1-wire . Но вы можете не загружать себе голову битами и байтами, а сразу сосредоточиться на проекте. Для этого скачайте и установите две библиотеки OneWire и DallasTemperature через менеджер модулей.
Один датчик
Рассмотрим простой пример — подключения одного датчика.
Схема подключения
Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Arduino в компактном форм-факторе, например Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.
Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.
При коммуникации сенсора со стандартными платами Arduino Uno формата Rev3 или Iskra Uno используйте Troyka Slot Shield совместно с модулем подтяжки.
Код программы
Выведем температуру сенсора в Serial-порт.
// библиотека для работы с протоколом 1-Wire #include // библиотека для работы с датчиком DS18B20 #include // сигнальный провод датчика #define ONE_WIRE_BUS 5 // создаём объект для работы с библиотекой OneWire OneWire oneWire(ONE_WIRE_BUS); // создадим объект для работы с библиотекой DallasTemperature DallasTemperature sensor(&oneWire); void setup(){ // инициализируем работу Serial-порта Serial.begin(9600); // начинаем работу с датчиком sensor.begin(); // устанавливаем разрешение датчика от 9 до 12 бит sensor.setResolution(12); } void loop(){ // переменная для хранения температуры float temperature; // отправляем запрос на измерение температуры sensor.requestTemperatures(); // считываем данные из регистра датчика temperature = sensor.getTempCByIndex(0); // выводим температуру в Serial-порт Serial.print("Temp C: "); Serial.println(temperature); // ждём одну секунду delay(1000); }
Серия датчиков
Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
Схема подключения
Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.
Код программы
Просканируем все устройства на шине 1-Wire и выведем температуру каждого сенсора отдельно в Serial-порт.
// библиотека для работы с протоколом 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); }
Примеры работы для Espruino
Один датчик
Рассмотрим простой пример — подключения одного датчика.
Схема подключения
Сенсор подключается к управляющей плате через один сигнальный пин. При подключении к Iskra в компактном формфакторе, например Iskra JS Mini, воспользуйтесь макетной платой и парочкой нажимных клеммников.
Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.
При коммуникации сенсора с платой Iskra JS, используйте Troyka Slot Shield совместно с модулем подтяжки.
Код программы
Выведем температуру сенсора в консоль Espruino Web IDE.
// создаём объект для работы с шиной OneWire // для Iskra JS используйте пин P10 var oneWire = new OneWire(P10); // для Iskra JS Mini используйте пин B1 // var oneWire = new OneWire(B1); // создаём объект для работы с датчиком температуры DS18B20 var sensor = require("DS18B20").connect(oneWire); // каждую секунду выводим показания датчика в консоль setInterval(function() { sensor.getTemp(function (temp) { console.log("Temp is "+temp+"°C"); }); }, 1000);
Серия датчиков
Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
Схема подключения
Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.
Код программы
Найдём все устройства на шине 1-Wire и выведем температуру каждого сенсора отдельно в Serial-порт.
// создаём объект для работы с шиной OneWire // для Iskra JS используйте пин P10 var oneWire = new OneWire(P10); // для Iskra JS Mini используйте пин B1 // var oneWire = new OneWire(B1); // создаём массив объектов для работы с каждым датчиком температуры DS18B20 var sensors = oneWire.search().map(function (device) { return require("DS18B20").connect(oneWire, device); }); // каждую секунду выводим показания всех подключённых датчиков на шине 1-wire в консоль setInterval(function() { sensors.forEach(function (sensor, index) { sensor.getTemp(function (temp) { console.log("Device "+ index + ": " + temp + "°C"); }); }); }, 1000);
Примеры работы для Raspberry Pi
Один датчик
Считаем данные с датчика одноплатником Raspberry Pi. Подключите сенсор к 4 пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.
Схема подключения
Код программы
# подключаем модуль времени import time # подключаем модуль для работы с датчиком DS18B20 from w1thermsensor import W1ThermSensor # создаём объект для работы с сенсором sensor = W1ThermSensor() while (True): # считываем данные с датчика temperature = sensor.get_temperature() # выводим значения в консоль каждую секунду print(temperature) time.sleep(1)
Считаем данные с датчика одноплатником Raspberry Pi. Подключите сенсор к 4 пину Raspberry через модуль подтяжки. Для избежания макеток и проводов используйте плату расширения Troyka Cap.
Серия датчиков
Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
Схема подключения
Код программы
# подключаем модуль времени import time # подключаем модуль w1thermsensor from w1thermsensor import W1ThermSensor while (True): # перебираем по очереди все датчики for i, sensor in enumerate(W1ThermSensor.get_available_sensors(), start = 1): # считываем данные с датчиков # и выводим значения в консоль каждую секунду print("Sensor %d Address %s has temp %.2f celcius" % (i,sensor.id, sensor.get_temperature())) print("\n") # ждём одну секунду time.sleep(1)
Как подключить датчик температуры LM35 Ардуино
Датчик температуры lm35 может использоваться во многих простых проектах, например, метеостанция на Ардуино. Рассмотрим на данном занятии простой аналоговый термодатчик LM35: как работает радиоэлемент, схема его подключения к Arduino UNO. Рассмотрим простой скетч для датчика температуры, который будет выдавать показания температуры на монитор компьютера или LCD дисплей.
Характеристики датчика lm35, описание
— питание: 2,7-5,5 Вольт;
— потребляемый ток: 50 mkА;
— диапазон температур: 10°C — 125°C
— погрешность: 2 градуса.
Вместо lm35 можно использовать любой другой датчик температуры, например, TMP35, LM35, TMP37, LM335. Выглядит датчик как транзистор и поэтому его легко спутать, поэтому всегда внимательно читайте маркировку на радиоэлементах. Часто на основе данного датчика производители делают модули температуры для Ардуино (смотри фото выше). Если у вас только сам датчик lm35, то он имеет три вывода.
Если посмотреть на температурный сенсор lm35 со стороны контактов и срезом вверх (как на рисунке), то слева будет положительный контакт для питания 2,7-5,5 Вольт, контакт по центру — это выход, а справа — отрицательный контакт питания (GND).
Как подключить датчик lm35 к Ардуино
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- Макетная плата;
- температурный датчик LM35;
- светодиод и резистор на 220 Ом;
- провода «папа-папа».
Данный датчик аналоговый, поэтому на выходе мы имеем значения не 0 или 1, а непрерывное изменение напряжения в диапазоне от 0 до 5 вольт. Следовательно, мы должны подключить датчик lm35 к Arduino к аналоговым портам A0-A5 по схеме, изображенной далее. После сборки схемы загрузите скетч для снятия значений с аналоговых датчиков и вывода данных в аппаратный последовательный порт.
Скетч для термодатчика lm35 Ардуино
int temp; // освобождаем память для переменной "temp" void setup() < pinMode(A0, INPUT); // сенсор LM35 подключим к аналоговому входу A0 Serial.begin(9600); // подключаем монитор порта > void loop() < temp = analogRead(A0); // переменная находится в интервале 0 - 1023 Serial.println(temp); // выводим значение датчика на монитор delay(100); // ставим небольшую задержку >
Пояснения к коду:
- в первой строчке мы зарезервировали память для переменой temp ;
- оператор int указывает, что значения temp могут принимать только целое число.
Калибровка температурного датчика lm35
Калибровка аналогового датчика нужна, для того чтобы получать показания с lm35 температурного датчика в градусах Цельсия, как это сделано на цифровом датчике температуры и влажности DHT11. Для этого в скетч следует добавить еще одну переменную и вставить формулу, которая преобразует аналоговый сигнал с датчика в градусы Цельсия. Для калибровки lm35 следует изменить формулу в программе.
Скетч для калибровки датчика lm35
int temp; // освобождаем память для переменной "temp" float grad; // освобождаем память для переменной "grad" void setup() < pinMode(A0, INPUT); // сенсор LM35 подключим к аналоговому входу A0 Serial.begin(9600); // подключаем монитор порта > void loop() < temp = analogRead(A0); // переменная находится в интервале 0 - 1023 grad = ( temp/1023.0 )*5.0*1000/10; // формулу можно изменять Serial.println(grad); // выводим температуру на монитор delay(100); // ставим небольшую задержку >
Пояснения к коду:
- переменная float — это число с плавающей точкой, используется для аналоговых величин, т.к. позволяют описать их более точно, чем целые числа;
- в формуле grad = ( temp / 1023.0 ) * 5.0 * 1000 / 10; можно менять значения чисел, чтобы точнее откалибровать температурный датчик;
Аналоговый термометр (Troyka-модуль): подключение, настройка, схема и примеры использования
Для измерения температуры окружающей среды воспользуйтесь электронным аналоговым термометром на основе микросхемы TMP36.
Подключения и настройка
Датчик общается с управляющей электроникой по трём проводам. На выходе сенсора — аналоговый сигнал, который сообщает микроконтроллеру об измеренной температуре.
При подключении к Arduino или Iskra JS удобно использовать Troyka Shield.
С Troyka Slot Shield можно обойтись без лишних проводов.
Примеры использования
Программа для Arduino
С помощью библиотеки TroykaThermometer, выведем в Serial-порт температуру, используя три шкалы измерения.
// библиотека для работы с аналоговым термометром (Troyka-модуль) #include // создаём объект для работы с аналоговым термометром // и передаём ему номер пина выходного сигнала TroykaThermometer thermometer(A0); void setup() { // открываем последовательный порт Serial.begin(9600); } void loop() { // считываем данные с аналогового термометра thermometer.read(); // вывод показателей аналогового термометра в градусах Цельсия Serial.print("Temperature is "); Serial.print(thermometer.getTemperatureC()); Serial.println(" C"); // вывод показателей аналогового термометра в градусах Кельвина Serial.print("Temperature is "); Serial.print(thermometer.getTemperatureK()); Serial.println(" K"); // вывод показателей аналогового термометра в градусах Фаренгейта Serial.print("Temperature is "); Serial.print(thermometer.getTemperatureF()); Serial.println(" F"); delay(1000); }
Программа для IskraJS
Выведем в Serial порт значения температуры используя четыре разные формы представления данных. Применим модуль thermometer для Iskra JS
// подключаем модуль аналогового термометра var temperature = require('@amperka/thermometer').connect(A0); // выводим в консоль данные с термометра во всех возможных форматах setInterval(function() { console.log('Room temperature:', temperature.read('C'), 'degrees Celsius'); console.log('Room temperature:', temperature.read('V'), 'V'); console.log('Room temperature:', temperature.read('mV'), 'mV'); console.log('Room temperature:', temperature.read(), 'from 0 to 1'); }, 1000);
Элементы платы
Микросхема TMP36
Микросхема TMP36 от Analog Devices — это прецизионный низковольтный датчик температуры. Высокая линейность выходного сигнала, а также достаточная точность измерений позволяет подключать датчик напрямую к аналоговым входам Arduino/Iskra.
Контакты подключения трёхпроводного шлейфа
Модуль подключается к управляющей электронике по трём проводам. Назначение контактов трёхпроводного шлейфа:
Питание ( V ) — питание модуля. Соедините с питанием микроконтроллера.
Земля ( G ) — земля. Соедините с землёй микроконтроллера.
Сигнальный ( S ) — жёлтый провод. Подключите к аналоговому входу микроконтроллера. Через него управляющая плата считывает сигнал с термометра.