Начало пути


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

  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



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

Комментарии (10)


  1. alexpp
    06.01.2016 13:48
    +2

    Хорошее начало! Только вот зря вы связались с DHT-11 — этот датчик измеряет температуру и влажность плюс минус лапоть. Тот же DHT-22 — чуть дороже, но точнее.


  1. iliasam
    06.01.2016 14:31
    +7

    А в каком месте оно управляет микроклиматом?
    В таком виде это просто некое подобие метеостанции, которая и суток не проработает от кроны.


  1. roller
    06.01.2016 17:33
    +3

    >>Я буду использовать цифровой вывод
    >>Value = analogRead(A2)

    Что-то пошло не так?


  1. rinat_crone
    06.01.2016 18:09
    +1

    Строил для друзей подобную систему для теплицы, малость посложнее, конечно, с выгрузкой данных в заббикс, датчиками на радиоканале, управлением влажностью, температурой и ph питательного раствора, освещением и прочими плюшками. То, что у вас, даже фикус вырастить особо не поможет, без обид, назовите метеостанцией, как и посоветовали выше.


    1. Hottaby4
      06.01.2016 19:24
      +4

      Палитесь


      1. rinat_crone
        07.01.2016 17:40

        Как бы мне самому не хотелось, теплица в этот раз была для помидоров :(


  1. sneka
    06.01.2016 20:30
    +2

    Все пишут «управление...», а делают «мониторинг» :(


    1. Alexeyslav
      06.01.2016 22:34
      +2

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


    1. TimID
      07.01.2016 23:54

      Дальше — «Интернет-вещей» уже начинается. У PTC хорошая платформа ThinkWorx для этих целей…


  1. yus1960
    07.01.2016 13:37
    +1

    Идея хорошая!