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++;
    }
}