Initial commit. Heater rev2 - features cut-off on relay temperature
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
config.h
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Number Heater_Mode "Heater mode" <switch> {channel="modbus:data:Heater:H:Heater_Mode:number"}
|
||||||
|
Switch Heater_State "Heater state" <switch> {channel="modbus:data:Heater:H:Heater_State:switch"}
|
||||||
|
Number Heater_RelayT "Heater relay temperature [%.1f °C]" <temperature> {channel="modbus:data:Heater:H:Heater_RelayT:number"}
|
||||||
|
Number Heater_Overheat "Heater relay overheated" <switch> {channel="modbus:data:Heater:H:Heater_Overheat:number"}
|
||||||
|
Switch Heater_OverrideState "Heater override state" <switch> {channel="modbus:data:Heater:H:Heater_OverrideState:switch"}
|
||||||
@@ -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"]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
+138
@@ -0,0 +1,138 @@
|
|||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <ModbusIP_ESP8266.h>
|
||||||
|
#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();
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Reference in New Issue
Block a user