Initial commit. Heater rev2 - features cut-off on relay temperature

This commit is contained in:
ftc
2022-09-12 23:32:00 +03:00
commit cff46248b8
7 changed files with 158 additions and 0 deletions
+138
View File
@@ -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();
}
}