Датчик температуры и влажности. мет указ КР. Проектирование универсального датчика для измерения температуры, влажности и уровня воды
Скачать 2.78 Mb.
|
Задания для курсовой работы по дисциплине «Основы электроники и схемотехники» Тема: Проектирование универсального датчика для измерения температуры, влажности и уровня воды Заданные параметры
ВВЕДЕНИЕ Датчик температуры и влажности Использование датчиков в системах умного домаКонструктор Arduino предлагает возможность каждому создать свою собственную систему умного дома для конкретных задач. Универсальная плата с микроконтроллером Arduino UNO позволяет подключать и взаимодействовать с различными модулями. Пример этого показан в статье. Модуль влажности и температуры, способный измерять концентрацию пара в воздухе, теперь подключен к дисплею и отображает соответствующую информацию. Вы можете использовать другие сценарии работы: Отправьте информацию на удаленный сервер и прочтите ее через приложение со своего смартфона. Включите реле в цепи, которое включит вентилятор в вытяжке, если концентрация пара в ванной достигнет 85%. И выключите, когда замеры покажут норму. Или используйте умную розетку в цепи, которая включит кондиционер, чтобы нормализовать влажность в квартире. вы также можете использовать более сложные двигатели, такие как электрические приводы стеклоподъемников, чтобы они автоматически открывались для вентиляции, если концентрация влаги не соответствует норме. Использование датчика на ферме и на самой птицефабрике является неотъемлемой частью автоматизации. С помощью простой системы вы легко сможете проверить процессы в инкубаторе и скорректировать их в случае отклонения от нормы. Датчик уровня воды Контроль уровня воды в бакеСуществует большое количество типов баков, отличающихся областью применения, и при этом пригодных для хранения воды. В частных домах они применяются для хранения питьевой воды и воды для общих нужд; На участках с огородами, садами, а также в сельскохозяйственной промышленности устанавливаются для водоснабжения оросительных систем; В промышленности баки применяются для: отопительных систем (котлы), транспортировки воды (автоцистерны), хранения, фильтрации, водоподготовки, водоснабжения различных технологических процессов. Очень важно, чтобы эти ёмкости не пустовали и не переливались. Чтобы не допускать таких моментов, которые могут привести к аварийным ситуациям, устанавливают в баках сигнализаторы предельного уровня. Датчик нужно выбирать исходя из задачи и типа бака. Так, для одного и того же бака вы можете купить датчик уровня воды магнитного, поплавкового, кондуктивного, емкостного, оптического, вибрационного, ультразвукового или гидростатического принципа действия. Но для каждого процесса выбирается свой тип датчика. Подробнее o выборе датчика уровня воды для баков читайте в нашей статье: «Датчик уровня воды в баке». |
DHT22 лицевая сторона слева направо |
VCC |
SDA |
NC |
GND |
Вывод VCC подает питание на датчик. Хотя напряжение питания допускается в диапазоне от 3,3 до 5,5 В, рекомендуется питание 5 В. В случае питания 5 В датчик можно держать на расстоянии до 20 метров от источника питания. Однако при питании от источника питания 3,3 В длина кабеля не должна превышать 1 метр. В противном случае падение напряжения в сети приведет к ошибкам измерения.
Вывод данных используется для связи между датчиком и микроконтроллером.
NC не подключен
GND должен быть подключен к земле Arduino.
1.4 Температура
Ни для кого не секрет, что существуют определенные пределы комфортной температуры в помещении. Например, когда в помещении температура повышается до 25ºС и более, я чувствую себя не очень комфортно (слишком жарко), а если температура опускается ниже 18ºС, то мне становится холодно. Так вот в нашей автоматизированной системе при температуре 25ºС открывается окно для того, чтобы проветрить (охладить помещение). Вот так выглядит фрагмент программного кода, который отвечает за то, что будет происходить при повышении температуры до 25ºС:
Фрагмент 1
if (t > 25) {myservo.write} (45); |
В первой строчке фрагмента указано условие, где температура принимает значение больше 25ºС. Далее команда myservo.write (45); включает сервопривод, который в свою очередь открывает окно для проветривания. При температуре меньше 23ºС окно закрывается:
Фрагмент 2
if (t< 23) {myservo.write (0); delay(1000); myservo.detach} (); |
Команда myservo.write(0);запускает сервопривод, который устанавливает окно в нулевое положение, т.е. закрывает. Команда delay (1000); устанавливает задержку в 1 с. (1000 мс.) в течение которой происходит закрывание окна. Команда myservo.detach(); выключает сервопривод для экономии энергии.
Но бывает так, что при жаркой погоде температура в помещении уже достигла 25ºС и продолжает расти. И даже открытое окно уже не может должным образом охлаждать температуру в помещении. Так вот для такого случая предусмотрен вентилятор. Он включается, когда температура превысит 30ºС. Но для того, чтобы вентилятор включался только в том случае, когда выполняется условие, заданное в программе, пришлось соорудить самодельный переключатель, который состоит из n-p-nтранзистора, резистора на 10 кОм. Когда на базу транзистора через резистор поступает сигнал (1), то вентилятор включается.
Фрагмент 3
if (t > 30) {digitalWrite(VEN, HIGH)}; if (t < 26) {digitalWrite(VEN, LOW)}; |
В коде произошло объявление о подключении вентилятора к 5 пину Arduino:
int VEN = 5; pinMode(VEN, OUTPUT); |
Строчка digitalWrite (VEN, HIGH); обозначает, что когда на резистор приходит значение HIGH, т.е. 1, вентилятор включается. Соответственно при значении LOW, т.е. 0, вентилятор выключается.
Таким образом, при температуре в помещении выше 30ºС включается вентилятор, работа которого вместе с открытым для проветривания окном будет способствовать понижению температуры в помещении. Когда же температура наконец-то начнёт падать и достигнет значения меньше 26ºС, то вентилятор выключится.
Также бывают такие случаи, (чаще всего в частных домах) когда во время вашего отсутствия в доме может произойти по каким-либо причинам отключение отопительного газового котла. И до момента вашего возвращения домой помещение может значительно охладиться, тем более в зимнее время. Для того, чтобы избежать подобных неприятностей, мы предусмотрели автоматизированное информирование о произошедшем отключении системы отопления. Но обо всём поподробнее.
Итак, допустим, произошла остановка котла. Температура в доме начала стремительно падать и снизилась до значения меньше 15ºС.
В этот момент с Arduino на модуль реле приходит команда на включение. Модуль в свою очередь включает кнопку быстрого набора на сотовом телефоне, и происходит звонок со звуковым сообщением на телефон владельца дома, сообщающий, что дома выключилось отопление:
Фрагмент 4
const int REL = 8; pinMode(REL, OUTPUT); if (t < 15.0) {digitalWrite(REL, HIGH)}; |
Строчка digitalWrite(REL, HIGH); включает реле и включает звонок с телефона. Также информирование происходит и при температуре выше 45ºС, потому что это может говорить о том, что в доме случился пожар:
Фрагмент 5
if (t > 45) {digitalWrite(REL, HIGH)}; |
1.5 Влажность
Помимо допустимых температурных параметров можно говорить об оптимальных значениях влажности воздуха в жилом помещении. Норма влажности воздуха в помещении находится в пределах от 30% до 60%, а 45% - самое оптимальное значение уровня влажности. Итак, при влажности воздуха больше 60% окно открывается:
Фрагмент 6
if (h>= 60) {myservo.attach(SERVO); myservo.write(45)}; При влажности меньше 50% окно закрывается: |
Фрагмент 7
if (h < 50) {myservo.write(0); delay(50); myservo.detach()}; |
Но мы столкнулись со следующей проблемой. Человек находится в комнате, уровень влажности воздуха в которой достиг 60%, соответственно, при заданном условии окно должно открыться. Но находящийся в комнате человек при открытом окне может пострадать от возникшего сквозняка и в дальнейшем простудиться (например, если это холодное время года).
Поэтому мы добавили в наш прототип инфракрасный датчик, который распознает присутствие человека в комнате. То есть, если в помещении находится человек, то окно не открывается. Как только человек уходит (т.е. датчик не наблюдает движения) окно сразу же открывается:
Фрагмент 8
const int DVI = 10; pinMode(DVI, INPUT); val = digitalRead(DVI); if (val == HIGH && h > 60) {digitalWrite(LED, LOW); myservo.write(0); delay(1000); myservo.detach(); lcd.setCursor(14, 1); lcd.print("WC"); Serial.println("Motion!")}; else {digitalWrite(LED, HIGH); myservo.attach(SERVO); myservo.write(45); lcd.setCursor(14, 1); lcd.print("WO"); Serial.println("No motion!")}; |
Датчик уровня воды
Arduino Датчик уровня воды предназначен для определения уровня воды в различных емкостях, где недоступен визуальный контроль, с целью предупреждения перенаполнения емкости водой через критическую отметку.
Конструкции датчиков уровня воды могут быть различными – поплавковые, погруженные, врезные. Данный датчик воды – погруженный. Чем больше погружение датчика в воду, тем меньше сопротивление между двумя соседними проводами. Датчик имеет три контакта для подключения к контроллеру.
+ – питание датчика;
- – земля;
S - аналоговое значение.
На вывод S подается аналоговое значение, которое можно передавать в контроллер для дальнейшей обработки, анализа и принятия решений. Датчик имеет красный светодиод, сигнализирующих о наличие поступающего на датчик питания.
2.1 Технические характеристики модуля
Напряжение питания: 3.3-5 В;
Ток потребления 20 мА;
Выход: аналоговый;
Зона обнаружения: 16×30 мм;
Размеры: 62×20×8 мм;
Рабочая температура: 10 – 30 °С.
№ контакта | Название контакта | Назначение контакта |
1 | 5V | Напряжение питания |
2 | Trig | Входной контакт датчика. На него необходимо подать импульс длительностью 10 мкс чтобы запустить датчик в работу (чтобы он начал излучение ультразвуковой волны). |
3 | Echo | Выходной контакт датчика. После приема отраженной от препятствия ультразвуковой волны на этом контакте формируется импульс высокого уровня (high), длительность которого равна времени распространения ультразвуковой волны до препятствия и обратно. |
4 | Gnd | Общий провод (земля) |
3.0 Код программы:
#include #include #include LiquidCrystal_I2C LCD(0x27, 16, 2); DHT dht(13, DHT22); int water; void setup() { LCD.init(); LCD.backlight(); dht.begin(); pinMode(13, OUTPUT); pinMode(A8, INPUT); Serial.begin(9600); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); water = analogRead(A8); if (water > 100) { digitalWrite(12, HIGH); } if (water < 100) { digitalWrite(12, LOW); } Serial.println(water); LCD.setCursor(0, 1); LCD.print("Humidity |"); LCD.print(h); LCD.setCursor(0, 0); LCD.print("Temperatur|"); LCD.print(t); } |
ЗАКЛЮЧЕНИЕ
Проведя опыты со сделанной моделью, мы убедились, что данный макет позволяет нам сократить количество каждодневных однообразных манипуляций в доме. Благодаря применению микроконтроллера Arduino макет получился полностью работоспособным (несмотря на огромное количество датчиков) и интересным в изготовлении и изучении, так как микроконтроллеры Arduino очень хороши для начального внедрения в мир микроэлектроники.
ПРИЛОЖЕНИЕ
Прочие датчики
В нашем прототипе присутствует датчик огня, который при обнаружении возгорания информирует человека пронзительным звуковым сигналом и информирует звонком на сотовый телефон:
Фрагмент 9
if (!digitalRead(FLAME)) {digitalWrite(BUZ, LOW); digitalWrite(REL, LOW)}; else {digitalWrite(BUZ, HIGH)}; |
Также в нашем прототипе присутствует датчик газа, который реагирует помимо паров газа на пары этилового спирта. Когда датчик улавливает пары этилового спирта или газа, он отправляет звуковой сигнал на телефон владельца:
Фрагмент 10
if (digitalRead(GAS) == HIGH) {digitalWrite(REL, HIGH)}; Код программы: #include #include #include #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 #include "Servo.h" const int SERVO = 9; const int DVI = 10; const int REL = 8; const int FLAME = 3; const int BUZ = 7; int LED = 12; int val = 0; int angle = 1; int VEN = 5; const int GAS = 11; DHT dht(DHTPIN, DHTTYPE); Adafruit_BMP085 bmp; LiquidCrystal_I2C lcd(0x27, 16, 2); byte degree[8] = { B00110, B01001, B01001, B00110, B00000, B00000, B00000, B00000, }; Servo myservo; void setup() { myservo.attach(SERVO); Serial.begin(9600); dht.begin(); lcd.begin(); lcd.backlight(); pinMode(VEN, OUTPUT); pinMode(DVI, INPUT); pinMode(LED, OUTPUT); pinMode(REL, OUTPUT); pinMode(FLAME, INPUT); pinMode(BUZ, OUTPUT); myservo.write(0); if (!bmp.begin()) { Serial.println("Could not find a valid BMP085 sensor, check wiring!"); while (1) {} } } void loop() { val = digitalRead(DVI); // считывание состояния датчика lcd.createChar(0, degree); float h = dht.readHumidity(); float t = bmp.readTemperature(); int p = (bmp.readPressure()/133.3); lcd.setCursor(0, 1); lcd.print("Temp: "); lcd.setCursor(5, 1); lcd.print(t); lcd.setCursor(10, 1); lcd.write((byte) 0); lcd.setCursor(11, 1); lcd.print("C"); lcd.setCursor(11, 0); lcd.print("H:"); lcd.setCursor(13, 0); lcd.print(h); lcd.setCursor(15, 0); lcd.print("%"); lcd.setCursor(0, 0); lcd.print("At.P: "); lcd.setCursor(5, 0); lcd.print(p); lcd.setCursor(8, 0); lcd.print("mm"); //Условия по открытию окна// if (h < 44) { myservo.write(0); delay(50); myservo.detach(); } if (h == 23.0) { myservo.attach(SERVO); } if (h >= 23.1 && h < 55 && val == LOW) { myservo.detach(); } if (h >= 45) { myservo.attach(SERVO); myservo.write(45); } //Температура// if (t < 15.0){ digitalWrite(REL, HIGH); } if (t > 45){ digitalWrite(REL, HIGH); } if (t > 25){ myservo.write(45); } if (t < 23){ myservo.write(0); delay(1000); myservo.detach(); } if (t > 30){ digitalWrite(VEN, HIGH); } if (t < 26){ digitalWrite(VEN, LOW); } //Считывание с датчика движения// if (val == HIGH){ digitalWrite(LED, LOW); myservo.write(0); delay(1000); myservo.detach(); //delay(300000); lcd.setCursor(14, 1); lcd.print("WC"); Serial.println("Motion!"); } else { digitalWrite(LED, HIGH); myservo.attach(SERVO); myservo.write(45); lcd.setCursor(14, 1); lcd.print("WO"); Serial.println("No motion!"); } if (t > 30){ myservo.attach(SERVO); myservo.write(angle); myservo.write(45); } //ДатчикГАЗА// if (digitalRead(GAS) == HIGH){ digitalWrite(REL, HIGH); } //ДатчикОгня// if (!digitalRead(FLAME)){ digitalWrite(BUZ, LOW); //digitalWrite(REL, LOW); } else{ digitalWrite(BUZ, HIGH); } } |
Графическая часть
ПРИЛОЖЕНИЕ А. структурную схему:
ПРИЛОЖЕНИЕ В. схематический план:
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. Блум Дж. Изучаем Arduino: инструменты и методы технического волшебства. Пер. с англ. – СПб.: БХВ-Петербург, 2015 г. – 336 с.: ил.
2. Кравченко А.В. “10 практических устройств на AVR -микроконтроллерах”. Книга 3. – “МК-Пресс”, СПб.: “КОРОНА - ВЕК”, 2011. – 416 с.
3. Гололобов В.Н. «Умный дом» своими руками / В.Н. Гололобов. – М.:НТ Пресс, 2007. – 416 с.: ил.- (В помощь радиолюбителю)
4. Петин В.А. Проекты с использованием контроллера Arduino. – СПб.: БХВ-Петербург, 2014. – 400 с.: ил. – (Электроника)
5. Соммер У. Программирование микроконтроллерных плат Arduino/Freeduino. – СПб.: БХВ-Петербург, 2012. – 256 с.: ил. – (Электроника)
Обзор датчика температуры и влажности DHT22 – RobotChip
Метеостанция на Arduino от А до Я. Часть 4 / Хабр (habr.com)
Ардуино DHT11 и DHT22: обзор, схема, подключение датчиков (arduinoplus.ru)
Датчик уровня воды: описание, подключение, схема, характеристики | ВИКИ (3d-diy.ru)
Измерение уровня воды с помощью Arduino и датчика JSN SR-04T: схема и программа (microkontroller.ru)
Ф.05.3-34 Издание 6