commit cff46248b8e8841e110384823e9eb9f1d82c6a4b Author: Denis Denisov Date: Mon Sep 12 23:32:00 2022 +0300 Initial commit. Heater rev2 - features cut-off on relay temperature diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0e56cf2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +config.h diff --git a/Heater.items b/Heater.items new file mode 100644 index 0000000..84dfd65 --- /dev/null +++ b/Heater.items @@ -0,0 +1,5 @@ +Number Heater_Mode "Heater mode" {channel="modbus:data:Heater:H:Heater_Mode:number"} +Switch Heater_State "Heater state" {channel="modbus:data:Heater:H:Heater_State:switch"} +Number Heater_RelayT "Heater relay temperature [%.1f °C]" {channel="modbus:data:Heater:H:Heater_RelayT:number"} +Number Heater_Overheat "Heater relay overheated" {channel="modbus:data:Heater:H:Heater_Overheat:number"} +Switch Heater_OverrideState "Heater override state" {channel="modbus:data:Heater:H:Heater_OverrideState:switch"} diff --git a/Heater.things b/Heater.things new file mode 100644 index 0000000..c573f20 --- /dev/null +++ b/Heater.things @@ -0,0 +1,9 @@ +Bridge modbus:tcp:Heater [ host="192.168.0.21", port=15000, id=1 ] { + Bridge poller H[start = 0, length = 5, type = "holding", refresh = 500] { + Thing data Heater_Mode[readStart = "0", readValueType = "int16", writeStart="0", writeValueType="int16", writeType="holding"] + Thing data Heater_State[readStart = "1", readValueType = "int16", writeStart="1", writeValueType="int16", writeType="holding"] + Thing data Heater_RelayT[readStart = "2", readValueType = "int16", readTransform="JS(divide100.js)"] + Thing data Heater_Overheat[readStart = "3", readValueType = "int16"] + Thing data Heater_OverrideState[readStart = "4", readValueType = "int16", writeStart="4", writeValueType="int16", writeType="holding"] + } +} diff --git a/config.h.sample b/config.h.sample new file mode 100644 index 0000000..9d6aa18 --- /dev/null +++ b/config.h.sample @@ -0,0 +1,5 @@ + +#define WIFI_NAME "your wi-fi name" +#define WIFI_PASS "you wi-fi password" +#define REMOTE_ADDR "IP address of host to send data to" +#define REMOTE_PORT 7000 diff --git a/heater_v2.ino b/heater_v2.ino new file mode 100644 index 0000000..609f1b7 --- /dev/null +++ b/heater_v2.ino @@ -0,0 +1,138 @@ +#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(); + } +} diff --git a/scheme.pdf b/scheme.pdf new file mode 100644 index 0000000..547342b Binary files /dev/null and b/scheme.pdf differ diff --git a/scheme.rrb b/scheme.rrb new file mode 100644 index 0000000..baccc51 Binary files /dev/null and b/scheme.rrb differ