1. ВАЖНО!!! Прошел умный спамер-робот. После регистрации создает переписку с сообщением о зачислении на ваш счет средств и ссылкой для подробностей. Ни в коем случае не переходите по ссылке и необходимо "покунить" такую переписку. Отвечать также не нужно. Временно переводим на ручное одобрение пользователей, посмотрим за обстановкой
    Скрыть объявление
  2. Уважаемые форумчане! Убедительная просьба, используйте наиболее подходящие темы для своих сообщений. Спасибо за понимание.
    Скрыть объявление

Дорабатываем ArdBir

Тема в разделе "Автоматика", создана пользователем Phantom, 9 окт 2015.

  1. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    Все мои доработки относятся к версии 2.6.70b10.
    Мод 1: Корректировка хода часов (в железе не пробовал, но мозг подсказывает, что работать должно).
    В ArdBir вычисление времени основано на подсчете импульсов тактового генератора, работающего на частоте 16МГц. Т.е. за 1 секунду принимается 16 000 000 импульсов. Но в связи с неточностью заводского изготовления кварцевого резонатора, температуры и ряда иных факторов реальная частота может отличаться от заявленной. В таком случае вычисленное время будет отличаться от реального. Заметная погрешность при варке приведет к нарушению рецептуры. Я предлагаю простой метод скорректировать ход часов.
    Вычисляем погрешность. Для этого создаем любую ситуацию с отсчетом времени (например, при достижении температуры в ручном режиме или отсчет времени при отложенном старте). Ждем пока на дисплее пройдет допустим Т1=5мин.=5*60с=300с. Параллельно засекаем сколько секунд это заняло в реальности. Допустим блок торопится и 1 его минута равна 55с в реальности. Получаем величину Т2=5*55с=275с. Вычисляем коэффициент К=1000*Т1/Т2=1000*300/275=1091.
    В файле ArdBir.ino находим в процедуре void Timing() следующую строку
    Код:
    if ((millis()-start)>1000){
    Заменяем 1000 на наш вычисленный коэффициент К. Получаем
    Код:
    if ((millis()-start)>1091){
    Это притормозит ход часов в блоке, т.к. за 1с теперь будет приниматься большее количествово импульсов.
     
    • Полезно Полезно x 1
  2. Yuriiv

    Yuriiv Active Member

    Регистрация:
    19.02.2014
    408
    164
    Да, время действительно не соответствует действительности, но это не так уж и важно, 1-2 минуты на паузу погоды не сделают.
    Отключить ПИД при нагреве до кипения, вот этот бы надо сделать.
     
    • За За x 1
  3. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    Я в первую очередь электроник, потому такое положение дел меня не устроило) а еще пока блок сообщает о необходимости вноса хмеля, то отсчет времени замирает на 2 секунды! Безобразие какое!
    --- сообщения объединены, 12 окт 2015, дата первого сообщения: 9 окт 2015 ---
    Мод 2. Звук при нажатии кнопок.

    Для сработки разных функций кнопку необходимо удерживать в нажатом состоянии определенное время, которое длится то совсем ничего, то 0.3с, то секунду. Мне это доставляло неудобство, т.к. были случаи, когда отпускал раньше положенного и приходилось нажимать заново. Поэтому первым делом я добавил звуковой сигнал, который раздается по истечении времени нажатия. После него можно уверенно отпускать кнопку.


    В файле Funzioni.h в функции byte btn_Press() добавляем одну строку
    Код:
    byte btn_Press (byte Button_press, int msTime){
      if (digitalRead(Button_press)==0){
      delay (msTime);
      if (digitalRead(Button_press)==0){
      Buzzer(1,50);  //наша строка для озвучки нажатий
     
    • Класс Класс x 2
    • Полезно Полезно x 1
  4. Muzer

    Muzer Новенький

    Регистрация:
    01.09.2015
    1
    0
    Есть модуль реального времени DS1302. Подскажите как подключить (скетч, библиотека, пины) к мега 2560 с прошивкой ArdBir
     
  5. alexgo

    alexgo Active Member

    Регистрация:
    07.10.2014
    709
    33
    Имя:
    Александр
    а разве в ардбир в настройках это не отпключается? PID pipe passive
     
  6. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    Этот пункт означает другое. Он определяет работаеть ли тэну на поддержание температуры при вынимании засыпи. PID Pipe в переводе "пид труба", то есть пид и бункер. Разработчики долго ломали голову как им обозвать этот пункт и уложиться в лимит символов)
    --- сообщения объединены, 19 окт 2015, дата первого сообщения: 19 окт 2015 ---
    Про подключение и библиотеки с примерами думаю в гугле полно информации. А вот для вживления всего этого дела в ардбир необходимо ковырять функцию void Timig(). Там есть условие в начале if ((millis()-start)>1000){
    Оно означает, что если последней секунды прошло более 1000мс, то увеличиваем счетчик времени на 1. Нужно придумать как это сделать с ds1302)
     
  7. 0Scotch0

    0Scotch0 Участник

    Регистрация:
    27.04.2014
    47
    1
    Согласен про безобразие, я вообще пришел к выводу убрать все дилеи и сделать задержку (в своем скетче) на основе оператора сравнения (по времени). Т.е. конечное время задается грубо говоря в основной программе, а millis() присваиваются уже в функции которая вызывается из основной.. там же идет сравнение. Попробуйте то же на ArdBir.
     
  8. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    это не устранит проблему, так как millis() тоже привязана к частоте. т.е. ошибка из-за несовершенства аппаратной части
     
  9. 0Scotch0

    0Scotch0 Участник

    Регистрация:
    27.04.2014
    47
    1
    Хе-хе ))) тогда нужно ставить инет шилд и синхронизацию с мировым временем )
     
  10. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок! )))
    --- сообщения объединены, 20 окт 2015, дата первого сообщения: 20 окт 2015 ---
    Мод 3. Включение тэн после MashOut на 100% до достижения температуры варки. После чего запускается режим pwm. Это позволяет максимально быстро перейти в стадию непосредственно варки.

    В файле ArdBir.ino находим в процедуре void stage_loop () следующий кусок кода
    Код:
    if ((x-1)==8){
      if (ScaleTemp==0)Set(stageTemp,110,EEPROM.read(17),0.25,Timer,Verso);
      else Set(stageTemp,230,EEPROM.read(18),0.25,Timer,Verso);
      NoBoil();
      tempBoilReached=false;
      }else{
      Set(stageTemp, Max, Min, 0.25, Timer, Verso);
      }
      Stage((x-1),stageTemp,Temp_Now);
      if (pumpRest==false)PID_HEAT(true);
      }
      }
      if (Temp_Now >= stageTemp){
    И заменяем его этим
    Код:
    if ((x-1)==8){
      if (ScaleTemp==0)Set(stageTemp,110,EEPROM.read(17),0.25,Timer,Verso);
      else Set(stageTemp,230,EEPROM.read(18),0.25,Timer,Verso);
      NoBoil();
      tempBoilReached=false;
      }else{
      Set(stageTemp, Max, Min, 0.25, Timer, Verso);
      }
      Stage((x-1),stageTemp,Temp_Now);
    //доработка варки. если температура меньше Тварки, то врубаем тэн на 100% //13102015
      if ((x-1)!=8){
      if (pumpRest==false)PID_HEAT(true);
      }else{
      if (pumpRest==false){
      Output = 100;
      PID_HEAT(false);
      }
      }
      }
      }
      if (Temp_Now >= stageTemp){
    Тестируем. Будут проблемы – отписываемся.

    Мод 4. А также 15-ю строками выше находим эту
    Код:
    if ((x-1)==8 && tempBoilReached && Temp_Now >= boilStageTemp) {  //if temp reached during boil
    И заменяем ее на это
    Код:
    //if ((x-1)==8 && tempBoilReached && Temp_Now >= boilStageTemp) {  //if temp reached during boil
      if ((x-1)==8 && tempBoilReached && Temp_Now >= stageTemp) {  // варка определяется не только Т в настройках, но и значением Т в режиме варки (например, мы увеличили это значение кнопкой Вверх)
    В результате алгоритм работы получается более логичный в случае изменения при варке уставки температуры SP.
     
  11. 0Scotch0

    0Scotch0 Участник

    Регистрация:
    27.04.2014
    47
    1
    Сейчас пытаюсь довести алгоритм своего скетча, подскажи, в вашей прошивке время отсчета паузы начинается после доведения температуры до t начала паузы?
     
  12. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    Прошивка не моя, это atdbir. Отсчет времени начинается при достижении температуры setpoint
     
  13. alexgo

    alexgo Active Member

    Регистрация:
    07.10.2014
    709
    33
    Имя:
    Александр
    я вот всё думаю а нужна такая точность до 0,25 градуса?что если сделать чтоб считало только целые градусы ? будет ли быстрее выход на паузу ?
     
  14. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    Быстрее не будет. Для пид наоборот 0.25 лучше. Т.к. он учитывает динамику изменения температуры, а изменения на 0.25 происходят чаще, чем на 1. Хотя за счет инерционности ситемы возможно разницы большой не будет заметно. Но имхо заколебешься код править)
     
  15. alexgo

    alexgo Active Member

    Регистрация:
    07.10.2014
    709
    33
    Имя:
    Александр
    а если просто в начале скетча где инициализация датчика поправить значения ну чтоб четвертинки не читал,показал бы участок кода тока я сейчас на работе
     
  16. 0Scotch0

    0Scotch0 Участник

    Регистрация:
    27.04.2014
    47
    1
    Ну к примеру у меня разница на 30 литров с моим 3кв теном - перегрев на 1 градус без пид. А вообще, ПИД - это всегда хорошо. Я бы тоже его применил, но думаю в дальнейшем сделать фазовое, если получится.. хотя меня и так устраивает. )
     
  17. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    Пид фазовому не мешает. Первый расчитывает %мощности, а второй реализует
    --- сообщения объединены, 22 окт 2015, дата первого сообщения: 22 окт 2015 ---
    Вариант, но на экране везде тогда будут лишние нули после запятой. Шаг калибровки менять придется. Можно просто округлять резуллтат измерения, чтобы не вдаваться в команды датчика, меняющие битность
     
  18. mishgan

    mishgan Active Member

    Регистрация:
    29.04.2014
    255
    73
    А я сделал у себя так. Если параметры Kp Ki Kd windowStartTime равны нулю то пид управление отключается и нагрев идет по упрощенному алгоритму...
    Код:
    void PID_HEAT (int temperatura){
    Input = t_zatora;
    Setpoint = temperatura;
    if ((st[0]==0 && st[1]==0 && st[2]==0) || st[3]==0) {
    if (Input<Setpoint) digitalWrite(pin_relay,HIGH);
    else digitalWrite(pin_relay,LOW);
    }
    else {
      if((Setpoint - Input)>5){
        digitalWrite(pin_relay,HIGH);
        if ((Setpoint - Input)<6)
        {
          myPID.Compute();
        }
      }
      else{
        myPID.Compute();
        unsigned long now = millis();
        if(now - windowStartTime>st[3])
        {                                     //time to shift the Relay Window
          windowStartTime += st[3];
        }
        if((Output*(st[3]/100)) > now - windowStartTime)  digitalWrite(pin_relay,HIGH);
        else  digitalWrite(pin_relay,LOW);
      }
    }
    }
     
    • Класс Класс x 1
  19. alternativshik

    alternativshik Новенький

    Регистрация:
    16.12.2015
    22
    1
    Имя:
    Sergey
    А как-то можно убрать минимальную продолжительность паузы в 1 минуту?
     
  20. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    395
    108
    Имя:
    Олег
    Можно, но с какой целью? Если пауза не нужна, то ее можно просто пропустить