помогите с кодом пожалуйста

Тема в разделе "Arduino & Shields", создана пользователем Eone, 1 июл 2013.

  1. Eone

    Eone Нуб

    Код (C):
    boolean Day = (Hour >= lightOn && Hour <lightOff);
    tStatus = (t < ((Day) ? tempDay : tempNight))? LOW:HIGH;
    if (t < (Day) ? tempDay : tempNight - 2 || t == (Day) ? tempDay : tempNight)
    {
      digitalWrite(tPIN, tStatus);
    }
    t - показания с датчика
    tempDay и tempNight переменные задания температуры дня и ночи
    tStatus принимает значения LOW и HIGH, которые управляют пином включения ламп
    проблема в том что данный регулятор нагревает до определенной температуры и начинает судорожно переключать реле при изменении температуры около точки регулирования

    c помощью введения строки if хотелось достигнуть того что после достижения заданной температуры, выполнение регулирования будет возобновленно после того как температура упадет на 2 градуса по сравнению с заданием "t < (Day) ? tempDay : tempNight - 2" и будет выполнятся до наступления равенства с заданием.
    укажите пожалуйста на ошибку т.к. сейчас происходит мерцание ламп без выполнения условия if
    я подозреваю что не выполняется именно вычет из "t < (Day) ? tempDay : tempNight - 2" двух градусов изза неправильной расстановки скобок или чего либо еще и -2 относится к части выражения "tempNight - 2"
     
  2. Unixon

    Unixon Оракул Модератор

    Гистерезис добавьте. Переключение вблизи точки равновесия должно происходить при разных значениях в зависимости от направления изменения величины. В вашем примере вблизи равновесной температуры должно быть некоторое "окно" в какое то количество градусов, внутри которого не должно быть реакции на "шум", а переключение только при пересечении верхней и нижней границ интервала.
     
    Megakoteyka нравится это.
  3. Unixon

    Unixon Оракул Модератор

    Код (C):
    const int PIN_HEATCTL = 13;
    const float DAY_EQ_TEMP = 25.0;
    const float NIGHT_EQ_TEMP = 18.0;
    const float TEMP_ERROR = 2.0;
    const int LIGHT_ON_HOUR = 9;
    const int LIGHT_OFF_HOUR = 21;

    int status = 0;

    void loop()
    {
     bool is_daytime = ((hour >= LIGHT_ON_HOUR) && (hour < LIGHT_OFF_HOUR));
     float switch_temp = is_daytime ? DAY_EQ_TEMP : NIGHT_EQ_TEMP;
     if (status)
     {
      if (temp > (switch_temp+TEMP_ERROR))
      {
       status = 0;
      }
     }
     else
     {
      if (temp < (switch_temp-TEMP_ERROR))
      {
       status = 1;
      }
     }
     digitalWrite(PIN_HEATCTL, status);
    }
     
    Eone и Mitrandir нравится это.
  4. Eone

    Eone Нуб

    спасибо! очень интересное решение. я всетаки вылечил свой код путем расставления скобок (внимательно прочилал статью на вашем вики :)) щас регулирование осуществляется формулой.
    ваш код более гибкий к изменениям и проще читается логика в случае если надо будет искать ошибки. буду использовать его :)