From 8750bceead8888fa6194862c7e7610754a6c6a0f Mon Sep 17 00:00:00 2001 From: Chris Giacofei Date: Wed, 19 Jan 2022 16:30:26 -0500 Subject: [PATCH] Load config to EEPROM --- boil_kettle/boil_kettle.ino | 3 ++ boil_kettle/eeprom_init.h | 66 +++++++++++++++++++++++++++++++++++++ boil_kettle/mqtt.ino | 40 +++++++++++----------- 3 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 boil_kettle/eeprom_init.h diff --git a/boil_kettle/boil_kettle.ino b/boil_kettle/boil_kettle.ino index 269a964..f27729f 100644 --- a/boil_kettle/boil_kettle.ino +++ b/boil_kettle/boil_kettle.ino @@ -2,6 +2,7 @@ #include #include #include +#include // Additoinal Libraries #include @@ -13,6 +14,7 @@ // My Includes #include "config.h" +#include "eeprom_init.h" #include "button.h" #include "slowPWM.h" @@ -70,6 +72,7 @@ LiquidScreen home_screen(KettleState_line, kettle_power_line); LiquidMenu menu(lcd); void setup() { + StoreEEPROM(); unsigned long lastRun = millis() - UpdateInterval; Serial.begin(9600); diff --git a/boil_kettle/eeprom_init.h b/boil_kettle/eeprom_init.h new file mode 100644 index 0000000..98aef3d --- /dev/null +++ b/boil_kettle/eeprom_init.h @@ -0,0 +1,66 @@ +#include + +const uint8_t CompileTimeP[] PROGMEM = __DATE__ " " __TIME__; +const size_t ConfAddress = sizeof(CompileTimeP); + +unsigned char b, e = -1, *p = (uint8_t*)CompileTimeP - 1; + +struct Vessel { + String name; + String setpoint; + String sensor; + double Rref; + double RNominal; +}; + +struct Topic { + String root; + Vessel mash; + Vessel boil; +}; + +struct Mqtt { + char broker[14]; + char user[10]; + char password[21]; + Topic topic; +}; + +struct ConfigData { + Mqtt mqtt; + int interval; + int period; + uint8_t threshold; + uint8_t hysteresis; +}; + +void StoreEEPROM() { + while( b = pgm_read_byte( ++p ) ){ + if( b != EEPROM[++e] ){ + + Vessel BoilKettle {"boil_kettle", BOIL_SETPOINT_TOPIC, BOIL_ACTUAL_TOPIC, RREF_KETTLE, RNOMINAL_KETTLE}; + Vessel MashTun {"mash_tun", MASH_SETPOINT_TOPIC, MASH_ACTUAL_TOPIC, RREF_MASH, RNOMINAL_MASH}; + Topic mqtt_topics {TOPIC_ROOT, MashTun, BoilKettle}; + Mqtt mqtt_data; + strcpy(mqtt_data.broker, MQTT_BROKER); + strcpy(mqtt_data.user, MQTT_USER); + strcpy(mqtt_data.password, MQTT_PASSWORD); + mqtt_data.topic = mqtt_topics; + + + ConfigData conf { + mqtt_data, + UpdateInterval, + PeriodPWM, + ThreshPWR, + Hysteresis + }; + + EEPROM.put(ConfAddress, conf); + Serial.println(conf.mqtt.broker); + + while( b = pgm_read_byte( p++ ) ) EEPROM[e++] = b; + break; + } + } +} diff --git a/boil_kettle/mqtt.ino b/boil_kettle/mqtt.ino index f3aeafd..354470b 100644 --- a/boil_kettle/mqtt.ino +++ b/boil_kettle/mqtt.ino @@ -1,6 +1,12 @@ void ConnectMQTT() { - static const char *password = MQTT_PASSWORD; - static const char *user = MQTT_USER; + ConfigData config; + EEPROM.get(ConfAddress, config); + + static const char *user = config.mqtt.user; + static const char *password = config.mqtt.password; + //config.mqtt.topic.root + //config.mqtt.broker + Serial.println("connecting MQTT..."); while (!mqtt_client.connect("brewhouse", user, password)) { Serial.print("."); @@ -8,11 +14,14 @@ void ConnectMQTT() { } Serial.println("\nconnected!"); - mqtt_client.subscribe("brewery/setpoint/bk"); + + mqtt_client.subscribe(config.mqtt.topic.root + config.mqtt.topic.boil.setpoint); + mqtt_client.subscribe(config.mqtt.topic.root + config.mqtt.topic.mash.setpoint); } void MessageReceived(String &topic, String &payload) { - Serial.println("incoming: " + topic + " - " + payload); + ConfigData config; + EEPROM.get(ConfAddress, config); /** JSON Parser Setup */ StaticJsonDocument<200> doc; @@ -22,29 +31,20 @@ void MessageReceived(String &topic, String &payload) { // Test if parsing succeeds. if (error) { - Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); return; } - char buf[30]; - strcpy(buf,TOPIC_PREFIX); - strcat(buf,BOIL_SETPOINT_TOPIC); - if (topic == buf) { + + if (topic == config.mqtt.topic.root + config.mqtt.topic.boil.setpoint) { // Update PWM setpoint. - String name = doc["entity"]; String setting = doc["setpoint"]; - KettleDuty = setting.toInt(); - String unit = doc["units"]; - - Serial.println("Updating setpoint for " + name + " to " + setting + " " + unit); } } void SetupMQTT(const char *broker) { // Note: Local domain names (e.g. "Computer.local" on OSX) are not supported // by Arduino. You need to set the IP address directly. - Serial.println("Setup MQTT client."); mqtt_client.begin(broker, net); mqtt_client.onMessage(MessageReceived); @@ -52,20 +52,20 @@ void SetupMQTT(const char *broker) { } static void SendSensorData() { - Serial.println("Sending data..."); - + ConfigData config; + EEPROM.get(ConfAddress, config); // NOTE: max message length is 250 bytes. StaticJsonDocument<200> doc; - doc["entity"] = "boil_kettle"; + doc["entity"] = config.mqtt.topic.boil.name; doc["setpoint"] = KettleDuty; doc["units"] = "%"; String jstr; serializeJson(doc, jstr); - String topic = TOPIC_PREFIX; - topic += "sensor/boil_kettle"; + String topic = config.mqtt.topic.root; + topic += config.mqtt.topic.boil.sensor; mqtt_client.publish(topic, jstr);