#include "../globals.h" // Interrupt function to run when encoder is turned. // // Increases/decreases the kettle output to a max // of 100% and minimum of 0%. void doEncoder() { uint8_t result = rotary.read(); uint8_t inc; if (result) { uint8_t speed = rotary.speed(); speed >= 10 ? inc = 5 : inc = 1; if (result == DIR_CCW) inc = inc * -1; } SettingChanged = true; if (KettleController.Mode() == MANUAL) { uint8_t KettleDuty = (uint8_t)KettleController.Power(); KettleDuty = max(0, min((KettleDuty / inc) * inc + inc, 100)); KettleController.Power((double)KettleDuty); } else if (KettleController.Mode() == AUTOMATIC) { uint8_t KettleTemp = (uint8_t)KettleController.Setpoint(); KettleTemp = max(0, min((KettleTemp / inc) * inc + inc, 220)); KettleController.Setpoint((double)KettleTemp); } else { SettingChanged = false; } } // Return a character array to represent the // state of the kettle. char* ShowKettleState() { if (KettleController.Mode() == MANUAL) { return (char*)F("Kettle: Manual"); } else if (KettleController.Mode() == AUTOMATIC) { return (char*)F("Kettle: Auto"); } else { return (char*)F("Kettle: Off"); } } char* ShowKettleSetting() { static char LCD_Line[21]; char setting[4]; if (KettleController.Mode() == MANUAL) { strcpy(LCD_Line, (char*)F("Kettle Power: ")); itoa(KettleController.Power(), setting, 10); strcat(LCD_Line, setting); strcat(LCD_Line, (char*)F("%")); return LCD_Line; } else if (KettleController.Mode() == AUTOMATIC) { strcpy(LCD_Line, (char*)F("Kettle Temp: ")); itoa(KettleController.Setpoint(), setting, 10); strcat(LCD_Line, setting); strcat(LCD_Line, (char*)F("F")); return LCD_Line; } else { return (char*)""; } } void UpdateBoilKettle(){ if (Enter.pressed()) { KettleController.CycleMode(); SettingChanged = true; } if (SettingChanged) { menu.update(); SettingChanged = false; } if (KettleController.Mode() != OFF) { if (KettleController.Compute()) KettleDuty = KettleController.Power(); digitalWrite(O_PWM, boilPWM.compute(KettleDuty)); } else { digitalWrite(O_PWM, boilPWM.compute(0)); } }