コード例 #1
0
ファイル: HVAC.cpp プロジェクト: CuriousTech/ESP8266-HVAC
// Service: called once per second
void HVAC::service()
{
  tempCheck();

  static uint16_t old[4];
  if(m_remoteTimer) // let user change values for some time before sending
  {
    if(--m_remoteTimer == 0)
    {
      if(old[0] != ee.coolTemp[0])  sendCmd("cooltempl", old[0] = ee.coolTemp[0]); 
      if(old[1] != ee.coolTemp[1])  sendCmd("cooltemph", old[1] = ee.coolTemp[1]);
      if(old[2] != ee.heatTemp[0])  sendCmd("heattempl", old[2] = ee.heatTemp[0]);
      if(old[3] != ee.heatTemp[1])  sendCmd("heattemph", old[3] = ee.heatTemp[1]);

      if(ee.heatMode != m_setHeat)  sendCmd("heatmode", ee.heatMode = m_setHeat);
      if(ee.Mode != m_setMode)      sendCmd("mode", ee.Mode = m_setMode);
    }
  }
}
コード例 #2
0
ファイル: HVAC.cpp プロジェクト: lvgeek/ESP8266-HVAC
// Service: called once per second
void HVAC::service()
{
  if(m_bFanRunning || m_bRunning || m_furnaceFan)  // furance runs fan seperately
  {
    filterInc();
    if(m_fanOnTimer < 0xFFFF)
      m_fanOnTimer++;               // running time counter

    if(m_furnaceFan)                // fake fan status for furnace fan
      m_furnaceFan--;
  }

  if(m_fanPostTimer)                // Fan continuation delay
  {
    if(--m_fanPostTimer == 0)
      if(!m_bRunning && m_bFanMode == false) // Ensure system isn't running and fanMode is auto
        fanSwitch(false);
  }

  if(m_overrideTimer)       // User temp override timer
  {
    if(--m_overrideTimer == 0)
    {
      m_ovrTemp = 0;
      calcTargetTemp(m_EE.Mode);  // recalc normal set temp
    }
  }

  if(m_bRunning)
  {
    m_runTotal++;
    if(++m_cycleTimer < 20)           // Block changes for at least 20 seconds after a start
      return;
    if(m_cycleTimer >= m_EE.cycleMax)   // running too long (todo: skip for eHeat?)
    {
      m_bStop = true;
      m_notif = Note_CycleLimit; // cycle limit hit
    }
  }
  else
  {
    m_idleTimer++;                     // Time since stopped
  }

  if(m_setMode != m_EE.Mode || m_setHeat != m_EE.heatMode)    // requested HVAC mode change
  {
    if(m_bRunning)                     // cycleTimer is already > 20s here
      m_bStop = true;
    if(m_idleTimer >= 5)
    {
      m_EE.heatMode = m_setHeat;
      m_EE.Mode = m_setMode;           // User may be cycling through modes (give 5s)
      calcTargetTemp(m_EE.Mode);
    }
  }

  int8_t hm = (m_EE.heatMode == Heat_Auto) ? m_AutoHeat : m_EE.heatMode; // true heat mode
  int8_t mode = (m_EE.Mode == Mode_Auto) ? m_AutoMode : m_EE.Mode;      // tue heat/cool mode

  if(m_bStart && !m_bRunning)             // Start signal occurred
  {
    m_bStart = false;
    
    switch(mode)
    {
      case Mode_Cool:
        fanSwitch(true);
        if(digitalRead(P_REV) != HIGH)
        {
          digitalWrite(P_REV, HIGH);  // set heatpump to cool (if heats, reverse this)
          delay(3000);               //    if no heatpump, remove
        }
        digitalWrite(P_COOL, HIGH);
        break;
    case Mode_Heat:
        if(hm)  // gas
        {
          digitalWrite(P_HEAT, HIGH);
        }
        else
        {
          fanSwitch(true);
          if(digitalRead(P_REV) != LOW)  // set heatpump to heat (if heats, reverse this)
          {
            digitalWrite(P_REV, LOW);
            delay(3000);
          }
          digitalWrite(P_COOL, HIGH);
        }
        break;
    }
    m_bRunning = true;
    if(m_EE.humidMode == HM_Run)
      humidSwitch(true);
    m_cycleTimer = 0;
  }

  if(m_bStop && m_bRunning)             // Stop signal occurred
  {
    m_bStop = false;
    digitalWrite(P_COOL, LOW);
    digitalWrite(P_HEAT, LOW);

    if(m_EE.humidMode == HM_Run)      // shut off after heat/cool phase
      humidSwitch(false);

    if(m_bFanRunning && m_bFanMode == false) // Note: furnace manages fan
    {
      if(m_EE.fanPostDelay[digitalRead(P_REV)])         // leave fan running to circulate air longer
        m_fanPostTimer = m_EE.fanPostDelay[digitalRead(P_REV)]; // P_REV == true if heating
      else
        fanSwitch(false);
    }
  
    if(mode == Mode_Heat && hm)   // count run time as fan time in winter
    {                             // furnace post fan is 120 seconds
      m_furnaceFan = FF_DELAY;
    }

    m_bRunning = false;
    m_idleTimer = 0;
  }

  tempCheck();
}