Оглавление
- Использование
- Принципы ШИМ модуляции
- Примеры работы для Arduino
- Подключение DS18B20 к Arduino
- Способ 2: чтение датчика DS18B20 по адресу
- 3Считывание данных с сенсора DHT11 при помощи Arduino
- Что представляет собой DS18B20?
- Исходный код программы
- Как подключить DHT22 к Ардуино Уно
- Исходный код программы
- Общие принципы работы датчика температуры DS18B20
- Алгоритм работы программы термометра на ATmega и DS18B20
- Сборка метеостанции с дисплеем 1602 и DHT11
Использование
// Дефайны настроек (перед подключением библиотеки) #define DS_TEMP_TYPE [float / int] // Тип данных для температуры (точность / экономия flash) (По умолч. float) #define DS_CHECK_CRC [true / false] // Проверка подлинности принятых данных (По умолч. true) #define DS_CRC_USE_TABLE [true / false] // Использовать таблицу для CRC. Быстрее, но +256 байт flash (<1мкс VS ~6мкс) (По умолч. false) // Методы void setAddress(uint8_t *addr); // установить (сменить) адрес void setResolution(uint8_t resolution); // Установить разрешение термометра 9-12 бит void readAddress(uint8_t *addressArray); // Прочитать уникальный адрес термометра в массив void requestTemp(void); // Запросить новое преобразование температуры uint16_t getRaw(void) // Прочитать "сырое" значение температуры [int/float] getTemp(void); // Прочитать значение температуры [int/float] calcRaw(uint16_t data); // Преобразовать "сырое" значение в температуру [int/float] - настраивается дефайном. По умолчанию float // внешние функции int DS_rawToInt(uint16_t data); // преобразовать raw данные в температуру int float DS_rawToFloat(uint16_t data); // преобразовать raw данные в температуру float // Время преобразования от точности точность | время 12 бит | 750 мс 11 бит | 375 мс 10 бит | 187 мс 9 бит | 93 мс
Принципы ШИМ модуляции
Наша конструкция будет состоять из трех частей. В первой части будет измеряться температура с помощью датчика температуры и влажности DHT11. Вторая часть будет считывать значение температуры с выходного контакта DHT11, преобразовывать ее в температуру по шкале Цельсия и управлять скоростью вращения вентилятора постоянного тока с помощью ШИМ. А третья часть проекта будет показывать значение температуры и скорости вращения вентилятора на ЖК дисплее.
В этом проекте мы использовали датчик DHT11, который подробно описан в статье про измерение температуры и влажности с помощью Arduino. Но в этом проекте мы этот датчик будем использовать только для измерения температуры.
Принцип функционирования проекта достаточно прост. Мы будем создавать сигнал ШИМ модуляции на соответствующем контакте ШИМ платы Arduino, который будем подавать на базу транзистора. В соответствии с этим управляющим напряжением транзистор будет изменять значение напряжения на своем выходе, с которого и подается управляющее напряжение на вентилятор.
Пример ШИМ модуляции на цифровом осциллографе представлен на следующем рисунке.
Скорость вращения вентилятора и соответствующие ей значения ШИМ и ее коэффициента заполнения представлены в следующей таблице.
Температура | Цикл занятости ШИМ | Значение, передаваемое в функцию управления ШИМ в Arduino | Скорость вращения вентилятора |
менее 26 | 0% | выключен | |
26 | 20% | 51 | 20% |
27 | 40% | 102 | 40% |
28 | 60% | 153 | 60% |
29 | 80% | 204 | 80% |
больше 29 | 100% | 255 | 100% |
Что такое ШИМ? Простыми словами это такая технология, с помощью которой мы можем управлять напряжением или мощностью. К примеру, мы подаем на электродвигатель напряжение 5 Вольт, которое будет заставлять его вращаться с некоторой скоростью. Если после этого мы снизим подаваемое напряжение на 2 Вольта (т. е. до 3 Вольт), то скорость вращения электродвигателя также уменьшится. Более подробно об использовании ШИМ можно прочитать в следующей статье: управлению яркостью свечения светодиода с помощью ШИМ.
Основная идея ШИМ состоит в использовании цифровых импульсов с определенным коэффициентом заполнения (циклом занятости), который и будет отвечать за скорость вращения вентилятора.
К примеру, мы будем использовать ШИМ с коэффициентом заполнения 50% — это будет означать что на управляемое устройство мы будем подавать половину максимального напряжения импульса.
Формула для расчета коэффициента заполнения будет выглядеть следующим образом:
Duty Cycle= Ton/T
где T – общее время импульса Ton+Toff (сумма его активного и пассивного состояния)
Ton – время активного состояния импульса (означает 1 )
Toff – время пассивного состояния импульса (означает 0)
Более наглядно это представлено на следующих рисунках.
Примеры работы для Arduino
Один датчик
Рассмотрим простой пример — подключения одного датчика.
Сенсор подключается к управляющей плате через один сигнальный пин.
При подключении к Arduino в компактном формфакторе, например Arduino Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.
Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.
При коммуникации сенсора со стандартными платами Arduino формата Rev3, Arduino Uno или Iskra Neo, используйте Troyka Slot Shield совместно с модулем подтяжки.
Код программы
Выведем температуру сенсора в Serial-порт.
- simple.ino
-
// библиотека для работы с протоколом 1-Wire #include <OneWire.h> // библиотека для работы с датчиком DS18B20 #include <DallasTemperature.h> // сигнальный провод датчика #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(); // выводим температуру в Serial-порт Serial.print("Temp C: "); Serial.println(temperature); // ждём одну секунду delay(1000); }
Серия датчиков
Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.
Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.
Код программы
Просканируем все устройства на шине и выведем температуру каждого сенсора отдельно в Serial-порт.
- multipleSensors.ino
-
// библиотека для работы с протоколом 1-Wire #include <OneWire.h> // библиотека для работы с датчиком DS18B20 #include <DallasTemperature.h> // сигнальный провод датчика #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 = ; i < 8; i++){ if (deviceAddressi < 16) Serial.print("0"); Serial.print(deviceAddressi, HEX); } } void setup(){ // инициализируем работу Serial-порта Serial.begin(9600); // ожидаем открытия Serial-порта while(!Serial); // начинаем работу с датчиком sensors.begin(); // выполняем поиск устройств на шине countSensors = sensors.getDeviceCount(); Serial.print("Found sensors: "); Serial.println(countSensors); // выделяем память в динамическом массиве под количество обнаруженных сенсоров sensorsUnique = new DeviceAddresscountSensors; // определяем в каком режиме питания подключены сенсоры if (sensors.isParasitePowerMode()) { Serial.println("Mode power is Parasite"); } else { Serial.println("Mode power is Normal"); } // делаем запрос на получение адресов датчиков for (int i = ; i < countSensors; i++) { sensors.getAddress(sensorsUniquei, i); } // выводим полученные адреса for (int i = ; i < countSensors; i++) { Serial.print("Device "); Serial.print(i); Serial.print(" Address: "); printAddress(sensorsUniquei); Serial.println(); } Serial.println(); // устанавливаем разрешение всех датчиков в 12 бит for (int i = ; i < countSensors; i++) { sensors.setResolution(sensorsUniquei, 12); } } void loop(){ // переменная для хранения температуры float temperature10; // отправляем запрос на измерение температуры всех сенсоров sensors.requestTemperatures(); // считываем данные из регистра каждого датчика по очереди for (int i = ; i < countSensors; i++) { temperaturei = sensors.getTempCByIndex(i); } // выводим температуру в Serial-порт по каждому датчику for (int i = ; i < countSensors; i++) { Serial.print("Device "); Serial.print(i); Serial.print(" Temp C: "); Serial.print(temperaturei); Serial.println(); } Serial.println(); // ждём одну секунду delay(1000); }
Подключение DS18B20 к Arduino
DS18B20 является цифровым датчиком. Цифровые датчики передают значение измеряемой температуры в виде определенного двоичного кода, который поступает на цифровые или аналоговые пины ардуино и затем декодируется. Коды могут быть самыми разными, ds18b20 работает по протоколу данных 1-Wire. Мы не будем вдаваться в подробности этого цифрового протокола, укажем лишь необходимый минимум для понимания принципов взаимодействия.
Обмен информацией в 1-Wire происходит благодаря следующим операциям:
- Инициализация – определение последовательности сигналов, с которых начинается измерение и другие операции. Ведущее устройство подает импульс сброса, после этого датчик должен подать импульс присутствия, сообщающий о готовности к выполнению операции.
- Запись данных – происходит передача байта данных в датчик.
- Чтение данных – происходит прием байта из датчика.
Для работы с датчиком нам понадобится программное обеспечение:
- Arduino IDE;
- Библиотека OneWire, если используется несколько датчиков на шине, можно использовать библиотеку DallasTemperature. Она будет работать поверх OneWire.
Из оборудования понадобятся:
- Один или несколько датчиков DS18B20;
- Микроконтроллер Ардуино;
- Коннекторы;
- Резистор на 4,7 кОм (в случае подключения одного датчика пойдет резистор номиналом от 4 до 10K);
- Монтажная плата;
- USB-кабель для подключения к компьютеру.
К плате Ардуино UNO датчик подключается просто: GND с термодатчика присоединяется к GND Ардуино, Vdd подключается к 5V, Data – к любому цифровому пину.
Простейшая схема подключения цифрового датчика DS18B20 представлена на рисунке.
В режиме паразитного питания контакт Vdd с датчика подключается к GND на Ардуино – в этом случае пригодятся только два провода. Работу в паразитном режиме лучше не использовать без необходимости, так как могут ухудшиться быстродействие и стабильность.
Способ 2: чтение датчика DS18B20 по адресу
Мы знаем, что каждому DS18B20 назначен уникальный 64-битный адрес, чтобы отличать их друг от друга. В этом методе мы найдем этот адрес для соответствующей маркировки каждого датчика. Затем этот адрес можно использовать для считывания каждого датчика в отдельности.
Поиск адресов датчиков DS18B20s на шине
Следующий скетч обнаруживает все DS18B20, присутствующие на шине, и печатает их адреса на 1-Wire в монитор последовательного порта.
Вы можете подключать только один датчик за раз, чтобы определить его адрес (или последовательно добавлять по одному новому датчику, чтобы вы могли идентифицировать каждый из них по его адресу). Затем вы можете пометить каждый датчик.
Теперь откройте монитор последовательного порта. Вы должны получить что-то подобное:
Рисунок 6 – Нахождение адресов 1-Wire всех датчиков DS18B20 на шине
Скопируйте все адреса, так как они нам понадобятся в следующем скетче.
Чтение показаний датчиков DS18B20 по адресу
Следующий скетч считывает температуру датчиков DS18B20 по их адресам. Прежде чем приступить к загрузке скетча, вам нужно изменить адреса датчиков DS18B20 на те, которые вы определили в предыдущем скетче.
Вывод вышеприведенного эскиза выглядит так
Рисунок 7 – Вывод показаний нескольких датчиков DS18B20 методом адреса
Объяснение кода
Как обычно, скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки .
Далее мы вводим адреса, которые были найдены ранее для каждого датчика температуры. В нашем случае имеем следующее.
Во фрагменте настройки мы инициализируем библиотеку путем вызова функции и инициализируем последовательную связь с ПК.
В цикле мы просто посылаем команду всем датчикам для преобразования температуры, используя функцию .
Затем, чтобы напечатать температуру датчика, мы вызываем пользовательскую функцию , для которой передается в качестве параметра.
Вышеприведенная функция просто вызывает библиотечные функции для отображения температуры в градусах Цельсия и для отображения температуры в градусах Фаренгейта.
3Считывание данных с сенсора DHT11 при помощи Arduino
Давайте пойдём таким путём: скачаем библиотеку для датчика DHT11 (также приложил её в конце статьи, т.к. у обновлённой библиотеки изменились вызываемые функции), установим её стандартным способом (распаковав в директорию \libraries\ среды разработки для Arduino).
Напишем вот такой простенький скетч. Он будет выводить в последовательный порт компьютера каждые 2 секунды сообщения об относительной влажности и температуре, считанные с датчика DHT11.
#include <dht11.h> // подключаем библиотеку dht11 sensor; // инициализация экземпляра датчика #define DHT11PIN 8 // вывод 8 будет шиной DATA void setup() { Serial.begin(9600); } void loop() { int chk = sensor.read(DHT11PIN); Serial.print("h="); Serial.print(sensor.humidity); Serial.print("%\t"); Serial.print("t="); Serial.print(sensor.temperature); Serial.println("C"); delay(2000); }
Загрузим этот скетч в Arduino. Подключимся к Arduino с помощью монитора COM-порта и увидим следующее:
Данные о температуре и влажности, полученные с датчика DHT11
Видно, что данные и о влажности, и о температуре считываются и выводятся в терминалку.
Что представляет собой DS18B20?
Dallas DS18B20 – это цифровой датчик измерения температуры, оснащенный микроконтроллером, способный запоминать изменения в памяти, оповещать о нарушении температурных рамок(которые можно регулировать), изменять точность замеров, взаимодействовать с основным контроллером Arduino. DS18B20 выполнен в миниатюрном корпусе, в трех различных модификациях, одна из которых позволяет измерять температуры в жидкостях.
Датчик подключается через 3 выхода:
- Первый – питание VDD (красный).
- Второй – данные DQ (желтый или другой цвет).
- Третий – земля GND (черный).
Из-за возможности реализации схемы с фантомным питанием, можно подключить датчик через два провода: DQ и VDD. Но по-хорошему, лучше подобного подключения избегать. Также, к основной плате Arduino можно подключить на один пин выходы DQ с двух сенсоров.
Виды датчика:
- 8-Pin SO (150 mils) — DS18B20Z+
- 8-Pin µSOP — DS18B20U+
- 3-Pin TO-92 — DS18B20+
Третий можно использовать без дополнительных средств защиты для измерения температур в морозильной камере, бойлере, инкубаторе, бассейне и в других областях применения.
На рисунке изображен даллас DS18B20+ в герметичном корпусе
Характеристики:
- Диапазон измерения температур -55 °С до +125 °С.
- Погрешность максимум 0,5 °C, без дополнительной калибровки при t от -10 °С до +85° С).
- Питание 3,3-5 В.
- Для соединения с Arduino UNO необходимо 3 контакта.
- К одной линии связи доступно подключение вплоть до ста двадцати семи датчиков, потому как датчик содержит собственный 64-битный код в постоянной памяти.
- Каждый датчик имеет персонализированный серийный номер.
- Протокол 1-Wire используется для передачи информации.
- Доступно подключение через два провода напрямую к линии связи по схеме фантомного питания. Но такой режим не рекомендуется использовать при температурах от 100° С, так как нет гарантий правильных замеров в таких условиях.
- Два вида памяти — статическая память с произвольным доступом или полупроводниковая оперативная память (SRAM) и энергонезависимая память EEPROM.
- В EEPROM записываются два однобайтовых регистра контроля TH, TL, по которым можно верхний и нижний предел диапазона температур.
Применение
DS18B20 замеряет температуру и передает данные в цифровом виде. При этом, можно настроить нужно разрешение, выставив количество бит точности, тем самым подогнав под определенный параметр разрешающую способность:
- 9 бит – 0,5С;
- 10 бит — 0,25С;
- 11 бит — 0,125С;
- 12 бит — 0,0625С.
Порядок работы датчика:
- При подключении источника питания, DS18B20 будет находится в начальном состоянии.
- Затем, подается команда «преобразование температуры» на Arduino UNO для замера t.
- Результат, полученный от датчика, сохранит свое значение в двух байтах регистра t, а сам элемент схемы вернется с начальное состояние.
- При работе схемы через внешнее питание, микроконтроллер регулирует состояние конвертации.
- При выполнении команды линия находится в низком состоянии, а закончив – переходит в высокое.
Это работает со стандартной схемой подключения, так как на шину должен постоянно поступать высокий уровень сигнала. Поэтому, при соединении по схеме паразитного питания выше описанный метод не сработает.
В оперативную память сохраняются:
- 1-2 байты – данные измеряемой температуры;
- 3-4 байты – пределы изменения t;
- 5-6 байты – резерв;
- 7-8 байты – нужны для точных замеров t;
- 9 байт — циклический избыточный код, устойчивый к помехам;
Исходный код программы
Чтобы написать код программы для нашего цифрового термометра, мы должны написать код для Arduino, датчика температуры LM35 и ЖК дисплея 16×2. Сначала подключим библиотеку для ЖК дисплея, а затем определим контакты данных и управления для подключения ЖК дисплея и датчика температуры.
После получения аналогового значения напряжения на аналоговом входе A0 мы считываем это значение и сохраняем его в переменной с помощью команды float analog_value=analogRead(analog_pin). После этого мы преобразуем его в цифровое значение температуры по следующей формуле:
float Temperature=analog_value*factor*100
где factor=5/1023, analog_value – аналоговое значение напряжение с выхода датчика температуры.
То есть получаем код вида:
Символ градуса формируем используя стандартный метод с помощью следующего кода:
Далее представлен полный исходный код программы нашего цифрового термометра.
Arduino
#include<LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
#define sensor A0
byte degree =
{
0b00011,
0b00011,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup()
{
lcd.begin(16,2);
lcd.createChar(1, degree);
lcd.setCursor(0,0);
lcd.print(» Digital «);
lcd.setCursor(0,1);
lcd.print(» Thermometer «);
delay(4000);
lcd.clear();
lcd.print(» Circuit Digest «);
delay(4000);
lcd.clear();
}
void loop()
{
/*———Temperature——-*/
float reading=analogRead(sensor);
float temperature=reading*(5.0/1023.0)*100;
delay(10);
/*——Display Result——*/
lcd.clear();
lcd.setCursor(2,0);
lcd.print(«Temperature»);
lcd.setCursor(4,1);
lcd.print(temperature);
lcd.write(1);
lcd.print(«C»);
delay(1000);
}
1 |
#include<LiquidCrystal.h> LiquidCrystallcd(7,6,5,4,3,2); #define sensor A0 bytedegree8= { 0b00011, 0b00011, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; voidsetup() { lcd.begin(16,2); lcd.createChar(1,degree); lcd.setCursor(,); lcd.print(» Digital «); lcd.setCursor(,1); lcd.print(» Thermometer «); delay(4000); lcd.clear(); lcd.print(» Circuit Digest «); delay(4000); lcd.clear(); } voidloop() { /*———Temperature——-*/ floatreading=analogRead(sensor); floattemperature=reading*(5.01023.0)*100; delay(10); /*——Display Result——*/ lcd.clear(); lcd.setCursor(2,); lcd.print(«Temperature»); lcd.setCursor(4,1); lcd.print(temperature); lcd.write(1); lcd.print(«C»); delay(1000); } |
Как подключить DHT22 к Ардуино Уно
Обратите внимание, что распиновка модулей у разных производителей может отличаться. При неправильном подключении питания, сенсор может выйти из строя
Дисплей подключается к шине i2c, расположенной на пинах SDA (A4) и SCL (A5) платы Ардуино Уно и Нано. При работе с платой Ардуино Мега подключение дисплея производится к интерфейсу i2c на пинах SDA (20) и SCL (21).
Схема подключения DHT22 и LCD 1602 к Ардуино
Схема подключения DHT22 к плате ничем не отличается от предыдущего примера, а сама программа отличается только одной строчкой, где мы указываем тип датчика — DHT22, вместо DHT11. После того, как вы собрали схему с дисплеем и DHT22, как показано на картинке выше, — загрузите следующий пример простой программы с универсальной библиотекой DHT.h, которая подходит для этих двух модулей.
Скетч. Подключение к Ардуино DHT22 и вывод на LCD 1602 i2c
#include <Wire.h> // библиотека для протокола I2C #include <LiquidCrystal_I2C.h> // подключаем библиотеку для LCD 1602 #include <DHT.h> // подключаем библиотеку для датчика LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя LCD для дисплея DHT dht(2, DHT22); // сообщаем к какому порту подключен DHT22 void setup() { LCD.init(); // инициализация LCD дисплея LCD.backlight(); // включение подсветки дисплея dht.begin(); // запускаем датчик DHT22 } void loop() { // считываем температуру (t) и влажность (h) float h = dht.readHumidity(); float t = dht.readTemperature(); // выводим температуру (t) и влажность (h) на жк дисплей LCD.setCursor(0,0); LCD.print("Humidity: "); LCD.print(h); LCD.setCursor(0,1); LCD.print("Temperature: "); LCD.print(t); delay(1000); LCD.clear(); }
Пояснения к коду:
- при необходимости получать значения температуры и влажности без знаков после запятой — используйте тип данных int, вместо float.
Заключение. Мы рассмотрели в этом обзоре, как подключить DHT11 и DHT22 к Arduino. Представили несколько примеров программ для вывода информации с цифрового датчика на аппаратный монитор порта Arduino IDE и дисплей 1602. С датчиком DHT11 существует множество проектов метеостанций на Ардуино, которые вы сможете сделать самостоятельно, внимательно изучив информацию на этой странице.
Исходный код программы
В начале программы подключим библиотеки, необходимые для работы с датчиком DHT11 и ЖК дисплеем.
Когда вы скачаете эту библиотеку, добавьте ее в вашу Arduino IDE с помощью инструкции вида (или с помощью аналогичного пункта меню в Arduino IDE):
Затем определим контакты к которым подключен ЖК дисплей и датчик DHT и инициализируем их все в секции setup программы (скетча). Затем в секции loop мы с помощью функции dht считываем данные с датчика DHT и затем используем ряд dht функций чтобы извлечь из этих данных температуру и влажность и отобразить их на ЖК дисплее.
Символ градуса на экране ЖК дисплея будет формироваться, используя известное отображение его в виде символа.
Далее приведен полный текст программы.
Arduino
#include<dht.h> // подключаем библиотеку для использования dht функций
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // номера контактов, к которым подключен ЖК дисплей
#define dht_dpin 12
dht DHT;
byte degree =
{
0b00011,
0b00011,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup()
{
lcd.begin(16, 2);
lcd.createChar(1, degree);
lcd.clear();
lcd.print(» Humidity «);
lcd.setCursor(0,1);
lcd.print(» Measurement «);
delay(2000);
lcd.clear();
lcd.print(«Circuit Digest «);
delay(2000);
}
void loop()
{
DHT.read11(dht_dpin); //считываем данные с контакта, к которому подключен датчик DHT11
lcd.setCursor(0,0);
lcd.print(«Humidity: «);
lcd.print(DHT.humidity); // отображаем значение влажности на экране ЖК дисплея
lcd.print(» %»);
lcd.setCursor(0,1);
lcd.print(«Temperature:»);
lcd.print(DHT.temperature); // отображаем значение температуры на экране ЖК дисплея
lcd.write(1);
lcd.print(«C»);
delay(500);
}
1 |
#include<dht.h> // подключаем библиотеку для использования dht функций LiquidCrystallcd(2,3,4,5,6,7);// номера контактов, к которым подключен ЖК дисплей #define dht_dpin 12 dhtDHT; bytedegree8= { 0b00011, 0b00011, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; voidsetup() { lcd.begin(16,2); lcd.createChar(1,degree); lcd.clear(); lcd.print(» Humidity «); lcd.setCursor(,1); lcd.print(» Measurement «); delay(2000); lcd.clear(); lcd.print(«Circuit Digest «); delay(2000); } voidloop() { DHT.read11(dht_dpin);//считываем данные с контакта, к которому подключен датчик DHT11 lcd.setCursor(,); lcd.print(«Humidity: «); lcd.print(DHT.humidity);// отображаем значение влажности на экране ЖК дисплея lcd.print(» %»); lcd.setCursor(,1); lcd.print(«Temperature:»); lcd.print(DHT.temperature);// отображаем значение температуры на экране ЖК дисплея lcd.write(1); lcd.print(«C»); delay(500); } |
Общие принципы работы датчика температуры DS18B20
DS18B20 представляет собой однопроводный цифровой датчик температуры от компании Maxim IC. Выдает значение температуры в градусах Цельсия, способен измерять температуру с 9-12 битной точностью в диапазоне от -55 до 125 градусов Цельсия с точностью +/-0.5 градуса. Каждый датчик DS18B20 имеет 64-битный уникальный номер (Serial number), вытравленный на корпусе датчика, что позволяет подключать огромное число подобных датчиков к одной шине данных. С помощью данного датчика можно измерять температуру воздуха, жидкостей и земли. В некоторых магазинах датчик продается в комплекте с резистором сопротивлением 4,7 кОм.
Особенности датчика DS18B20:
- однопроводный интерфейс (1-Wire interface), что позволяет использовать для подключения датчика только один контакт микроконтроллера (в нашем случае платы Arduino Uno);
- каждый датчик имеет 64-битный уникальный последовательный код (номер), хранящийся в ПЗУ (ROM) датчика;
- способность подключения к одной шине множества датчиков позволяет создавать на его основе приложения для распределенного (в пространстве) измерения температуры;
- не требует никаких внешних компонентов;
- может быть запитан от линии данных;
- поддерживает напряжение питания от 3.0V до 5.5V;
- способен измерять температуру в диапазоне от –55°C до +125°C (–67°F до +257°F) с точностью ±0.5°C (в диапазоне от –10°C до +85°C);
- можно выбрать разрешающую способность (разрешение) датчика: от 9 до 12 бит;
- преобразует значение температуры в 12-битное цифровое слово длительностью 750 мс (max.);
- можно настраивать энергонезависимую (nonvolatile, NV) сигнализацию (сигнал тревоги);
- опции сигнала тревоги позволяют идентифицировать и определить адрес датчика, чья температура не соответствует запрограммированным границам;
- может применяться в устройствах термоконтроля, промышленных системах, потребительских продуктах, термометрах и в любых других системах, где требуется измерение температуры.
Более подробную информацию о принципах работы датчика DS18B20 вы можете посмотреть в следующей статье на нашем сайте.
Алгоритм работы программы термометра на ATmega и DS18B20
Все установки микроконтроллера заводские, FUSE-биты трогать не надо.
Для работы программы задействовано два таймера/счетчика микроконтроллера:- восьмиразрядный Т0- шестнадцатиразрядный Т1
С помощью восьмиразрядного таймера Т0 настроенного на вызов прерывания по переполнению, с внутренней частотой СК/8 (период 2 миллисекунды) организован:- расчет текущей температуры- динамический вывод результатов измерения температуры датчиком DS18B20
С помощью шестнадцатиразрядного таймера Т1 настроенного на вызов прерывания по переполнению, с внутренней частотой СК/64 (период 4 секунды) организованно:- подача команды датчику DS18B20 на измерение температуры- считывание измеренной температуры с датчика
В принципе, можно задействовать и один восьмиразрядный таймер/счетчик, также настроенный на вызов прерывания по переполнению, с внутренней частотой СК/8, и всю работу схемы организовать в процессе обработки прерывания. Но дело в том, что смысла в этом нет — датчику DS18B20 необходимо чуть меньше 1 секунды (при 12-ти битном разрешении) для конвертирования (определения) температуры, т.е., чаще чем 1 раз в секунду мы не сможем обновлять данные температуры. Кроме того, столь частое обновление температуры приведет к нагреву датчика и, соответственно, к искажению реальных данных. Использование второго счетчика позволяет отдельно задавать промежутки времени измерения температуры.
Вот так выглядит основная часть программы в Algorithm Builder:
Где:
— SP — настройка начального адреса стека
— Timer 0 — настройка таймера T0:
— Timer 1 — настройка таймера Т1:
— TIMSK — настройка прерываний от таймеров:
— Init_Display — подпрограмма настройки разрядов портов, участвующих в динамической индикации вывода данных на трехразрядный семисегментный индикатор
— 1 —> I — глобальное разрешение прерываний
— далее программа уходит в бесконечный цикл, и вся работа программы происходит при вызове прерываний от таймеров.
Если возникнут вопросы, если что-то изложено не понятно или есть вопросы по программе, пишите — отвечу.
Программа термометра в HEX файле (2,4 KiB, 7 712 hits)
Программа термометра в Algorithm Builder (7,1 KiB, 5 472 hits)
Второй вариант программы, без 4-х секундной задержки измерения температуры. Температура измеряется непрерывно (интервал менее 1 секунды)
Термометр 2 — HEX файл (2,4 KiB, 4 486 hits)
Термометр 2 в AlgorithmBuilder (11,1 KiB, 4 219 hits)
Другие конструкции на микроконтроллерах1. Простые электронные часы на микроконтроллере ATyni26, с использование микросхемы часов реального времени DS13072. Двухканальный термометр на микроконтроллере ATmega8 и датчиках температуры DS18B203. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B204. Двухканальный термометр, термостат, терморегулятор с возможностью работы по времени, одноканальный таймер реального времени на ATmega8 и датчиках DS18B205. Двухканальный термометр, часы на ATmega8, датчиках температуры DS18B20, RTC DS1307, LCD 1602
Термометр на микроконтроллере ATmega8 и цифрового датчика температуры DS18B20Схема, программа очень простого термометра на микроконтроллере ATmega8 с использование датчика температуры DS18B20
Published by: Мир микроконтроллеров
Date Published: 05/07/2015
Сборка метеостанции с дисплеем 1602 и DHT11
Для этого проекта нам потребуется:
- плата Arduino UNO (NANO);
- жидкокристаллический дисплей 1602 с I2C;
- цифровой датчик DHT11 или DHT22;
- провода «папа-мама», «папа-папа»;
- макетная плата (при необходимости).
К Arduino Nano и Uno все датчики и дисплей подключаются по одной схеме — распиновка и подключение уже рассматривались на нашем сайте, поэтому не будем подробно останавливаться на этом моменте. Если у вас есть вопросы, то посмотрите следующие записи: Подключение DHT11 к Ардуино и Подключение LCD 1602 к Ардуино. Соберите метеостанцию на Ардуино с дисплеем 1602 и dht11, как на схеме ниже.