/*
Version 10
03.02.2023
Code refactor
*/
/*
Version 9
01.02.2023
Fix button for turn on/off screen
Improved blowOff procedure
Add leds
*/
/*
Version 7
05.09.2022
Add start of relay from button
Removed usage of delay by millis
*/
/*
Version 6
__.__.2022
Add "Max tube" that shows the maximum value of temperature in the tube in the current session
*/
#include <LiquidCrystal_I2C.h> // https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
#include <GyverNTC.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// degree centigrade
uint8_t degIco[8] = {
B01000,
B10100,
B01000
};
#define relayPin 7 // relay pin
#define buttonBlowdownPin 3 // pin of button for Blowdown
#define buttonScreenPin 5 // pin of button for turn off screen
#define tempTubePin A0 // temp senesor in tube pin
#define tempRoomPin A2 // temp senesor in room pin
GyverNTC ntcTube(tempTubePin, 10000, 3950, 25, 10000);
GyverNTC ntcRoom(tempRoomPin, 10000, 3950, 25, 10000);
unsigned long lastScreenTime;
unsigned long lastRelayTime;
float delayScreenTime = 5; // var for time in second for screen change delay
float blowdownTime = 60; // var for time in second for blowdown
float delayRelayTime = 5; // var for time in second for delay for check buttons state
float tTube = 0; // temperature in the tube (0 deg for start)
float tRoom = 0; // temperature in the room (0 deg for start)
float tAct = 1; // MAIN VARIABLE!!! How mach temp in tube must be higer than in the room in degrees
float tDiff = 0; // var for difference of temperatures
float tTubeMax = 0; // var for max temperature in the tube during the current session
boolean relayState = 0; // current state of button
boolean buttBlowdownState = 0; // current state of button
boolean buttBlowdownFlag = 0; // last state of button
boolean buttScreenState = 0; // current state of button
boolean buttScreenFlag = 0; // last state of button
boolean screenState = 1; // state of screen turning on/off - on by default
int screenPage = 0; //number of lcd screen page
//leds
#define ledRelayPin 9 // relay pin
#define ledOnPin 11 // relay pin
void setup() {
lcd.begin(16, 2);
lcd.backlight();
lcd.print("Loading...");
lcd.createChar(1, degIco);
Serial.begin(9600);
pinMode(relayPin, OUTPUT);
pinMode(buttonScreenPin, INPUT_PULLUP);
pinMode(buttonBlowdownPin, INPUT_PULLUP);
//leds
pinMode(ledRelayPin, OUTPUT);
pinMode(ledOnPin, OUTPUT);
}
void loop() {
unsigned long currentTime = millis() / 1000; // current time in seconds
tTube = ntcTube.getTempAverage(); // read temp in tube
tRoom = ntcRoom.getTempAverage(); // read temp in room
tDiff = tTube - tRoom; // calculate difference of temperatures
if (tTube > tTubeMax) {
tTubeMax = tTube;
}
//screen backlight control
buttScreenState = !digitalRead(buttonScreenPin);
if ((buttScreenState == 1) && (buttScreenFlag != 1)) {
buttScreenFlag = 1;
screenState = !screenState;
} else if ((buttScreenState == 0) && (buttScreenFlag == 1)) {
buttScreenFlag = 0;
}
if (screenState != 1) {
lcd.noBacklight();
lcd.noDisplay();
//Turn on the Led that shows that power on
digitalWrite(ledOnPin, HIGH); // turn the LED on (HIGH is the voltage level)
} else {
lcd.display();
lcd.backlight();
//Turn off the Led that shows that power on
digitalWrite(ledOnPin, LOW); // turn the LED on (HIGH is the voltage level)
}
//END screen backlight control
if ((currentTime - lastScreenTime >= delayScreenTime) && (screenPage == 0)) {
lastScreenTime = currentTime;
// debug
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tube: ");
lcd.print(tTube);
lcd.print("\x01");
lcd.setCursor(0, 1);
lcd.print("Room: ");
lcd.print(tRoom);
lcd.print("\x01");
screenPage = 1;
} else if ((currentTime - lastScreenTime >= delayScreenTime) && (screenPage != 0)) {
lastScreenTime = currentTime;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Diff: ");
lcd.print(tDiff);
lcd.print("\x01");
lcd.setCursor(0, 1);
lcd.print("Max tube: ");
lcd.print(tTubeMax);
lcd.print("\x01");
screenPage = 0;
// debug
}
//included if for fan's turn on/off
if ((currentTime - lastRelayTime >= delayRelayTime) && (tDiff >= tAct)) {
// rState = "On";
relayState = 1;
lastRelayTime = currentTime;
}
else if (currentTime - lastRelayTime >= delayRelayTime) {
// rState = "Off";
relayState = 0;
lastRelayTime = currentTime;
}
//END of included if
if (relayState == 1) {
digitalWrite(relayPin, HIGH);
//Turn on the Led that shows that relay on
digitalWrite(ledRelayPin, HIGH); // turn the LED on (HIGH is the voltage level)
} else if (relayState != 1) {
digitalWrite(relayPin, LOW);
//Turn off the Led that shows that relay on
digitalWrite(ledRelayPin, LOW); // turn the LED on (HIGH is the voltage level)
}
//Get a state of button for starting Blowdown
buttBlowdownState = !digitalRead(buttonBlowdownPin);
if (buttBlowdownState == 1) {
buttBlowdownFlag = 1;
}
if (buttBlowdownFlag == 1) {
digitalWrite(relayPin, HIGH);
//Turn on the Led that shows that relay on
digitalWrite(ledRelayPin, HIGH); // turn the LED on (HIGH is the voltage level)
// rState = "On+";
relayState = 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BLOWDOWN");
lcd.setCursor(7, 1);
lcd.print(blowdownTime);
lcd.print(" sec");
//debug
delay(blowdownTime * 1000);
buttBlowdownFlag = 0;
}
}