#include "chiller.h"
#include "display.h"
#include "encoder.h"
#include <EEPROM.h>
// TO DO:
// turn on and turn off loging
// duration the chiller / heater ran for
// power consumption
// send temperature
// I2C slave
// ability to control additional chillers and become slave chiller
// failsafe (done)
// operating temperature and shut off on over heat
const int ENCODER_CLK = 2;
const int ENCODER_DT = 4;
const int ENCODER_SW = 3;
int thermistorPin = A2;
int peltierPin = 5;
int modePin = 7;
long lastInput = millis();
void encoderClick();
void encoderValueChange(int delta);
Encoder encoder;
Chiller chiller;
Screen screen;
int cursor = 0;
struct Setting{
float targetTemp;
float threshold;
bool autoHeating;
int channel;
int failsafe;
} setting;
void setup() {
Serial.begin(115200);
Serial.println("Initializing...");
loadConfig();
chiller.init(peltierPin, thermistorPin, modePin);
chiller.setTargetTemp(setting.targetTemp,setting.threshold,setting.autoHeating, setting.failsafe);
Serial.println("Ready");
screen.init();
encoder.begin(ENCODER_CLK,ENCODER_DT,ENCODER_SW);
encoder.setCallback(encoderValueChange,encoderClick);
saveConfig();
}
void loop() {
chiller.run();
char temp[5];
float t = chiller.getCurrentTemp();
dtostrf(t,1,1,temp);
temp[4] = 'c';
// if in settings mode or menu and no input detected for 60s then exit menu
if((millis() - lastInput) > 60000 && screen.screenMode != IDLE){
screen.screenMode = IDLE;
}
if(screen.screenMode == IDLE){
screen.showTemp(temp);
screen.showIcon(chiller.getMode(), 14,1);
}else if(screen.screenMode == SETTINGS){
screen.showMenu(screen.cursor);
}else if(screen.screenMode == MENU){
if(screen.cursor == 0) {
screen.showOptionF(screen.cursor, setting.targetTemp);
}
else if(screen.cursor == 1){
screen.showOptionF(screen.cursor, setting.threshold);
}
else if(screen.cursor == 2){
screen.showOptionB(screen.cursor, setting.autoHeating);
}
else if(screen.cursor == 3){
screen.showOption(screen.cursor, String(setting.channel));
}
else if(screen.cursor == 4){
screen.showOption(screen.cursor, String(setting.failsafe));
}
}
delay(1000);
}
void loadConfig() {
// Serial.println("Loading configuration");
// //EEPROM.begin(1024);
// byte sig = EEPROM.read(0);
// EEPROM.get(1, setting);
// //EEPROM.commit();
// //EEPROM.end();
// if(sig != 1){
// Serial.println("First run");
setting.targetTemp = 26;
setting.autoHeating = true;
setting.threshold = 1;
setting.channel = 1;
setting.failsafe = 30;
// }
// Serial.println("Loaded");
}
void saveConfig() {
// Serial.println("Saving configuration");
// //EEPROM.begin(1024);
// EEPROM.put(0, byte(1));
// EEPROM.put(1, setting);
// //EEPROM.commit();
// //EEPROM.end();
// Serial.println("Saved");
}
void encoderClick();
void encoderValueChange(int delta);
void encoderClick(){
lastInput = millis();
if(screen.screenMode == IDLE){
screen.screenMode = SETTINGS;
}else if(screen.screenMode == SETTINGS){
if(screen.cursor == 5){
screen.screenMode = IDLE;
}
else{
screen.screenMode = MENU;
}
}else if(screen.screenMode == MENU){
screen.screenMode = SETTINGS;
}
}
void encoderValueChange(int delta){
lastInput = millis();
if(screen.screenMode == SETTINGS){
screen.cursor += delta;
if(screen.cursor >= 5)
screen.cursor = 0;
if(screen.cursor <= -1)
screen.cursor = 4;
}else if(screen.screenMode == MENU){
float change = (float)delta / 2.0;
if(screen.cursor == 0){
if((delta > 0 && setting.targetTemp < 29) || (delta < 0 && setting.targetTemp > 25)){
setting.targetTemp += change;
}
chiller.setTargetTemp(setting.targetTemp,setting.threshold,setting.autoHeating, setting.failsafe);
}else if(screen.cursor == 1){
if((delta > 0 && setting.threshold < 1) || (delta < 0 && setting.threshold > 0.5)){
setting.threshold += change;
}
chiller.setTargetTemp(setting.targetTemp,setting.threshold,setting.autoHeating, setting.failsafe);
}else if(screen.cursor == 2){
if(setting.autoHeating == true)
setting.autoHeating = false;
else
setting.autoHeating = true;
chiller.setTargetTemp(setting.targetTemp,setting.threshold,setting.autoHeating, setting.failsafe);
}else if(screen.cursor == 3){
setting.channel += delta;
if(setting.channel > 32)
{
setting.channel = 1;
}else if(setting.channel <1){
setting.channel = 32;
}
}else if(screen.cursor == 4){
setting.failsafe += delta;
if(setting.failsafe > 60)
{
setting.failsafe = 1;
}else if(setting.failsafe <1){
setting.failsafe = 60;
}
chiller.setTargetTemp(setting.targetTemp,setting.threshold,setting.autoHeating, setting.failsafe);
}
saveConfig();
}
}