Начало пути
Одним солнечным деньком, придя в универ, я узнал, что в этом семестре у меня курсовой по схемотехнике. Преподаватель предлагал сделать только пояснительную записку «как реализовать проект» или же познать темную сторону инженерии и создать реальное устройство. А так, как я был уже на 4ом курсе, и вспомнив, что единственный раз когда я применял на практике свои навыки инженера был на первом курсе (прикрутил к стене книжную полку), я решил «поработать ручками». После недолгих размышлений, мною была выбрана тема «Система управления микроклиматом теплицы». Скорее всего на выбор повлияла моя любовь к автоматизации процессов, или же то, что я и сам занимался разведением огурцов в теплицах. Но не будем долго тянуть — начинаем.
Поиски материалов
От друзей и преподавателя услышал о платформе Arduino. Немного почитав про ардуинку и посмотрев пару реализованных проектов, желание создать что-нибудь свое стало еще больше. Для реализации проекта решил использовать Arduino Nano v3. Оригинал стоил чуть больше 20$, за копию отдал 10. Конечно дешевле было бы заказать на Aliexpress, но у меня не было ни времени, ни желания ждать целый месяц — хотелось начать немедленно.
C платой микроконтроллера определился и самое время решить, какие мне нужны датчики. Немного поразмышляв, решил в первый раз не делать что-то масштабное (как я люблю говорить «краткость — сестра таланта») и ограничиться тремя основными составляющими микроклимата теплицы — температура, освещенность и влажность почвы. Разберем все по порядку:
-
Датчик температуры
Немного погуглив, решил остановиться на датчике DHT11. И как оказалось в нем помимо измерения температуры есть еще и возможность измерения влажности воздуха (как я уже говорил «чем больше — тем лучше»).
Датчик имеет следующую распиновку:
- 5V
- Чтение данных
- Не используется
- Земля
Диапазон измерений:
- Температуры — 0 — 50°C ± 2°C
- Влажности воздуха — 20 — 95% ± 5%
Подключаем по следующей схеме:
// подключаем библиотеку #include <dht.h> // создаём объект-сенсор DHT sensor = DHT(); void setup() { Serial.begin(9600); // методом attach объявляем к какому контакту подключен // сенсор. В нашем примере это нулевой аналоговый контакт sensor.attach(A1); // // после подачи питания ждём секунду до готовности сенсора к работе delay(1000); } void loop() { // метод update заставляет сенсор выдать текущие измерения sensor.update(); switch (sensor.getLastError()) { case DHT_ERROR_OK: char msg[128]; // данные последнего измерения можно считать соответствующими // методами sprintf(msg, "Temperature = %dC, Humidity = %d%%", sensor.getTemperatureInt(), sensor.getHumidityInt()); Serial.println(msg); break; case DHT_ERROR_START_FAILED_1: Serial.println("Error: start failed (stage 1)"); break; case DHT_ERROR_START_FAILED_2: Serial.println("Error: start failed (stage 2)"); break; case DHT_ERROR_READ_TIMEOUT: Serial.println("Error: read timeout"); break; case DHT_ERROR_CHECKSUM_FAILURE: Serial.println("Error: checksum error"); break; } delay(2000); }
-
Датчик освещенности
Очень простой датчик, состоящий из компаратора LM393 и фоторезистора. Все пины подписаны, и не нуждаются в разъяснении.
int sensorPin = A0; // устанавливаем входную ногу для АЦП unsigned int sensorValue = 0; // цифровое значение фоторезистора void setup() { pinMode(13, OUTPUT); Serial.begin(9600); // старт последовательного вывода данных (для тестирования) } void loop() { sensorValue = analogRead(sensorPin); // считываем значение с фоторезистора if(sensorValue<500) digitalWrite(13, HIGH); // включаем else digitalWrite(13, LOW); // выключаем // Для отладки раскомментируйте нижеследующие строки //Serial.print(sensorValue, DEC); // вывод данных с фоторезистора (0-1024) //Serial.println(""); // возврат каретки //delay(500); }
Датчик влажности почвы
Особенностью данного датчика является возможность чтения данных как в цифровом (0 или 1), так и в аналоговом. Я буду использовать цифровой вывод. Для извлечения значения достаточно строки:
Value = analogRead(A2); // считываем значение с датчика влажности почвы
С датчиками определился. Самое время подумать о красивом корпусе. Пошарив по волнам интернета нашел вот этого красавца и решил: мой курсач будет в нем.
Но т.к. в нем есть отверстие под дисплей, у меня не осталось выбора как «добавить» в курсовую индикацию с помощью дисплея. Мною было принято решение использовать простой в обращении lcd 1602:
Разбираясь, как он работает натолкнулся на очень хорошую статью, где все подробно описано. Все пины подключал по примеру в статье. Код также прилагается.
В качестве источника питания использую крону на 9В. С материалами покончено. Приступаем к разработке.
Разработка
Зная как работает каждый элемент отдельно, не составляет труда собрать все в единое целое, что я и сделал. После нескольких часов первой пайки получилось что вроде этого:
Датчики сделал отдельно от основного корпуса:
Буду рад любой критике.
Автор: LesNik101