1. Уважаемые форумчане! Убедительная просьба, используйте наиболее подходящие темы для своих сообщений. Спасибо за понимание.
    Dismiss Notice

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

Discussion in 'Автоматика' started by Phantom, Oct 9, 2015.

  1. Phantom

    Phantom Active Member

    Joined:
    11.05.2014
    490
    138
    Имя:
    Олег
    Все мои доработки относятся к версии 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() следующую строку
    Code:
    if ((millis()-start)>1000){
    Заменяем 1000 на наш вычисленный коэффициент К. Получаем
    Code:
    if ((millis()-start)>1091){
    Это притормозит ход часов в блоке, т.к. за 1с теперь будет приниматься большее количествово импульсов.
     
  2. Yuriiv

    Yuriiv Active Member

    Joined:
    19.02.2014
    429
    175
    Да, время действительно не соответствует действительности, но это не так уж и важно, 1-2 минуты на паузу погоды не сделают.
    Отключить ПИД при нагреве до кипения, вот этот бы надо сделать.
     
  3. Phantom

    Phantom Active Member

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

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


    В файле Funzioni.h в функции byte btn_Press() добавляем одну строку
    Code:
    byte btn_Press (byte Button_press, int msTime){
      if (digitalRead(Button_press)==0){
      delay (msTime);
      if (digitalRead(Button_press)==0){
      Buzzer(1,50);  //наша строка для озвучки нажатий
     
    Евгений_Ш and alexgo like this.
  4. Muzer

    Muzer Новенький

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

    alexgo Active Member

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

    Phantom Active Member

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

    0Scotch0 Участник

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

    Phantom Active Member

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

    0Scotch0 Участник

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

    Phantom Active Member

    Joined:
    11.05.2014
    490
    138
    Имя:
    Олег
    Please login or register to view links )))
    --- сообщения объединены, Oct 20, 2015, дата первого сообщения: Oct 20, 2015 ---
    Мод 3. Включение тэн после MashOut на 100% до достижения температуры варки. После чего запускается режим pwm. Это позволяет максимально быстро перейти в стадию непосредственно варки.

    В файле ArdBir.ino находим в процедуре void stage_loop () следующий кусок кода
    Code:
    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){
    И заменяем его этим
    Code:
    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-ю строками выше находим эту
    Code:
    if ((x-1)==8 && tempBoilReached && Temp_Now >= boilStageTemp) {  //if temp reached during boil
    И заменяем ее на это
    Code:
    //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 Участник

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

    Phantom Active Member

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

    alexgo Active Member

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

    Phantom Active Member

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

    alexgo Active Member

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

    0Scotch0 Участник

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

    Phantom Active Member

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

    mishgan Active Member

    Joined:
    29.04.2014
    255
    77
    А я сделал у себя так. Если параметры Kp Ki Kd windowStartTime равны нулю то пид управление отключается и нагрев идет по упрощенному алгоритму...
    Code:
    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);
      }
    }
    }
     
    flexx likes this.
  19. alternativshik

    alternativshik Новенький

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

    Phantom Active Member

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