#include <LiquidCrystal.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define CHNG_TEMP 6
#define TEMP_INC 5
#define TEMP_DEC 4
#define RELAY 3
#define DELAY 300
#define DISPLAY_DELAY 100
#define TEMP_DELAY 100
#define ARROW_BLINK_DELAY 500
#define RS 12
#define E 11
#define D4 10
#define D5 9
#define D6 8
#define D7 7
#define DS18B20 2
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
OneWire ds(DS18B20);
uint8_t circle[8] =
{
0b01100,
0b10010,
0b10010,
0b01100,
0b00000,
0b00000,
0b00000,
0b00000,
};
void setup()
{
lcd.begin(16, 2);
lcd.createChar(3, circle);
pinMode(DS18B20, INPUT);
pinMode(RELAY, OUTPUT);
pinMode(CHNG_TEMP, INPUT);
pinMode(TEMP_INC, INPUT);
pinMode(TEMP_DEC, INPUT);
}
float temperature = 0;
float referenceTemp = 0;
float deadzone = 0;
bool enableChngOfTemp = false;
bool BUTT = false;
bool BUTT_FLAG = false;
bool ARROW_BLINK_FLAG = true;
bool FIRST_START = true;
static uint32_t buttTimer = millis();
static uint32_t buttTimer_2 = millis();
static uint32_t displayTimer = millis();
static uint32_t arrowBlink_timer = millis();
void loop()
{
static uint32_t timer = millis();
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
oneClick(CHNG_TEMP, buttTimer);
changeRefTemp(enableChngOfTemp, buttTimer_2);
if((millis() - timer) >= TEMP_DELAY)
{
timer = millis();
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
temperature = ((data[1] << 8) | data[0]) * 0.5;
}
if(temperature != 0 && FIRST_START == true)
{
referenceTemp = temperature;
FIRST_START = false;
}
referenceTemp = constrain(referenceTemp, -55, 60);
if((millis() - displayTimer) >= DISPLAY_DELAY)
{
lcd.setCursor(0,0);
lcd.print("Temp:");
lcd.print(temperature);
lcd.print("C\x03");
if(enableChngOfTemp)
{
int analog = analogRead(A0);
deadzone = map(analog, 0, 1023, 0, 300);
deadzone /= 100;
lcd.setCursor(14, 0);
lcd.print("DZ");
lcd.setCursor(13, 1);
lcd.print(deadzone);
lcd.setCursor(0,1);
if((millis() - arrowBlink_timer) >= ARROW_BLINK_DELAY)
{
if(ARROW_BLINK_FLAG)
{
lcd.print(">");
ARROW_BLINK_FLAG = !ARROW_BLINK_FLAG;
}
else
{
lcd.print(" ");
ARROW_BLINK_FLAG = !ARROW_BLINK_FLAG;
}
arrowBlink_timer = millis();
}
lcd.setCursor(1,1);
lcd.print("RefT:");
lcd.print(referenceTemp);
lcd.print("C\x03");
}
else
{
lcd.setCursor(0,1);
lcd.print("RefT:");
lcd.print(referenceTemp);
lcd.print("C\x03 ");
lcd.setCursor(14, 0);
lcd.print(" ");
}
displayTimer = millis();
}
if(temperature >= (referenceTemp + deadzone))
digitalWrite(RELAY, LOW);
else if(temperature <= (referenceTemp - deadzone))
digitalWrite(RELAY, HIGH);
}
void oneClick(short BUTTON_PIN, uint32_t timer)
{
BUTT = digitalRead(BUTTON_PIN);
if((millis() - timer) >= DELAY)
{
if(!BUTT_FLAG && BUTT)
{
BUTT_FLAG = true;
enableChngOfTemp = !enableChngOfTemp;
}
buttTimer = millis();
}
if(!BUTT && BUTT_FLAG)
{
BUTT_FLAG = false;
}
}
void changeRefTemp(bool buttEnable, uint32_t timer)
{
if(buttEnable)
{
if((millis() - timer) >= DELAY)
{
if(digitalRead(TEMP_INC))
referenceTemp = referenceTemp + 0.5;
if(digitalRead(TEMP_DEC))
referenceTemp = referenceTemp - 0.5;
buttTimer_2 = millis();
}
}
}