Контроллер теплицы на Arduino Mega

Тема в разделе "Глядите, что я сделал", создана пользователем DIYMan, 24 июн 2016.

  1. DIYMan

    DIYMan Гуру

    Приветствую!

    Приглашаю всех интересующихся тематикой автоматизации вообще, и приусадебных теплиц - в частности, присоединиться к обсуждению проекта контроллера теплицы: https://github.com/Porokhnya/GreenHouseProject

    Вкратце о проекте: построен на базе Arduino Mega, отличительная особенность - модульность прошивки, т.е. вы сами можете настраивать прошивку под свои нужды, в разумных пределах. Есть шлюзы в локальную сеть, на выбор - ESP8266 или W5100, теоретически никто не мешает добавить шлюз для любого другого контроллера, типа ENC28J60.

    Поддерживаются различные типы датчиков, два типа дисплеев, есть гибкая система правил, с помощью которых можно настраивать поведение контроллера без перезагрузки прошивки. Реализовано управление по СМС, для СМС поддерживается как русский, так и английский язык. Есть программа-конфигуратор под Windows, есть - веб-интерфейс, с этих двух мест можно настраивать/управлять контроллером.

    Проект находится в стадии разработки, впереди ещё много вкусного, например: универсальные модули, работающие по протоколу 1-Wire (сейчас на этапе эмулятора на Uno), беспроводные модули с датчиками, выносной по одному шнурку дисплей Nextion (по протоколу 1-Wire), ну и т.д.

    Чего хочу от этой темы? Прежде всего - пожеланий: чего, на ваш взгляд, не хватает из функционала.

    Проект почти полностью открытый (нет только исходников конфигуратора), все исходные коды - свободны для некоммерческого использования в личных целях.

    Буду рад ответить здесь на любые вопросы по теме.
     
  2. DIYMan

    DIYMan Гуру

    Сегодня добавил поддержку выносного (по шнурку 1-Wire) дисплея для контроллера. Зачем это всё? Чисто для удобства, например, чтобы вытащить дисплей на десяток метров, не парясь. При этом выносной - никак не связан с основным, работают параллельно и не кашляют. Более того, тестировал параллельную работу конфигуратора, веб-интерфейса и выносного экрана - всё вместе успевает как-то жить, ттт :)

    Чтобы было понятно, о чём речь, небольшое видео (на канале есть несколько видео по разрабатываемому контроллеру):



    Если возникнут какие-то вопросы/пожелания/предложения - пишите, с удовольствием отвечу.
     
    rff-ei, koteika, Securbond и ещё 1-му нравится это.
  3. ostrov

    ostrov Гуру

    Здорово! И вообще круто.

    Жалко только, что зарабатывать своим умом у нас труднее чем чужим. Куда проще и выгоднее перепродавать, чем создавать. (

    ПС: тема только для обсуждения или можно поучаствовать каким то боком исключительно из академического интереса?
     
    DIYMan нравится это.
  4. DIYMan

    DIYMan Гуру

    Тема для развития проекта, собственно ;) Если у вас есть что предложить и чем поучаствовать - буду только рад. Чем больше мнений, хороших и разных - тем лучше. Чем больше предложений - тем больше понимания пути развития проекта.

    Ну а уж если захотите что-нибудь сделать для проекта - так это вообще супер ;)
     
  5. ostrov

    ostrov Гуру

    Я как то делал управление теплицами в противоположенных по сложности исполнениях. Первый - с меню на экранчике 16х2, кстати, вполне хватало для того кол-ва функций что было заявлено, второй - через меню на планшете 10 дюймов. Правда во втором случае я был лишь соавтором по нескольким вопросам, ибо задача была довольно громоздкая. В целом же, направление это интересное и, возможно, перспективное. Особенно если довести до ума и выпускать в нескольких вариантах: от парников на балконе до огромных промышленных теплиц.
     
  6. DIYMan

    DIYMan Гуру

    Правильно мыслите, в сходном со мной направлении ;) Задача-то, правда, всего-навсего довести до ума :) Уже полгода работаю над проектом, а до ума там - как до пекина... В процессе тестирования живыми пользователями чего только не выплывает. И уже с высот приобретённого маленького опыта я с уверенностью могу сказать, что те скетчи, которые выкладывают под названием "Умная теплица" - они, какбэ это мягко сказать - не дотягивают даже до полуумной, как это не прискорбно.

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

    Не скрою - на выходе хочется получить изделие "по уму", и, возможно, на продажу. Во многих вариантах поставки и конфигурации, как вы правильно упомянули - от парников с гроубоксами до средненьких теплиц (на промышленные не замахиваюсь, не тот уровень у мну).
     
  7. DIYMan

    DIYMan Гуру

    @ostrov - так что присоединяйтесь, буду рад, если мы взаимно сможем взять друг у друга что-то в плане профессионального роста, идей, да и вообще - я всегда рад совместной работе над интересным проектом. Любые деловые детали - обсуждаются легко ;)
     
  8. DIYMan

    DIYMan Гуру

    Фишка моей прошивки - это, помимо модульности - система команд через любой шлюз. Подцепить Bluetooth и пересылать через него команды - как два пальца, просто пока необходимости не вижу. Ну а там - хоть планшет, хоть что. Строго говоря, сейчас не вижу необходимости писать специальную прогу для планшетов - есть веб-интерфейс, который доступен с любого устройства, где есть браузер. Останется потом только грамотную адаптивную вёрстку сделать, под разные устройства же - и всё.

    Но, подчеркну ещё раз - шлюз для взаимодействия с контроллером может быть любой. Сперва я писал шлюз на ESP, там всё гоняется AT-командами через штатную прошивку - секас ещё тот. Потом, когда захотел прицепить W5100 - модуль этого шлюза получился вот таким:

    Код (C++):
      EthernetClient client = lanServer.available();
      if(client)
      {
        // есть активный клиент
        uint8_t sockNumber = client.getSocketNumber(); // получили номер сокета клиента

        while(client.available()) // пока есть данные с клиента
        {
          char c = client.read(); // читаем символ
         
          if(c == '\r') // этот символ нам не нужен, мы ждём '\n'
            continue;

          if(c == '\n') // дождались перевода строки
          {
            // пытаемся распарсить команду
            Command cmd;
            CommandParser* cParser = MainController->GetCommandParser();

            if(cParser->ParseCommand(clientCommands[sockNumber], cmd))
            {
              // команду разобрали, выполняем
             
              cmd.SetIncomingStream(&client); // назначаем команде поток, куда выводить данные

              // запустили команду в обработку
              MainController->ProcessModuleCommand(cmd);
            }

            // останавливаем клиента, т.к. все данные ему уже посланы.
            // даже если команда неправильная - считаем, что раз мы
            // получили строку, значит, имеем полное право с ней работать,
            // и каждый ССЗБ, если пришло что-то не то.
            client.stop();

            // очищаем внутренний буфер, подготавливая его к приёму следующей команды
            clientCommands[sockNumber] = F("");
           
            break; // выходим из цикла
           
          } // if(c == '\n')

          // если символ не '\r' и не '\n' -
          // запоминаем его во внутренний буфер,
          // привязанный к номеру клиента
          clientCommands[sockNumber] += c;
         
        } // while

        Ethernet.maintain(); // обновляем состояние Ethernet
       
      } // if(client)
    И это - всё! Т.е. из-за модульной архитектуры, внутреннего парсера команд - всё подцепляется достаточно просто.
     
    ostrov нравится это.
  9. ostrov

    ostrov Гуру

    Да легко. )
    Но пока что в режиме "без фанатизма", разумеется, ибо в приоритете работа оплачиваемая, как связанная с тематикой форума так и нет. А вообще, в процессе любой работы, даже самой не выгодной, получаешь то, что за деньги не купишь: знание и опыт.

    Кстати про ESP, штука интересная, как раз она у меня в очередь на освоение работы без AT-команд, так сказать напрямую. Зачем ей дополнительный контроллер, если свой есть, причем весьма и весьма мощный.
     
    DIYMan нравится это.
  10. DIYMan

    DIYMan Гуру

    Да у мну тоже основная работа, а проект теплицы - это домашка, что называется.

    По поводу ESP же - да, есть применения, где можно сделать всё на ней. Но это не мой случай - у ESP банально не хватит GPIO под все хотелки :)
     
  11. ostrov

    ostrov Гуру

    Так иногда можно увеличить кол-во портов или вообще повесить ее на определенную задачу и сливать данные в сеть (ну или передавать что то там на монитор/интерфейс). Я уже давненько не перегружаю МК кучей разной работы, предпочитаю делить задачи. Благо, что цены не слишком то кусаются.
     
    DIYMan нравится это.
  12. alp69

    alp69 Гик

    Если не возражаете - задам вопрос.
    Возможность использования one-wire для ds18b20 отвергнута по тактическим соображениям?
    И что такое "досветка" ("реле досветки)?
     
    Последнее редактирование: 30 июн 2016
    DIYMan нравится это.
  13. DIYMan

    DIYMan Гуру

    В смысле? DS18B20 и DS18S20 работают и поддерживаются прошивкой, опрос идёт по 1-Wire, тут всё норм. Просто сделано так: один датчик - один пин, по идеологическим соображениям (адресация датчиков, лёгкость замены, резервирование и т.п.).
    Например, выращиваете рассаду, и её надо досвечивать - для этого есть модуль управления досветкой: настраиваете его как вам надо, и пользуетесь. Любой модуль можно исключить из прошивки, если он вам не нужен ;)
     
  14. DIYMan

    DIYMan Гуру

    Не далее как на днях, к слову - добавил резервирование датчиков: это такая шляпа, когда датчики одной группы резервируют показания друг друга (например, если один сломался - то показания возьмутся с соседнего в группе). Это нужно для корректной бесперебойной работы правил, чтобы, что называется - не дай бог. Ввёл эту фичу потому, что как раз датчик DS18B20 у пользователя взял - и отправился к праотцам, а в этот момент окна были закрыты, чуть растюхи не сварились :( Тестируем, как видите, на живом :) Причём резервирование не зависит от типа датчика - можно в одну группу резерва добавить DS18B20 и DHT22 - если один гавкнется, то показания температуры возьмутся со второго.

    Сегодня добавил модуль таймеров: 4 таймера, настройка по дням недели, разные интервалы активности и неактивности (например, работать 15 секунд, потом 60 минут отдыхать). Модуль попросили сделать под гидропонику, где надо периодически гонять раствор по трубам.

    Потихоньку нарабатываю костяк универсальных модулей - это когда на линию 1-Wire можно повесить коробочку, и она будет отдавать показания с трёх внутренних датчиков (каждый может быть своего типа). Уже работает дисплей Nextion по шине 1-Wire - можно вынести его метров на 10 по одному шнурку ;)

    В отдалённом будущем будут ещё и радиомодули, но тут я пока не загадываю: у напарника по проекту сейчас банально не хватает времени, радиомодули - это за ним, там надо в тиньку всё впихивать, я со своими "умениями" пока не потяну: я чисто так, по мясу :)

    В общем, разработка идёт :) Одно только "но": когда ж она уже закончится :) :) :)
     
    Последнее редактирование: 30 июн 2016
  15. DIYMan

    DIYMan Гуру

    Вот, кстати, скриншоты сегодняшних обнов (ошибку "выключЁн" уже поправил, скриншоты переделывать лень :) ):

    1.png 2.png 3.png
     
    alp69 и ИгорьК нравится это.
  16. alp69

    alp69 Гик

    Ясно. А то я углядел, что каждый ds18b20 имеет свою подтяжку.
    Вообще проект суперский! Так держать!
    Если не секрет - привод окон чем реализован? Автостеклоподъемники? Или...?
     
    DIYMan нравится это.
  17. DIYMan

    DIYMan Гуру

    Пока ничем, если честно. Сейчас все тестеры кто во что горазд делают - кто на шуруповёрте дешёвом, кто на чём. Моя задача пока - откатать саму программную часть, чтобы было надёжно, повторяемо, ремонтопригодно и бюджетно, а там уже - посмотрим.

    Исходя из вышеизложенного прошивка и строится, например, можно юзать реле для управления окнами, а можно - мостовой драйвер на полевиках: в прошивке специально сделано так, что каждое окно управляется парой сигналов - когда на одной линии высокий уровень, а на другой - низкий - окно открывается, когда наоборот - закрывается. Как вы понимаете, такое поведение позволяет прицепить какой угодно драйвер окон ;)

    А за привод я пока думаю - для себя хотел попробовать актуаторы готовые, но это нескоро ещё - строительство теплицы у меня встало, времени не хватает от слова "совсем".
     
  18. DIYMan

    DIYMan Гуру

    К слову: ищется человек, который может написать прошивку под STM8, чтобы камушек работал по 1-Wire и отдавал определённый скратчпад по запросу. Это нужно для универсального модуля с датчиками. Сейчас у меня пока есть мясо в виде прошивки для Pro mini, но хочется чего-то более компактного, чтобы от батарейки протянуло достаточно долго, исходя из периодичности опроса раз в секунду, скажем.
     
  19. ostrov

    ostrov Гуру

    Что передавал? Почему именно STM8?
     
    DIYMan нравится это.
  20. DIYMan

    DIYMan Гуру

    Потому что надо с чего-то начинать, хочу с STM8 начать - заказал вот десяток STM8S003F3 на али, не пропадать же добру :) Заодно освою новую среду, так сказать.

    Понятно, что нужна полная реализация протокола 1-Wire как ведомого, это раз. Работающая реализация под AVR у мну уже есть, писана не мной, мной только корёжена. Из поддерживаемых команд:
    Код (C++):
    #define UNI_START_MEASURE 0x44 // запустить конвертацию
    #define UNI_READ_SCRATCHPAD 0xBE // прочитать скратчпад
    #define UNI_WRITE_SCRATCHPAD  0x4E // записать скратчпад
    #define UNI_SAVE_EEPROM 0x25 // сохранить настройки в EEPROM
     
    Плюс 0xCC, естественно. Скратчпад - вот такой:
    Код (C++):
    struct sensor
    {
        byte index;
        byte type;
        byte data[4];
       
    };
    //----------------------------------------------------------------------------------------------------------------
    typedef struct
    {
        byte packet_type;
        byte packet_subtype;
        byte config;
        byte controller_id;
        byte rf_id;
        byte battery_status;
        byte calibration_factor1;
        byte calibration_factor2;
        byte query_interval;
        byte reserved[2];

        sensor sensor1,sensor2,sensor3;

        byte crc8;
    } t_scratchpad;
     
    Надо уметь принимать/передавать скратч от мастера/к мастеру, читать/сохранять его в EEPROM (при регистрации модуля в системе ему прописываются индексы датчиков). Типы датчиков (pH неактуально, это на будущее):
    Код (C++):
    typedef enum
    {
      uniNone = 0, // ничего нет
      uniTemp = 1, // только температура, значащие - два байта
      uniHumidity = 2, // влажность (первые два байта), температура (вторые два байта)
      uniLuminosity = 3, // освещённость, 4 байта
      uniSoilMoisture = 4, // влажность почвы (два байта)
      uniPH = 5 // показания pH (два байта)
     
    } UniSensorType; // тип датчика
    Если пока не испугал и готовы хотя бы чем-то помочь - можно по скайпу списаться, я дам скетч для ардуины, который реализует конечный автомат 1-Wire - вопрос только в переносе под STM8.

    Мой скайп: porokhnya_dmitry.