[Из песочницы] Система управления микроклиматом теплицы

Начало пути


Одним солнечным деньком, придя в универ, я узнал, что в этом семестре у меня курсовой по схемотехнике. Преподаватель предлагал сделать только пояснительную записку «как реализовать проект» или же познать темную сторону инженерии и создать реальное устройство. А так, как я был уже на 4ом курсе, и вспомнив, что единственный раз когда я применял на практике свои навыки инженера был на первом курсе (прикрутил к стене книжную полку), я решил «поработать ручками». После недолгих размышлений, мною была выбрана тема «Система управления микроклиматом теплицы». Скорее всего на выбор повлияла моя любовь к автоматизации процессов, или же то, что я и сам занимался разведением огурцов в теплицах. Но не будем долго тянуть — начинаем.

Поиски материалов


От друзей и преподавателя услышал о платформе Arduino. Немного почитав про ардуинку и посмотрев пару реализованных проектов, желание создать что-нибудь свое стало еще больше. Для реализации проекта решил использовать Arduino Nano v3. Оригинал стоил чуть больше 20$, за копию отдал 10. Конечно дешевле было бы заказать на Aliexpress, но у меня не было ни времени, ни желания ждать целый месяц — хотелось начать немедленно.

C платой микроконтроллера определился и самое время решить, какие мне нужны датчики. Немного поразмышляв, решил в первый раз не делать что-то масштабное (как я люблю говорить «краткость — сестра таланта») и ограничиться тремя основными составляющими микроклимата теплицы — температура, освещенность и влажность почвы. Разберем все по порядку:

  1. Датчик температуры Немного погуглив, решил остановиться на датчике DHT11. И как оказалось в нем помимо измерения температуры есть еще и возможность измерения влажности воздуха (как я уже говорил «чем больше — тем лучше»).

    image

    Датчик имеет следующую распиновку:

    1. 5V
    2. Чтение данных
    3. Не используется
    4. Земля

    Диапазон измерений:
    • Температуры — 0 — 50°C ± 2°C
    • Влажности воздуха — 20 — 95% ± 5%

    Подключаем по следующей схеме:

    image

    // подключаем библиотеку
    #include 
     
    // создаём объект-сенсор
    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);
    }
    
    

  2. Датчик освещенности
    image

    Очень простой датчик, состоящий из компаратора 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);  
    }
    
    

  3. Датчик влажности почвы
    image

    Особенностью данного датчика является возможность чтения данных как в цифровом (0 или 1), так и в аналоговом. Я буду использовать цифровой вывод. Для извлечения значения достаточно строки:

     Value = analogRead(A2);  // считываем значение с датчика влажности почвы
    
    


С датчиками определился. Самое время подумать о красивом корпусе. Пошарив по волнам интернета нашел вот этого красавца и решил: мой курсач будет в нем.

image

Но т.к. в нем есть отверстие под дисплей, у меня не осталось выбора как «добавить» в курсовую индикацию с помощью дисплея. Мною было принято решение использовать простой в обращении lcd 1602:

image

Разбираясь, как он работает натолкнулся на очень хорошую статью, где все подробно описано. Все пины подключал по примеру в статье. Код также прилагается.

В качестве источника питания использую крону на 9В. С материалами покончено. Приступаем к разработке.

Разработка


Зная как работает каждый элемент отдельно, не составляет труда собрать все в единое целое, что я и сделал. После нескольких часов первой пайки получилось что вроде этого:

image

image

Датчики сделал отдельно от основного корпуса:

image

image

Буду рад любой критике.

© Geektimes