Управление рассадным боксом платами ардуино

Тема в разделе "Arduino & Shields", создана пользователем MESS, 2 мар 2015.

  1. MESS

    MESS Гик

    Много лет увлекаюсь экспериментами со светодиодной подсветкой огородной рассады и добился неплохих результатов. Многие дачники пользуются моими советами:
    ( мой блог: https://www.forumhouse.ru/blogs/34865/).

    Мне в этом году должно быть 70 лет, но я работаю, мозг не совсем застыл и руки чувствуют инструмент, хочется развить эксперимент в части управления спектральным составом рассадного света. Думаю, что это многим может быть интересно. Ардуино немного освоил, сделал на нем несколько девайсов (скопировал и модернизировал скетч для себя). Но к сожалению, не хватает времени и главное памяти для самостоятельного программирования.
    Сначала я кратко поясню о чем идет речь:

    -Имеется закрытый 3-этажный бокс, в котором живет обычная рассада томатов, перцев и некоторых цветов. Внешний свет не попадает.

    -Каждый этаж, площадью 0,3кв.м имеет свой светодиодный светильник, собранный на мощных сверхярких монохромных светодиодах 1Вт синего (440нм) и красного (660нм)цвета. Светильник позволяет регулировать соотношение синий-красный с помощью тумблеров. Мощность светильника в среднем 35Вт.

    -Рассада выращивается в два этапа. На первом этапе поддерживается соотношение синий- красный 3:1, при этом получаются коренастые толстенькие растюшки (набирают массу и не тянутся вверх). Затем, через месяц, изменяется соотношение на 1:3 (уменьшаю мощь синего и увеличиваю красный), это приводит к быстрому растягиванию клеток, рост растения. Растения полностью подчиняются этому режиму. В результате получаем мощную рассаду и урожай от нее.

    Однако это очень примитивный и грубый подход к изменению соотношения, и, если хоть немного приблизить алгоритм его изменения к тому как ведет себя солнце – то эффективность исскуственного света возрастет, а мощность светодиодов уменьшится. Это основная цель, которую хочется достичь – уменьшить мощность. Светодиоды пока очень дорогие и позволяют экономить электроэнергию, но не деньги ( на данном этапе).

    Солнечный свет меняется в течение дня. При восходе и закате солнца освещение имеет красноватый оттенок, ввиду поглощения синих лучей атмосферой. В полдень больше синих – небо ослепительно белое. Растения под таким светом растут лучше всего. На процесс фотосинтеза влияет не только мощность света и его спектральный состав , а так же продолжительность светового дня и ночи (фотопериодизм – это следующая задача).
    1 задача. начать -нужно чтобы ардуино в реальном времени различал 3 периода суток и выдавал в каждый из них пару команд, вроде digitlWrite(port1, 1) digitlWrite(port2, 0). Включить одну зону и выключить другую зону управления светодиодами в определенное время.
    Периоды времени : 07- 11, 11-17 и 17-21 мск.

    Если можно найти примеры –пожалуйста подскажите.
     
    Последнее редактирование: 14 мар 2015
    Tomasina и vvr нравится это.
  2. X-Dron

    X-Dron Гик

    Для начала это.
    http://wiki.amperka.ru/время:rtc-индикатор
    Индикатор можно не делать, но с ним удобнее контролировать текущее в системе время.
    У меня есть наработка для DS3231 с кнопками для корректировки времени без закачки с компа, все нет времени выложить.
    вывод на выходы, например
    boolean Tzone1 = clock.hour >=7 && clock.hour < 11;
    boolean Tzone2 = clock.hour >=11 && clock.hour < 17;
    boolean Tzone3= clock.hour >=17 && clock.hour < 21;

    digitlWrite(port1, Tzone1 || Tzone3 ); //утром или вечером
    digitlWrite(port2, Tzone1); //утром
    digitlWrite(port3, Tzone2); //днем
     
    Последнее редактирование: 3 мар 2015
  3. MESS

    MESS Гик

    Спасибо! ..
     
    Последнее редактирование: 3 мар 2015
  4. X-Dron

    X-Dron Гик

    Зачем так сложно???
    В вики все разжевано, тем более что часы на таком же чипе и искать библиотеку не нужно. Даже сделано, чтобы часы не сбрасывались после пропадания питания. Из уважения к возрасту только намекну на писателя по другую сторону границы Аляски.
    Нужно только и нужно удрать все связанное с индикатором и вывести, хотя бы на Serial.
    Что-то типа такого:
    Код (Text):
        #include <Wire.h>
        #include <EEPROM.h>
        #include <DS1307.h>

        //Массив, содержащий время компиляции
        char compileTime[] = __TIME__;
        //Для работы с микросхемой часов используем библиотеки
        DS1307 clock;
        byte Sec_Old;
       
        void setup()
        {
          //Запускаем часы реального времени
          clock.begin();
          Serial.begin(9600);
       
          //Получаем число из строки, зная номер первого символа
          byte hour = getInt(compileTime, 0);
          byte minute = getInt(compileTime, 3);
          byte second = getInt(compileTime, 6);
       
          //Импровизированный хэш времени
          //Содержит в себе количество секунд с начала дня
          unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;
       
          //Проверяем несовпадение нового хэша с хэшем в EEPROM
          if (EEPROMReadInt(0) != hash) {
       
            //Сохраняем новый хэш
            EEPROMWriteInt(0, hash);
       
            //Готовим для записи в RTC часы, минуты, секунды
            clock.fillByHMS(hour, minute, second);
       
            //Записываем эти данные во внутреннюю память часов.
            //С этого момента они начинают считать нужное для нас время
            clock.setTime();
            delay(100);
          }
        }
         
        void loop()
        {
          //Запрашиваем время с часов
          clock.getTime();
          if (clock.second != Sec_Old){
            Serial.print(clock.hour, DEC);
            Serial.print(":");
            Serial.print(clock.minute, DEC);
            Serial.print(":");
            Serial.print(clock.second, DEC);
            Serial.print(" ");
            Serial.print(clock.month, DEC);
            Serial.print("/");
            Serial.print(clock.dayOfMonth, DEC);
            Serial.print("/");
            Serial.println(clock.year, DEC);
          }
          Sec_Old = clock.second;
        }
       
        char getInt(const char* string, int startIndex) {
          return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0';
        }
       
        //Запись двухбайтового числа в память
        void EEPROMWriteInt(int address, int value)
        {
          EEPROM.write(address, lowByte(value));
          EEPROM.write(address + 1, highByte(value));
        }
       
        //Чтение числа из памяти
        unsigned int EEPROMReadInt(int address)
        {
          byte lowByte = EEPROM.read(address);
          byte highByte = EEPROM.read(address + 1);
       
          return (highByte << 8) | lowByte;
        }
     
    Библиотека DS1307.h
    http://www.seeedstudio.com/wiki/images/4/40/RTC_Library.zip
    Запрос делается каждый цикл loop, выводится только при смене секунды.
    Запрос можно делать раз в 100мс. так
    if (millis()%100 == 0) clock.getTime();
     
  5. vvr

    vvr Инженерище

    a я вами восхищаюсь и дай вам Бог здоровья на многие годы и продолжайте творить!
     
    MESS нравится это.
  6. Unixon

    Unixon Оракул Модератор

    А может солнечно-земной цикл еще не самый эффективный, просто у земных растений другого не было? Не пробовали форсировать разные стадии роста какими-нибудь еще менее тривиальными комбинациями спектр-мощность-время? Интересно было бы поэкспериментировать с такой радиационной биоинженерией...
     
  7. MESS

    MESS Гик

    Спасибо большое!
     
  8. MESS

    MESS Гик

    Я чистый технарь, а не агроном, для меня это просто хобби, которое немного украшает жизнь. Поэтому ответить Вам однозначно не могу. Дело в том, что в моей квартире нет солнечных окон, да и свободного места тоже, а выращивание рассады под лампами, было невозможным. Светодиоды перевернули все мои представления и я получаю хорошую рассаду.
    https://www.forumhouse.ru/useralbums/194445/standalone/2011-12-17%2009.43.32.jpg?embedded=1
    Хочется еще уменьшить потребление. Поэтому я экспериментирую только с тем, что сам понимаю, хотя и не уверен что это единственное верное направление.
    Я предполагаю, что разобрался с номинальной мощностью и спектром досвечивания. Лишняя мощность не мешает, но бесполезна - растения берут ровно столько фотонов, сколько могут принять. Спектр и точность соответствия длине волны очень сильно влияет на все процессы. Большинство продающихся растительных светильников не соответствуют спектральному составу и только за счет превышения мощности ( и стоимости) выполняют задачу.
    Синим цветом вообще можно остановить рост (растение в коме, но живет).
    Интересным считаю длительность фотопериода, ускорить стадии роста за счет более частой смены день-ночь- как бы обмануть растюху, сделать акселератом. ИМХО
     
    Последнее редактирование: 3 мар 2015
    vvr нравится это.
  9. X-Dron

    X-Dron Гик

    почему DF1307?
    Код (Text):
    ' class DF1307' has no member named 'begin' на эту строку
    в коде нет такого класса.
    Есть DS1307
    02-03-2015 22-16-12.png 02-03-2015 22-13-19.png
     
  10. MESS

    MESS Гик

    вот копия экрана : DS1307.png
    Я посмотрел свою библиотеку - она другая, хотя называется также.
     
    Последнее редактирование: 3 мар 2015
  11. MESS

    MESS Гик

    X-Dron
    получилось! после того как загрузил библиотеку по Вашей ссылке. Спасибо!
    Получается, что несмотря на наличие библиотеки ее нужно проверять на соответсвие.
    Поэтому много скетчей у меня не компилировалось.:(
     
    Последнее редактирование: 3 мар 2015
  12. Flopik

    Flopik Нерд

    По фотопериоду: считается,что разные культуры имеют разную чувствительность к режиму день-ночь. Из личного опыта: все на много сложнее чем нам говорят(а может и утаивают как коммерческую тайну?). Чувствительность к режиму день-ночь разная не только по культурам,но и по фазам развития, режиму питания( что то же интересно), более того разные сорта одной культуры например томатов при всех равных условиях реагируют по разному. было бы интересно посмотреть ВАШИ результаты. Сам дальше пром. ламп пока не продвинулся к сожалению. Но намечаю к осени все наверстать.
     
  13. Flopik

    Flopik Нерд

    Поздравляю.! Самому не давно помогли здесь разобраться с библиотекой.
     
  14. MESS

    MESS Гик

    К сожалению, аграрная наука нам вообще ничего конкретного не раскрывает, да это и не нужно. Они даже семенной картофель вырастить не могут. Я верю только тому, что щупаю, а не тому что говорят, поэтому и пробую методом ненаучного тыка. Я могу только высказать мнение, что правильная досветка может только помочь как следует подготовить рассаду для достижения результата. Но усложнять проблему не стоит. Проще вырастить хорошую рассаду, чем затем получить хороший урожай. Но если и рассада неправильная, тогда урожай еще хуже. А поскольку жизнь всего одна, начнем с рассады.
     

    Вложения:

    Последнее редактирование: 3 мар 2015
    Flopik нравится это.
  15. MESS

    MESS Гик

    Заработали часы на LCD 2004 с помощью скетча от X-Dron.
    но много похожих библиотек, можно ли упростить?
    Код (Text):
      #include <Wire.h>
      #include <OneWire.h>
        #include <EEPROM.h>
        #include <DS1307.h>
        #include "RTClib.h"
    #include <LiquidCrystal.h>
    RTC_DS1307 RTC;
    LiquidCrystal lcd(6,7,8,9,10,11);// это

        //Массив, содержащий время компиляции
        char compileTime[] = __TIME__;
        //Для работы с микросхемой часов используем библиотеки
        DS1307 clock;
        byte Sec_Old;

        void setup()
        {
          //Запускаем часы реального времени
          clock.begin();
          Serial.begin(9600);
          lcd.begin(20, 4);

          //Получаем число из строки, зная номер первого символа
          byte hour = getInt(compileTime, 0);
          byte minute = getInt(compileTime, 3);
          byte second = getInt(compileTime, 6);

          //Импровизированный хэш времени
          //Содержит в себе количество секунд с начала дня
          unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;

          //Проверяем несовпадение нового хэша с хэшем в EEPROM
          if (EEPROMReadInt(0) != hash) {

            //Сохраняем новый хэш
            EEPROMWriteInt(0, hash);

            //Готовим для записи в RTC часы, минуты, секунды
            clock.fillByHMS(hour, minute, second);

            //Записываем эти данные во внутреннюю память часов.
            //С этого момента они начинают считать нужное для нас время
            clock.setTime();
            delay(100);
          }
        }
     
        void loop()
        {
          //Запрашиваем время с часов
          clock.getTime();
          if (clock.second != Sec_Old){
            Serial.print(clock.hour, DEC);
            lcd.setCursor(0, 1);        
            lcd.print("Time-");                
            lcd.print(  clock.hour, DEC  );
            lcd.setCursor(7, 1);        
            lcd.print(":");                
            lcd.print(  clock.minute, DEC  );    
         
         
          }
          Sec_Old = clock.second;
        }

        char getInt(const char* string, int startIndex) {
          return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0';
        }

        //Запись двухбайтового числа в память
        void EEPROMWriteInt(int address, int value)
        {
          EEPROM.write(address, lowByte(value));
          EEPROM.write(address + 1, highByte(value));
        }

        //Чтение числа из памяти
        unsigned int EEPROMReadInt(int address)
        {
          byte lowByte = EEPROM.read(address);
          byte highByte = EEPROM.read(address + 1);

          return (highByte << 8) | lowByte;
        }
     
     
  16. X-Dron

    X-Dron Гик

    Строки
    #include <OneWire.h>
    #include "RTClib.h"
    RTC_DS1307 RTC;
    можно выкинуть.
    объект RTC нигде не используется и не нужен, так же как его библиотека RTClib.h.
    библиотека OneWire.h тоже не нужна.
    По-личке скоро отпишусь
     
  17. MESS

    MESS Гик

    Спасибо большое- все получилось!
    Если на моей НАНО осталось мало свободных пинов ( я слышал про возможности расширения - не надо), можно ли использовать еще одну НАНО ( не жалко) и их потом " связать" - синхронизировать с таймером?
    Или это неправильное решение?
     
  18. X-Dron

    X-Dron Гик

    Все-таки расширение с помощью сдвигового регистра (особенно для нано) проще и дешевле, чем 2 нано с синхронизацией. Занимаем 3 пина, получаем 8. Тем более есть стандартная функция.
    shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, DATA);
    http://wiki.amperka.ru/конспект-arduino:счетчик-нажатий?s[]=сдвиговый&s[]=регистр
    Еще проще можно попробовать использовать аналоговые входы в качестве дискретного ввода-вывода.
    http://arduino.ru/Reference/DigitalWrite
    Говорят работает, сам не тестировал. На нано таких пинов 8.
     
  19. vvr

    vvr Инженерище

  20. MESS

    MESS Гик

    Всем спасибо за подсказки - займусь выполнением. результат доложу.
    Есть вопрос по работающему скетчу. Батарейка в часах новая, но при выключении на 1 час и автономном питании (без компа), индикация времени неверная, 47часо 5678мин.
    Отчего это зависит?