#include #include #include "config.h" // modbus consts and works #define TCP_PORT 15000 #define POLL_INTERVAL 10000 #define T_UPDATE_INTERVAL 500 #define MODE_AUTO 0 #define MODE_MANUAL 1 #define REGISTER_MODE 0 #define REGISTER_CUR_STATE 1 #define REGISTER_RELAY_TEMP 2 #define REGISTER_OVERHEAT 3 #define REGISTER_OVERRIDE_STATE 4 // critical relay temp (degrees multiplied by 100) #define CRITICAL_T 6000 ModbusIP mb; char id[64]; long last_poll; long last_update; int cur_mode = MODE_AUTO; int cur_state = 0; int relay_t = 0; int overheat = 0; int override_state = 0; void setup() { pinMode(D1, OUTPUT); Serial.begin(115200); Serial.println("Initialised..."); WiFi.begin(WIFI_NAME, WIFI_PASS); Serial.print("Connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("Connected, IP address: "); Serial.println(WiFi.localIP()); 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("Connected, mac address: %s\n", id); last_poll = millis(); mb.server(15000); mb.addHreg(REGISTER_MODE, cur_mode); mb.addHreg(REGISTER_CUR_STATE, cur_state); mb.addHreg(REGISTER_RELAY_TEMP, relay_t); mb.addHreg(REGISTER_OVERHEAT, overheat); mb.addHreg(REGISTER_OVERRIDE_STATE, override_state); } // thermistor #define THERMISTORPIN A0 #define THERMISTORNOMINAL 10000 #define TEMPERATURENOMINAL 25 #define NUMSAMPLES 5 #define BCOEFFICIENT 3950 #define SERIESRESISTOR 10000 void UpdateCurrent() { float average = 0; for (int i = 0; i < NUMSAMPLES; i++) { average += analogRead(THERMISTORPIN); delay(10); } average /= NUMSAMPLES; average = 1023 / average - 1; average = SERIESRESISTOR / average; float steinhart; steinhart = average / THERMISTORNOMINAL; // (R/Ro) steinhart = log(steinhart); // ln(R/Ro) steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) steinhart = 1.0 / steinhart; // инвертируем steinhart -= 273.15; // конвертируем в градусы по Цельсию relay_t = int(steinhart * 100); last_update = millis(); } void loop() { unsigned long current = millis(); int u = 0; if (current < last_update || current - last_update >= T_UPDATE_INTERVAL) { UpdateCurrent(); u = 1; } mb.task(); cur_mode = mb.Hreg(REGISTER_MODE); override_state = mb.Hreg(REGISTER_OVERRIDE_STATE); if (cur_mode == MODE_AUTO) { cur_state = mb.Hreg(REGISTER_CUR_STATE); } else { cur_state = override_state; } if (relay_t > CRITICAL_T) { Serial.printf("Critical overheat, t = %d\n", relay_t); cur_state = 0; overheat = 1; } else overheat = 0; digitalWrite(D1, cur_state); if (u) { Serial.printf("Cur state %d Cur relay t %d\n", cur_state, relay_t); } mb.Hreg(REGISTER_MODE, cur_mode); mb.Hreg(REGISTER_RELAY_TEMP, relay_t); mb.Hreg(REGISTER_OVERHEAT, overheat); mb.Hreg(REGISTER_CUR_STATE, cur_state); if (WiFi.status() != WL_CONNECTED) { // no wifi Serial.println("No WiFi connection"); ESP.restart(); } }