#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define coil_1 3
#define coil_2 9
#define coil_3 10
#define coil_4 11
#define button_1 13
#define input_1 14
#define input_2 15
#define input_3 16
#define input_4 17
#define pot_1 A6
#define pot_2 A7
int dutyCycle; // 8-bit value
int Delay; // in milliseconds
byte watchdog_1;
byte watchdog_2;
byte watchdog_3;
byte watchdog_4;
// Timer_2 variables
int trigger;
int cycle;
const long duration_2 = 300000; // milliseconds
long offset_2;
unsigned long currentMillis;
// Button variables
int page;
byte watchdog_5;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.clear();
pinMode(coil_1, OUTPUT);
pinMode(coil_2, OUTPUT);
pinMode(coil_3, OUTPUT);
pinMode(coil_4, OUTPUT);
pinMode(input_1, INPUT_PULLUP);
pinMode(input_2, INPUT_PULLUP);
pinMode(input_3, INPUT_PULLUP);
pinMode(input_4, INPUT_PULLUP);
pinMode(button_1, INPUT_PULLUP);
watchdog_1 = false;
watchdog_2 = false;
watchdog_3 = false;
watchdog_4 = false;
analogWrite(coil_1, 0);
analogWrite(coil_2, 0);
analogWrite(coil_3, 0);
analogWrite(coil_4, 0);
lcd.noBacklight();
trigger = 0;
cycle = 0;
currentMillis = millis();
page = 1;
watchdog_5 = false;
}
void loop() {
Display();
Coil();
Button();
timer_2();
int a = analogRead(pot_1);
int b = analogRead(pot_2);
dutyCycle = map(a, 0, 1023, 0, 255);
Delay = map(b, 0, 1023, 0, 1000);
}
void Button() {
if(page == 1) {
if(digitalRead(button_1) == LOW){
watchdog_5 = true;
}
else if((digitalRead(button_1) == HIGH) && (watchdog_5 == true)){
watchdog_5 = false;
page = 2;
trigger = 1;
lcd.clear();
}
}
if(page == 2) {
if(digitalRead(button_1) == LOW){
watchdog_5 = true;
}
else if((digitalRead(button_1) == HIGH) && (watchdog_5 == true)){
watchdog_5 = false;
page = 3;
trigger = 1;
lcd.clear();
}
}
if(page == 3) {
if(digitalRead(button_1) == LOW){
watchdog_5 = true;
}
else if((digitalRead(button_1) == HIGH) && (watchdog_5 == true)){
watchdog_5 = false;
page = 1;
trigger = 1;
lcd.clear();
}
}
}
void timer_2() {
currentMillis = millis();
if(trigger == 1) {
offset_2 = currentMillis;
trigger = 0;
}
if(currentMillis < (offset_2 + duration_2)) {
cycle = 1;
}
if(currentMillis > (offset_2 + duration_2)) {
cycle = 0;
}
}
void Coil() {
if(digitalRead(input_1) == HIGH) {
analogWrite(coil_1, 0);
watchdog_1 = false;
}
else if(digitalRead(input_1) == LOW) {
if(watchdog_1 == false) {
analogWrite(coil_1, 255);
delay(Delay);
for(int i = 255; i > dutyCycle; i--) {
analogWrite(coil_1, i);
delay(10);
}
watchdog_1 = true;
}
else if(watchdog_1 == true) {
analogWrite(coil_1, dutyCycle);
}
}
if(digitalRead(input_2) == HIGH) {
analogWrite(coil_2, 0);
watchdog_2 = false;
}
else if(digitalRead(input_2) == LOW) {
if(watchdog_2 == false) {
analogWrite(coil_2, 255);
delay(Delay);
for(int i = 255; i > dutyCycle; i--) {
analogWrite(coil_2, i);
delay(10);
}
watchdog_2 = true;
}
else if(watchdog_2 == true) {
analogWrite(coil_2, dutyCycle);
}
}
if(digitalRead(input_3) == HIGH) {
analogWrite(coil_3, 0);
watchdog_3 = false;
}
else if(digitalRead(input_3) == LOW) {
if(watchdog_3 == false) {
analogWrite(coil_3, 255);
delay(Delay);
for(int i = 255; i > dutyCycle; i--) {
analogWrite(coil_3, i);
delay(10);
}
watchdog_3 = true;
}
else if(watchdog_3 == true) {
analogWrite(coil_3, dutyCycle);
}
}
if(digitalRead(input_4) == HIGH) {
analogWrite(coil_4, 0);
watchdog_4 = false;
}
else if(digitalRead(input_4) == LOW) {
if(watchdog_4 == false) {
analogWrite(coil_4, 255);
delay(Delay);
for(int i = 255; i > dutyCycle; i--) {
analogWrite(coil_4, i);
delay(10);
}
watchdog_4 = true;
}
else if(watchdog_4 == true) {
analogWrite(coil_4, dutyCycle);
}
}
}
void Display() {
if(cycle == 1) {
lcd.backlight();
}
else if(cycle == 0) {
lcd.noBacklight();
}
if(page == 1) {
lcd.setCursor(0,0);
lcd.print("Coil 1: ");
if(watchdog_1 == false) {
lcd.print("OFF");
}
else if(watchdog_1 == true) {
lcd.print("ON ");
}
lcd.setCursor(0,1);
lcd.print("Coil 2: ");
if(watchdog_2 == false) {
lcd.print("OFF");
}
else if(watchdog_2 == true) {
lcd.print("ON ");
}
lcd.setCursor(0,2);
lcd.print("Coil 3: ");
if(watchdog_3 == false) {
lcd.print("OFF");
}
else if(watchdog_3 == true) {
lcd.print("ON ");
}
lcd.setCursor(0,3);
lcd.print("Coil 4: ");
if(watchdog_4 == false) {
lcd.print("OFF");
}
else if(watchdog_4 == true) {
lcd.print("ON ");
}
}
else if(page == 2 ) {
lcd.setCursor(0,0);
lcd.print("Input 1: ");
if(digitalRead(input_1) == HIGH) {
lcd.print("INACTIVE");
}
else if(digitalRead(input_1) == LOW) {
lcd.print("ACTIVE ");
}
lcd.setCursor(0,1);
lcd.print("Input 2: ");
if(digitalRead(input_2) == HIGH) {
lcd.print("INACTIVE");
}
else if(digitalRead(input_2) == LOW) {
lcd.print("ACTIVE ");
}
lcd.setCursor(0,2);
lcd.print("Input 3: ");
if(digitalRead(input_3) == HIGH) {
lcd.print("INACTIVE");
}
else if(digitalRead(input_3) == LOW) {
lcd.print("ACTIVE ");
}
lcd.setCursor(0,3);
lcd.print("Input 4: ");
if(digitalRead(input_4) == HIGH) {
lcd.print("INACTIVE");
}
else if(digitalRead(input_4) == LOW) {
lcd.print("ACTIVE ");
}
}
else if(page == 3 ) {
lcd.setCursor(0,0);
lcd.print("Duty Cycle: ");
lcd.print(dutyCycle);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Delay: ");
lcd.print(Delay);
lcd.print(" ");
}
}