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

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

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

Статус темы:
Закрыта.
  1. timon2006
    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356

    timon2006

    Живу здесь

    timon2006

    Живу здесь

    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356
    Я в этом посте написал, как без задержек сделать опрос кнопок. Проверка нажатия делается в loop (это ведь главный цикл?), выход из проверки - туда же. На каждую кнопку тратится всего несколько команд.
     
  2. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Ага, понял. Сразу не нашёл, потому что в приводимом ранее коде нет упоминаемого тобой select. Посмотрю как устроен setTemperature, как доберусь.
    Сам размышлял эти пару дней между делом, пока не до компа было, тоже своя концептура в уме возникла, интересно будет сравнить. Ошибка моя была в том, что главное меню у меня, в котором нет устанавливаемых параметров, а только значения датчиков и текущее время, были в LOOP и не подчинялось общим правилам меню. Теперь думаю выселить из LOOP обработку датчиков и оставить в них только одни меню. Их пока 3.
    Все меню будут подчиняться кнопкам, которых две. Соответственно, будет и 2 переменных, полностью управляющими всеми меню: param и zifra. Никаких флагов и уровней, param будет управлять выводом на экран актуального меню и указывать на тот параметр, который должен меняться. Zifra будет увеличивать актуальный параметр в установленных для него границах. Надеюсь, получится.
     
  3. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Да я смотрел и запомнил, спасибо. Вернусь к этому после того, как закончу все процедуры установки и отработки параметров. Пока всё в симуляторе Proteus проверяется, без испытаний в натуре. Алгоритм опроса кнопок у меня сейчас удовлетворительный, хотя и хроменький - не проскакивает, но иногда пропускает нажатие. На схему это не повлияет, поэтому окончательную доводку оставлю на потом, когда плата будет сделана, если этот эффект не исчезнет ввиду прочих доработок.
    Сейчас разрабатываю новую систему меню. Старая с одной кнопкой тоже работает, но на основе задержек delay и while, пытаюсь сделать новую версию без задержек для вариантов с одной кнопкой и с двумя. Заодно и тренируюсь оформлять всё в виде функций.
     
  4. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    С меню пока не получается, решил переключиться, немного причесать код. Разложил всё по функциям, в loop оставил одни вызовы через millis.
     
  5. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Выбор меню немножко задышал. Вот так сейчас выглядит LOOP:
    Код:
    void loop() {
      if(millis()-prevMillis>2000){   //Опрос датчика температуры и влажности DHT21 1 раз за 2 сек
        prevMillis=millis();
        DH_T21();                 }
      if(millis()-prevMillis1>1000) { //Опрос датчика температуры DS18B20 1 раз в сек
        prevMillis1=millis();
        DS18B20();                  }
      if(millis()-prevMillis2>1000) { //Управление исполнительными механизмами
        prevMillis2=millis();
        actuators();                }
      if(millis()-prevMillis3>200){   //Выбор меню
        prevMillis3=millis();
        menu();                   }   
      if(analogRead(A0)<1000){        //Нажатие кнопки
        int knopka();
        key=knopka();                 //Сохранили № кнопки
        if(key==1)param++;            //Если кнопка навигации, выбрать меню и параметр
        if(key==2)zifra++;            //Если кнопка установки цифры, увеличить на 1
        delay(180);
        }
    } //---LOOP---------------------------------------------------
    Пока расписал только реакцию на нажатие кн.№1 - навигации. Кнопка изменяет параметр и подставляет нужное меню для отображение и установки этого параметра.
    Кн. 2 - установки значения - должна будет изменять цифру выбранного параметра.
     
  6. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Процесс пошёл. Завтра возможно напишу новую версию процедур опроса кнопок и установки параметров. Цель была уменьшить объём кода, попутно оформлял процедуры в виде функций. В общем, скетч упорядочился, стал легче читаем и понятней.
    После этого останется только сравнение установленных значений с текущими и вкл/выкл исполнительных механизмов. Это у меня уже было сделано, но только для параметров с датчиков, а надо добавить сравнение времени. Текущее время хранится в виде массива char, время срабатывания же я хочу, если получится, сформировать тоже в виде массива, но не в символьного, а типа int. Если удастся так записывать и сравнивать затем эти массивы, то код получится намного компактнее.
    В общем, есть шансы сделать и код компактным и саму конструкцию, которая вместе с симисторными опто-реле будет в коробке, которая уместится на ладошке.
     
  7. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Написал начерно новую версию опроса кнопок и установки параметров. Удалось значительно уменьшить объём кода, хотя паковать в массивы ещё не пробовал. Если получится, объём кода станет ещё меньше. Убрал все функции delay() и команды while, зацикливающие программу на себе. Вернее, одна delay() ещё остаётся и из-за неё, как я понимаю, кнопки не всегда срабатывают или проскакивают.
    В дальнейшем разберусь с этим, пока же вот скрины того, что уже работает, хоть и нечётко:
    меню 1.jpg меню 2.jpg меню 3.jpg
    Первое меню отображает температуру и влажность внутри теплицы, температуру на улице и реальное время. Второе и третье меню позволяют устанавливать нужные параметры. На втором верхняя строчка - установка температуры включения ТЭНа, нижняя - время включения и выключения подсветки. На третьем верхняя строчка - время включения и выключения полива, нижняя - интервал полива в сутках и сколько суток осталось до полива.
     
  8. timon2006
    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356

    timon2006

    Живу здесь

    timon2006

    Живу здесь

    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356
    Второй экран: может лучше "ВКЛ ТЭН"? Как установить температуру выключения ТЭНа?
     
  9. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    У меня дисплей без кириллицы. 7 символов я израсходовал: П, Л, У, Д, И, Ч и знак градуса - °. 8-й символ компилятор бракует. Однако я упустил что, перебирая варианты текста, перестал использовать символ Ч и теперь можно добавить ещё один знак. Спасибо что обратил внимание на это.
    Есть вариант генерировать эти коды заново при смене меню. Например, символ У используется только в 1-м меню (в 1-м экране). Можно перед моментом рисования 2-го экрана менять битовую маску переменной byte u_kr[8]={B10001,B10001,B10001,B01111,B00001,B10001,B01110,B00000}; с маски, изображающей символ У, на другой нужный символ, а перед выводом 1-го экрана возвращать его на место.
    Вопрос по поводу установки цифр в кнопкой. Как выделить визуально ту цифру, которую я устанавливаю в данный момент? В варианте с одной кнопкой такой проблемы не было, там при каждом нажатии кнопки сдвига следующий, подлежащий установке параметр, менялся сам с определённой заданной частотой. Здесь же я не вижу, какой разряд в данный момент активен. Надо делать редактируемый разряд мигающим. У меня пока каждый параметр устанавливается отдельно. Если я буду добавлять мигание каждый раз, (к тому же я по раздельности устанавливаю десятки и единицы часов и минут), код получится тяжёлый.
    Помнится, ты писал что у тебя единая процедура для установки всех параметров, что позволяет сделать механизм мигания всего один раз, или у тебя тоже редактируемый разряд не выделяется? Я, честно говоря, считаю что это большое неудобство.
     
  10. timon2006
    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356

    timon2006

    Живу здесь

    timon2006

    Живу здесь

    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356
    У меня проще: дисплей графический, знакогенератор свой, что хочу, то и вывожу:).
    Редактируемый параметр (и вообще активная строка) выделяется инверсией.
     
  11. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Ясно. Не страшно, переделка кода всё равно была нужна. Теперь, в принципе, могу сделать снова вариант с одной кнопкой, только компактный и без задержек, если с миганием не прокатит.
    Переделал знакогенератор, добавил символ Г, теперь строка будет выглядеть так: ВКЛ НАГРЕВ 17°С
     
  12. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Ах да, забыл ответить на этот вопрос. А температуру выключения устанавливать не надо вообще, она на 1°С выше температуры включения. Практика показала что инерционность объекта высока и нагрев на 1° и затем остывание на 1° происходят довольно медленно.
     
  13. timon2006
    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356

    timon2006

    Живу здесь

    timon2006

    Живу здесь

    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356
    Я бы сделал эту регулировку. Разность температур внутри и снаружи, ветер не вовремя и/или сильный, пмсм, сильно будут влиять на остывание.
     
  14. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Летом это только на пользу, томаты обожают ветер, у меня 4 мес. в теплице открыто всё что можно. Обогрев требуется только осенью, когда двери уже не открываются.
     
  15. Maximus71
    Регистрация:
    11.05.16
    Сообщения:
    190
    Благодарности:
    211

    Maximus71

    Живу здесь

    Maximus71

    Живу здесь

    Регистрация:
    11.05.16
    Сообщения:
    190
    Благодарности:
    211
    Адрес:
    Гомель
    Почему влажность - W=69%? Предлагаю ВЛ=69%.
     
Статус темы:
Закрыта.