void loop(void) { SetTemp=cfg.DispTemp; SetHumi=cfg.DispHumi; float ndo = read_ds(&ds_stt); if(ndo!=9999) NowTemp=ndo; read_dht(&dht_temp,&dht_humi); double gap = abs(SetTemp-NowTemp); //distance away from setpoint if (gap < 10){ //we're close to setpoint, use conservative tuning parameters myPID.SetTunings(consKp, consKi, consKd); }else{ //we're far from setpoint, use aggressive tuning parameters myPID.SetTunings(aggKp, aggKi, aggKd); } myPID.Compute(); analogWrite(SSR_PIN, (byte)OutPWM); if(dht_humi<SetHumi){ digitalWrite(HUMI_GENERATE, HIGH);}else{ digitalWrite(HUMI_GENERATE, LOW);} Display(); }
inline void timerDHT(t) { static int cycles; // State machine static int ost, st = 0; switch (ost = st) { case 0: // Wait 2 seconds to allow the sensor make measurements if (++cycles < 40) { // 2sec / 0.05s = 40 *dht.timer += 50000; // Set delay of 50000 us = 0.05s break; } P1DIR |= dht.pin; // Set pin to output direction P1OUT &= ~dht.pin; // Set output low P1REN &= ~dht.pin; *dht.timer += 20000; // Set delay of 20 ms st = 1; break; case 1: // Wait for the sensor response, and process it P1DIR &= ~dht.pin; // Set pin to input direction P1OUT |= dht.pin; // Set input high P1REN |= dht.pin; __disable_interrupt(); dht.error = read_dht(); __enable_interrupt(); st = 0; break; } if(ost ^ st) { cycles = 0; dht.debug++; } }