Одним солнечным деньком, придя в универ, я узнал, что в этом семестре у меня курсовой по схемотехнике. Преподаватель предлагал сделать только пояснительную записку «как реализовать проект» или же познать темную сторону инженерии и создать реальное устройство. А так, как я был уже на 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В. С материалами покончено. Приступаем к разработке.
Разработка
Зная как работает каждый элемент отдельно, не составляет труда собрать все в единое целое, что я и сделал. После нескольких часов первой пайки получилось что вроде этого: