1 2 3 4 5 6 7 8 9 10 10/10 9,94оценок: 33

Arduino Mega. Контроллер теплицы. Хроники

Тема в разделе "Теплицы и парники", создана пользователем DIYMan, 05.01.16.

Статус темы:
Закрыта.
  1. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Значит, так, решение: ENC28J60 буду прикручивать после W5100, когда всё-всё утрясётся. Причины: на ENC28J60 нет аппаратного TCP/IP стека, как следствие - надо брать его нормальную программную реализацию. Работы с этой железякой - мама не горюй, она крови может выпить как пять W5100, я думаю.

    Поэтому - жду W5100, витая пара закуплена, лежит в упаковке, дозревает :)

    З. Ы. Не поймите неправильно: хочется не отлавливать баги в чужих библиотеках, хочется - писать и отлавливать свои :)]:aga: Тем более, что помимо работы с TCP/IP стеком - нюансов хватает.
     
  2. olegmak3
    Регистрация:
    14.08.11
    Сообщения:
    524
    Благодарности:
    442

    olegmak3

    Живу здесь

    olegmak3

    Живу здесь

    Регистрация:
    14.08.11
    Сообщения:
    524
    Благодарности:
    442
    Адрес:
    Санкт-Петербург
    Уже собирался консультироваться по этому поводу.
    Сегодня провел подобные эксперименты.
    Просто по времени (без температуры) работает как часы (оба канала одновременно).
    С температурой (чуть свои правила поменял с Вашей подачи) один канал заработал.(срабатывает на минуту-полторы позже).
    Второй, идентичный по правилам полностью, .пока не хочет включаться.
    Завтра по реальным логам гляну.
     
  3. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Продолжаем тестировать правила по времени и управлению пинами: время 23:00 - светик зажёгся.
     
  4. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    По температуре должно быть так же - т. е. работать чётко. При условии, что с датчика есть данные. Это единственная дополнительная проверка, которая происходит до проверки на попадание показаний с датчика в нужный диапазон:
    Код:
     
    case rtTemp: // проверяем температуру
        {
         if(!linkedModule->State.HasState(StateTemperature))  // не поддерживаем температуру
            return false;
    
         OneState* os = linkedModule->State.GetState(StateTemperature,sensorIdx);
           
         if(!os) // не срослось
          return false;
    
         if(!os->IsChanged() && !bFirstCall) // ничего не изменилось
            return false;
         
           bFirstCall = false;
               
    
           TemperaturePair tp = *os;
           int8_t curTemp = tp.Current.Value;
    
           if(curTemp == NO_TEMPERATURE_DATA) // нет датчика на линии
            return false;
    
           int8_t tAlert = dataAlert; // следим за переданной температурой
           switch(dataSource)
           {
              case tsOpenTemperature: // попросили подставить температуру открытия из настроек
                tAlert = linkedModule->GetController()->GetSettings()->GetOpenTemp();
              break;
    
              case tsCloseTemperature: // попросили подставить температуру закрытия из настроек
                tAlert = linkedModule->GetController()->GetSettings()->GetCloseTemp();
              break;
    
              case tsPassed:
              break;
           }
    
           switch(operand)
           {
              case roLessThan: return curTemp < tAlert;
              case roLessOrEqual: return curTemp <= tAlert;
              case roGreaterThan: return curTemp > tAlert;
              case roGreaterOrEqual: return curTemp >= tAlert;
              default: return false;
           } // switch
        } 
        break; // rtTemp
    Как видите - только простейшие проверки.
     
  5. Snark
    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424

    Snark

    Живу здесь

    Snark

    Живу здесь

    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424
    Адрес:
    Лобня
    У Вас такой есть?
     

    Вложения:

  6. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    И такой, и ещё пяток других ;) Я уже прошерстил под сотню страниц буржуйских форумов - со всеми есть проблемы, хорошие такие, жирные. Самая нормальная либа, реализующая стек TCP/IP - на первый взгляд uIP, но это не самое интересное: все надстройки, которые её юзают - не менее кривые, как если бы их написал я. Да и про саму uIP тоже есть отзывы с проблемами.

    Короче, я сейчас творчески осмысливаю это дело, а упомянул про W5100 потому лишь, что на момент, когда она придёт - осмысливание ещё не закончится. А т. к. W5100 имеет на борту аппаратный стек TCP/IP - то, как понимаете, это "улётное падение" по части возможных багов в тоннах кода сторонней библиотеки. Толку от того, что я прикручу сейчас по-быстрому ENC28J60 и оно будет не работать в боевых условиях - мало.

    Короче, это дело неспешное, вот я к чему. Оно будет, но - не так вот сразу.
     
  7. olegmak3
    Регистрация:
    14.08.11
    Сообщения:
    524
    Благодарности:
    442

    olegmak3

    Живу здесь

    olegmak3

    Живу здесь

    Регистрация:
    14.08.11
    Сообщения:
    524
    Благодарности:
    442
    Адрес:
    Санкт-Петербург
    Дмитрий!
    Вот какой вопрос хочу задать.

    / Если USE_WINDOWS_SHIFT_REGISTER определена - управление окнами пойдёт через сдвиговый регистр 74HC595 по пинам, указанным ниже
    #define WINDOWS_SHIFT_LATCH_PIN 40 / пин защёлки
    #define WINDOWS_SHIFT_DATA_PIN 41 / пин данных
    #define WINDOWS_SHIFT_CLOCK_PIN 42 / пин тактирования

    Это кусок последнего варианта Global.
    Если я хочу использовать пины 40,41,42 для своих целей (в модуле управления пинами, например) и никогда не буду использовать сдвиговый регистр, нужно ли подобные строки из скетча убирать?
    И второй вопрос.
    Напомните, пожалуйста, где можно увеличить максимальное кол-во правил ?
     
  8. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    1. Просто оставьте USE_WINDOWS_SHIFT_REGISTER закомментированным, тогда сдвиговый регистр не используется, соответственно, этого кода физически не будет в прошивке. Но обратите внимание, что тогда пины, используемые для реле управления фрамугами, читаются из WINDOWS_RELAYS_PINS.

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

    Правка: забыл, что в конфигураторе жёстко прошито ограничение на 20 правил. Но правила можно добавлять через монитор порта ручками, если что. Как-нибудь приделаю в конфигуратор такую настройку, чтобы можно было указывать максимальное кол-во правил.
     
    Последнее редактирование: 11.04.16
  9. rapidshe
    Регистрация:
    19.01.16
    Сообщения:
    23
    Благодарности:
    12

    rapidshe

    Участник

    rapidshe

    Участник

    Регистрация:
    19.01.16
    Сообщения:
    23
    Благодарности:
    12
    Я извиняюсь) мои вопросы вечно не по теме...
    а ты как ты обыграл ситуацию, когда надо включить, например, в 18:00 а выключить в 17:00 следующего дня и при этом в случае сбоя в электроснабжении востановить работу?

    при работе по времени я вижу только такой алгоритм:
    Если (Час.сейчас >=Час.вкл И Мин. сейчас>=Мин.вкл И Час. сейчас <= Час. выкл И Мин. сейчас <= Мин. выкл)
    {светодиод включить}
    иначе выключить

    но он работает только при времени включения<времени выключения...
     
  10. rapidshe
    Регистрация:
    19.01.16
    Сообщения:
    23
    Благодарности:
    12

    rapidshe

    Участник

    rapidshe

    Участник

    Регистрация:
    19.01.16
    Сообщения:
    23
    Благодарности:
    12
    Хотя наверное для теплицы таких ситуаций нет...
     
  11. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Уже реализовано правилами. У каждого правила есть час начала работы и продолжительность в минутах. Зная час окончания работы - продолжительность в минутах посчитать нетрудно. Алгоритм проверки на то, что правило может работать, простой:

    Код:
     bool CheckCanWork(uint8_t currentHour, uint8_t currentMinute, 
    uint8_t startHour, uint16_6 duration_in_minutes)
    {
      bool canWork = true; // считаем, что мы можем работать
    
      if(start_hour == 0  && duration_in_minutes == 0) // работаем всегда
         return canWork;
    
    
      // создаём диапазон для проверки
      uint16_t startDia = startHour*60;
      uint16_t stopDia = startDia + duration_in_minutes;
    
      // если мы находимся между этим диапазоном, то мы можем работать в это время,
      // иначе - не можем, и просто выставляем флаг работы в false.
      // надо отразить текущее время в этот диапазон. Существует одна особенность диапазона:
      // если он полностью попадает в текущие сутки, то мы просто смотрим, попадает ли
      // текущее время в этот диапазон. Иначе (например, час начала 23, продолжительность -
      // 120 минут, т.е. работа закончится на следующие сутки, в час ночи) нам надо отразить
      // текущий час на этот диапазон, т.е. виртуально продлить сутки. Для этого к текущему
      // времени прибавляем кол-во минут в сутках.
    
      const uint16_t mins_in_day = 1440; // кол-во минут в сутках
      uint16_t checkMinutes = currentHour*60 + currentMinute; // текущее время в минутах
    
      if(stopDia >= mins_in_day)
      {
        // правая граница диапазона перешагнула на следующие сутки,
        // отражаем диапазон текущего часа на следующие сутки
        // только в том случае, если текущий час меньше, чем час начала работы
        if(currentHour < startHour)
          checkMinutes += mins_in_day;
      }
    
        // проверяем попадание в диапазон
        canWork = checkMinutes >= startDia && checkMinutes <= stopDia;
    
          return canWork;
    }
    Разберёшься?
     
  12. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
  13. 2mike
    Регистрация:
    14.03.10
    Сообщения:
    596
    Благодарности:
    415

    2mike

    Живу здесь

    2mike

    Живу здесь

    Регистрация:
    14.03.10
    Сообщения:
    596
    Благодарности:
    415
    Адрес:
    Россия
    Свою плату развести день делов, а там не хватает менеджера батарейки.
    Всё равно обьем работы по софту в разы больше чем по железу.
     
  14. rapidshe
    Регистрация:
    19.01.16
    Сообщения:
    23
    Благодарности:
    12

    rapidshe

    Участник

    rapidshe

    Участник

    Регистрация:
    19.01.16
    Сообщения:
    23
    Благодарности:
    12
    А хорошая кстати идея. вместо про мини самодельная ардуинка с размерами передатчика и всё в корпусе пауэр банка с встроенной платой зарядки батарейки. только вроде бы пауэр банки не отдают энергию во время зарядки...
    вот только на али про мини дешевле чем просто чип...
     
  15. rapidshe
    Регистрация:
    19.01.16
    Сообщения:
    23
    Благодарности:
    12

    rapidshe

    Участник

    rapidshe

    Участник

    Регистрация:
    19.01.16
    Сообщения:
    23
    Благодарности:
    12
    Спасибо) проверю свою догадку и, если не сработает, буду разбираться)

    я пока надумал такое решение:
    Код:
    if (t_вкл < t_выкл)
       {
       if (t_сейчас >= t_вкл && t_сейчас < t_выкл)
          {
          led_on
          }
       else 
          {
          led_off
          }
       }
    else // if (t_вкл > t_выкл)
       {
       if ((t_сейчас >= t_вкл && t_сейчас <= 23:59:59) || ( t_сейчас >= 00:00:00 && t_сейчас <  t_выкл ))
          led_on
          }
       else 
          {
          led_off
          }
       }
    
     
Статус темы:
Закрыта.