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

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

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

Поделиться этой страницей

  1. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    249
    49
    Имя:
    Олег
    Все мои доработки относятся к версии 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
    324
    90
    Да, время действительно не соответствует действительности, но это не так уж и важно, 1-2 минуты на паузу погоды не сделают.
    Отключить ПИД при нагреве до кипения, вот этот бы надо сделать.
     
    • За За x 1
  3. Phantom

    Phantom Active Member

    Регистрация:
    11.05.2014
    249
    49
    Имя:
    Олег
    Я в первую очередь электроник, потому такое положение дел меня не устроило) а еще пока блок сообщает о необходимости вноса хмеля, то отсчет времени замирает на 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
    631
    27
    Имя:
    Александр
    а разве в ардбир в настройках это не отпключается? PID pipe passive
     
  6. Phantom

    Phantom Active Member

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

    0Scotch0 Участник

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

    Phantom Active Member

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

    0Scotch0 Участник

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

    Phantom Active Member

    Регистрация:
    11.05.2014
    249
    49
    Имя:
    Олег
    Ссылки могут видеть только зарегистрированные пользователи. Зарегистрируйтесь или авторизуйтесь для просмотра ссылок! )))
    --- сообщения объединены, 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
    44
    1
    Сейчас пытаюсь довести алгоритм своего скетча, подскажи, в вашей прошивке время отсчета паузы начинается после доведения температуры до t начала паузы?
     
  12. Phantom

    Phantom Active Member

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

    alexgo Active Member

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

    Phantom Active Member

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

    alexgo Active Member

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

    0Scotch0 Участник

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

    Phantom Active Member

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

    mishgan Active Member

    Регистрация:
    29.04.2014
    184
    45
    А я сделал у себя так. Если параметры 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
    17
    1
    Имя:
    Sergey
    А как-то можно убрать минимальную продолжительность паузы в 1 минуту?
     
  20. Phantom

    Phantom Active Member

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