#include <LiquidCrystal.h>
#include <pcf8574.h>
#include <EEPROM.h>
unsigned long timer1;
unsigned long timer2;
unsigned long timer3;
bool run;
long time_left = 3600;
long prev_time_left;
const int rs = 6, en = 5, d4 = 9, d5 = 8, d6 = 10, d7 = 7;
int on_time;
int off_time;
PCF8574 ex1(0x20);
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define GRINDER_PIN 11
#define DOOR_SENSE A0
#define DOOR A1
#define BUZZER 4
#define INTERVALL 1000
#define CANCEL digitalRead(ex1, 2)
#define ENTER digitalRead(ex1, 1)
#define RIGHT digitalRead(ex1, 0)
#define LEFT digitalRead(ex1, 3)
#define INC digitalRead(ex1, 4)
#define DEC digitalRead(ex1, 5)
void setup() {
// put your setup code here, to run once:
lcd.begin(20, 2);
Serial.begin(115200);
pinMode(GRINDER_PIN, OUTPUT);
pinMode(DOOR_SENSE, INPUT);
pinMode(DOOR, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(ex1, 0, INPUT_PULLUP);
pinMode(ex1, 1, INPUT_PULLUP);
pinMode(ex1, 2, INPUT_PULLUP);
pinMode(ex1, 3, INPUT_PULLUP);
pinMode(ex1, 4, INPUT_PULLUP);
pinMode(ex1, 5, INPUT_PULLUP);
lcd.setCursor(6, 0);
lcd.print("HALOSPA");
delay(1000);
lcd.clear();
if (EEPROM.read(1) > 200)
EEPROM.write(1, 1);
if (EEPROM.read(2) > 200)
EEPROM.write(2, 5);
on_time = EEPROM.read(1);
off_time = EEPROM.read(2);
}
void loop() {
// put your main code here, to run repeatedly:
if (run) {
if (timer1 + 1000 < millis()) {
time_left--;
timer1 = millis();
}
}
if (!ENTER) {
run = 1;
timer3 = millis();
timer2 = millis();
prev_time_left = time_left;
}
if (!CANCEL) {
run = 0;
time_left = 3600;
digitalWrite(GRINDER_PIN, LOW);
}
if (!INC) {
on_time++;
delay(300);
EEPROM.write(1, on_time);
}
if (!DEC) {
on_time--;
delay(300);
EEPROM.write(1, on_time);
}
if (!RIGHT) {
off_time += 5;
delay(300);
EEPROM.write(2, off_time);
}
if (!LEFT) {
off_time -= 5;
delay(300);
EEPROM.write(2, off_time);
}
if (on_time < 0)
on_time = 0;
if (off_time < 0)
off_time = 0;
if (time_left < 0) {
run = 0;
digitalWrite(GRINDER_PIN, LOW);
time_left = 3600;
digitalWrite(BUZZER, HIGH);
delay(1000);
digitalWrite(BUZZER, LOW);
}
uint32_t t = time_left;
int s = t % 60;
t = (t - s) / 60;
int m = t % 60;
t = (t - m) / 60;
int h = t;
if (!digitalRead(DOOR_SENSE) or !run) {
lcd.setCursor(0, 0);
if (run) {
lcd.print("RUN ");
} else {
lcd.print("STOP");
}
lcd.setCursor(5, 0);
lcd.print(String(h) + ":" + String(m) + ":" + String(s) + " ");
lcd.setCursor(0, 1);
lcd.print("ON:" + String(on_time) + "m OFF:" + String(off_time) + "m ");
}
if (run & !digitalRead(DOOR_SENSE)) {
if (!digitalRead(GRINDER_PIN) & ((prev_time_left - time_left) == (off_time * 60))) {
digitalWrite(GRINDER_PIN, HIGH);
prev_time_left = time_left;
}
if (digitalRead(GRINDER_PIN) & ((prev_time_left - time_left) == (on_time * 60))) {
digitalWrite(GRINDER_PIN, LOW);
prev_time_left = time_left;
}
}
if (!run) {
digitalWrite(GRINDER_PIN, LOW);
}
digitalWrite(DOOR, digitalRead(DOOR_SENSE));
if (digitalRead(DOOR_SENSE) & run) {
lcd.setCursor(0, 0);
lcd.print(" DOOR ");
digitalWrite(GRINDER_PIN, LOW);
}
}