//Built-in #include #include #include // Additoinal Libraries #include #include #include #include // LiquidMenu_config.h needs to be modified to use I2C. #include #include // My Includes #include "config.h" #include "button.h" // Pin definitions #define encoderCLK 2 #define encoderDT 3 #define encoderBTN 4 #define kettlePWM 5 // Global variables. byte KettleDuty = 0; bool KettleOn = false; // User I/O objects. Button Enter; MD_REncoder rotary = MD_REncoder(encoderDT, encoderCLK); LiquidCrystal_I2C lcd(0x27,20,4); float output = 0; int updateInterval = 1000; EthernetClient net; MQTTClient mqtt_client; unsigned long lastRun = 0; // Return a character array to represent the // On/Off state of the kettle. char* KettleState() { if (KettleOn) { return (char*)"On"; } else { return (char*)"Off"; } } // 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(); if (result == DIR_CW && KettleDuty < 100) { KettleDuty++; } else if (result == DIR_CCW && KettleDuty > 0) { KettleDuty--; } } // LCD menu setup. LiquidLine KettleState_line(0, 0, "Boil Kettle ", KettleState); LiquidLine kettle_power_line(0, 1, "Kettle Power % ", KettleDuty); LiquidScreen home_screen(KettleState_line, kettle_power_line); LiquidMenu menu(lcd); void setup() { unsigned long lastRun = millis() - updateInterval; Serial.begin(9600); rotary.begin(); Ethernet.begin(mac, ip); Serial.println("Setting up..."); attachInterrupt(digitalPinToInterrupt(encoderCLK), doEncoder, CHANGE); attachInterrupt(digitalPinToInterrupt(encoderDT), doEncoder, CHANGE); pinMode(encoderCLK, INPUT_PULLUP); pinMode(encoderDT, INPUT_PULLUP); Enter.begin(encoderBTN); pinMode(encoderBTN, INPUT_PULLUP); // if you get a connection, report back via serial: if (Ethernet.linkStatus() == LinkON) { SetupMQTT(MQTT_BROKER); } else { // if you didn't get a connection to the server: Serial.println("connection failed"); } lcd.init(); lcd.backlight(); menu.init(); menu.add_screen(home_screen); menu.update(); }; void UpdateBoilKettle(){ static byte last_KettleDuty = 0; if (Enter.pressed()) { KettleOn = !KettleOn; menu.update(); } if (last_KettleDuty != KettleDuty) { last_KettleDuty = KettleDuty; menu.update(); } if (KettleOn) { slowPWM(kettlePWM, KettleDuty, PeriodPWM); } else { slowPWM(kettlePWM, 0, PeriodPWM); } } void loop() { UpdateBoilKettle(); unsigned long elapsedTime = (millis() - lastRun); if (elapsedTime >= updateInterval) { mqtt_client.loop(); //if (!mqtt_client.connected()) ConnectMQTT(); SendSensorData(); lastRun = millis(); } }