#include #include #include #include #include "config.h" #include "LittleFS.h" #define RELAY_PIN D2 #define TEMP_SENSOR_PIN D5 // network // After how much time without connection we will // reboot (in millis) #define NON_CONNECTED_REBOOT_TIMEOUT 60000 #define RECONNECT_TIMEOUT 10000 IPAddress my_ip(MY_IP); IPAddress gateway(MY_GW); IPAddress subnet(MY_NET); // modbus consts and works #define TCP_PORT 15000 #define POLL_INTERVAL 10000 #define T_UPDATE_INTERVAL 2000 #define MODE_AUTO 0 #define MODE_MANUAL 1 #define REGISTER_ON_TEMP 0 #define REGISTER_OFF_TEMP 1 #define REGISTER_MODE 2 #define REGISTER_CUR_TEMP 3 #define REGISTER_CUR_STATE 4 #define REGISTER_SECONDARY_TEMP 5 ModbusIP mb; OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature sensor(&oneWire); char id[64]; long last_poll; long last_update; int t_on = 100; int t_off = 1000; int cur_mode = MODE_AUTO; int cur_t = 0; int cur_state = 0; bool TryLoad(char *filename) { File f = LittleFS.open(filename, "r"); if (!f) return false; String s = f.readStringUntil('\n'); t_on = atoi(s.c_str()); s = f.readStringUntil('\n'); t_off = atoi(s.c_str()); f.close(); if (t_on == 0) return false; return true; } void LoadState() { if (TryLoad("/settings.txt")) return; TryLoad("/settings.txt.bak"); } void SaveTo(char *filename) { File f = LittleFS.open(filename, "w"); if (!f) return; f.println(t_on); f.println(t_off); f.close(); } void SaveState() { SaveTo("/settings.txt"); SaveTo("/settings.txt.bak"); } void setup() { if (!LittleFS.begin()) { Serial.println("Unable to mount the filesystem"); ESP.restart(); } LoadState(); pinMode(RELAY_PIN, OUTPUT); pinMode(TEMP_SENSOR_PIN, INPUT); Serial.begin(115200); Serial.println("Initialised..."); WiFi.mode(WIFI_STA); WiFi.config(my_ip, gateway, subnet); WiFi.setAutoReconnect(true); WiFi.begin(WIFI_NAME, WIFI_PASS); Serial.print("Connecting"); delay(500); Serial.println(); uint8_t macAddr[6]; WiFi.macAddress(macAddr); sprintf(id, "%02x:%02x:%02x:%02x:%02x:%02x", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]); Serial.printf("mac address: %s\n", id); last_poll = millis(); mb.server(15000); mb.addHreg(REGISTER_ON_TEMP, t_on); mb.addHreg(REGISTER_OFF_TEMP, t_off); mb.addHreg(REGISTER_MODE, cur_mode); mb.addHreg(REGISTER_CUR_TEMP, cur_t); mb.addHreg(REGISTER_CUR_STATE, cur_state); mb.addHreg(REGISTER_SECONDARY_TEMP, cur_t); // sensor.begin(); sensor.setResolution(12); sensor.requestTemperatures(); } void UpdateCurrent() { cur_t = int(sensor.getTempCByIndex(0) * 100); last_update = millis(); } unsigned long last_connected = 0; unsigned long last_connecting = 0; void loop() { unsigned long current = millis(); int u = 0; if (current < last_update || current - last_update >= T_UPDATE_INTERVAL) { UpdateCurrent(); u = 1; } mb.task(); t_on = mb.Hreg(REGISTER_ON_TEMP); t_off = mb.Hreg(REGISTER_OFF_TEMP); cur_mode = mb.Hreg(REGISTER_MODE); if (cur_mode == 0) { if (cur_t < t_on) cur_state = 1; else if (cur_t > t_off) cur_state = 0; mb.Hreg(REGISTER_CUR_STATE, cur_state); } else { cur_state = mb.Hreg(REGISTER_CUR_STATE); } digitalWrite(RELAY_PIN, cur_state); if (u) { SaveState(); Serial.println("Cur state"); Serial.println(cur_state); Serial.println(cur_t); } mb.Hreg(REGISTER_ON_TEMP, t_on); mb.Hreg(REGISTER_OFF_TEMP, t_off); mb.Hreg(REGISTER_MODE, cur_mode); mb.Hreg(REGISTER_CUR_TEMP, cur_t); mb.Hreg(REGISTER_SECONDARY_TEMP, cur_t); if (WiFi.status() != WL_CONNECTED) { if (current < last_connecting || current - last_connecting > RECONNECT_TIMEOUT) { WiFi.reconnect(); last_connecting = current; } } else { last_connected = current; } if (current < last_connected || current - last_connected > NON_CONNECTED_REBOOT_TIMEOUT) { SaveState(); ESP.restart(); } }