#include <TM1637Display.h>
#define CLK1 2 // Define CLK pin for the first TM1637 display
#define DIO1 3 // Define DIO pin for the first TM1637 display
#define CLK2 11 // Define CLK pin for the second TM1637 display
#define DIO2 12 // Define DIO pin for the second TM1637 display
#define PRE_INFUSION_RELAY 7
#define BREW_RELAY1 5
#define BREW_RELAY2 A0
#define PUMP_RELAY 6
#define BOILER_FILL_RELAY 8
#define BREW_SWITCH1 4
#define BREW_SWITCH2 10 // Define the second brew switch pin
#define BOILER_FILL_SWITCH 9
#define SAVED_BREW_SWITCH1 A1 //CC
#define SAVED_BREW_SWITCH2 A2 //CC
#define TEST_DELAY 6000
///////////////JC
const uint8_t SEG_DONE1[] = {
SEG_A,
0,
0,
0,
};
const uint8_t SEG_DONE2[] = {
0,
SEG_A,
0,
0,
};
const uint8_t SEG_DONE3[] = {
0,
0,
SEG_A,
0,
};
const uint8_t SEG_DONE4[] = {
0,
0,
0,
SEG_A,
};
const uint8_t SEG_DONE5[] = {
0,
0,
0,
SEG_B,
};
const uint8_t SEG_DONE6[] = {
0,
0,
0,
SEG_C,
};
const uint8_t SEG_DONE7[] = {
0,
0,
0,
SEG_D,
};
const uint8_t SEG_DONE8[] = {
0,
0,
SEG_D,
0,
};
const uint8_t SEG_DONE9[] = {
0,
SEG_D,
0,
0,
};
const uint8_t SEG_DONE10[] = {
SEG_D,
0,
0,
0,
};
const uint8_t SEG_DONE11[] = {
SEG_E,
0,
0,
0,
};
const uint8_t SEG_DONE12[] = {
SEG_F,
0,
0,
0,
};
const uint8_t SEG_DONE13[] = {
0,
0,
0,
SEG_A,
};
const uint8_t SEG_DONE14[] = {
0,
0,
0,
SEG_A | SEG_B,
};
const uint8_t SEG_DONE15[] = {
0,
0,
0,
SEG_A | SEG_B | SEG_C,
};
const uint8_t SEG_DONE16[] = {
0,
0,
0,
SEG_A | SEG_B | SEG_C | SEG_D,
};
const uint8_t SEG_DONE17[] = {
0,
0,
0,
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E,
};
const uint8_t SEG_DONE18[] = {
0,
0,
0,
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,
};
///////////////JC
const uint8_t SEG_DONE[] = {
SEG_A | SEG_F | SEG_B | SEG_G | SEG_E, // P
SEG_A | SEG_F | SEG_E, // r
SEG_A | SEG_F | SEG_G | SEG_E | SEG_D, // E
SEG_G, // -
};
TM1637Display display1(CLK1, DIO1);
TM1637Display display2(CLK2, DIO2);
int count1 = 0; // Initial count value for the first display
int count2 = 0; // Initial count value for the second display
int savedCount1 = 0; //CC/JC
int savedCount2 = 0; //CC/JC
boolean isCounting1 = false; // Flag to track if counting is in progress for the first display
boolean isCounting2 = false; // Flag to track if counting is in progress for the second display
bool brewActive1 = false;
bool brewActive2 = false;
bool savedBrew1Active = false; //CC
bool savedBrew2Active = false; //CC
bool boilerFillActive = false;
void setup() {
// Set relay pins as OUTPUT
pinMode(PRE_INFUSION_RELAY, OUTPUT);
pinMode(BREW_RELAY1, OUTPUT);
pinMode(BREW_RELAY2, OUTPUT);
pinMode(PUMP_RELAY, OUTPUT);
pinMode(BOILER_FILL_RELAY, OUTPUT);
pinMode(SAVED_BREW_SWITCH1, INPUT_PULLUP); //CC
pinMode(SAVED_BREW_SWITCH2, INPUT_PULLUP); //CC
// Set switch pins as INPUT_PULLUP
pinMode(BREW_SWITCH1, INPUT_PULLUP);
pinMode(BREW_SWITCH2, INPUT_PULLUP);
pinMode(BOILER_FILL_SWITCH, INPUT_PULLUP);
display1.setBrightness(0x0F); // Set brightness to maximum for the first display
display2.setBrightness(0x0F); // Set brightness to maximum for the second display
///////////////JC
//for (int i = 0; i < 1; i++)
{
display1.setSegments(SEG_DONE5);
delay(80);
display1.setSegments(SEG_DONE6);
delay(80);
display1.setSegments(SEG_DONE7);
delay(80);
display1.setSegments(SEG_DONE8);
delay(80);
display1.setSegments(SEG_DONE9);
delay(80);
display1.setSegments(SEG_DONE10);
delay(80);
display1.setSegments(SEG_DONE11);
delay(80);
display1.setSegments(SEG_DONE12);
delay(80);
display1.setSegments(SEG_DONE1);
delay(80);
display1.setSegments(SEG_DONE2);
delay(80);
display1.setSegments(SEG_DONE3);
delay(80);
display1.setSegments(SEG_DONE4);
delay(80);
display1.setSegments(SEG_DONE13);
delay(80);
display1.setSegments(SEG_DONE14);
delay(80);
display1.setSegments(SEG_DONE15);
delay(80);
display1.setSegments(SEG_DONE16);
delay(80);
display1.setSegments(SEG_DONE17);
delay(80);
display1.setSegments(SEG_DONE18);
delay(80);
//display1.clear();
}
display1.showNumberDecEx(0, 0b01000000); // Display blank screen for the first display
{
display2.setSegments(SEG_DONE5);
delay(80);
display2.setSegments(SEG_DONE6);
delay(80);
display2.setSegments(SEG_DONE7);
delay(80);
display2.setSegments(SEG_DONE8);
delay(80);
display2.setSegments(SEG_DONE9);
delay(80);
display2.setSegments(SEG_DONE10);
delay(80);
display2.setSegments(SEG_DONE11);
delay(80);
display2.setSegments(SEG_DONE12);
delay(80);
display2.setSegments(SEG_DONE1);
delay(80);
display2.setSegments(SEG_DONE2);
delay(80);
display2.setSegments(SEG_DONE3);
delay(80);
display2.setSegments(SEG_DONE4);
delay(80);
display2.setSegments(SEG_DONE13);
delay(80);
display2.setSegments(SEG_DONE14);
delay(80);
display2.setSegments(SEG_DONE15);
delay(80);
display2.setSegments(SEG_DONE16);
delay(80);
display2.setSegments(SEG_DONE17);
delay(80);
display2.setSegments(SEG_DONE18);
delay(80);
//display2.clear();
}
////////////////JC
display2.showNumberDecEx(0, 0b01000000); // Display blank screen for the second display
Serial.begin(9600);
}
void loop() {
// Check the Brew Switch for the first display
if (digitalRead(BREW_SWITCH1) == LOW && !brewActive1) {
if (!isCounting1) {
isCounting1 = true;
count1 = 0;
}
digitalWrite(PRE_INFUSION_RELAY, HIGH);
display1.clear();
display1.setSegments(SEG_DONE);
delay(TEST_DELAY);
digitalWrite(PRE_INFUSION_RELAY, LOW);
delay(1000);
digitalWrite(BREW_RELAY1, HIGH);
digitalWrite(PUMP_RELAY, HIGH);
brewActive1 = true;
}
if (brewActive1) {
count1++;
display1.showNumberDec(count1);
delay(1000);
if (digitalRead(BREW_SWITCH1) == HIGH) {
digitalWrite(BREW_RELAY1, LOW);
digitalWrite(PUMP_RELAY, LOW);
brewActive1 = false;
delay(3000);
display1.showNumberDec(0);
isCounting1 = false;
display1.setSegments(SEG_DONE5);
delay(80);
display1.setSegments(SEG_DONE6);
delay(80);
display1.setSegments(SEG_DONE7);
delay(80);
display1.setSegments(SEG_DONE8);
delay(80);
display1.setSegments(SEG_DONE9);
delay(80);
display1.setSegments(SEG_DONE10);
delay(80);
display1.setSegments(SEG_DONE11);
delay(80);
display1.setSegments(SEG_DONE12);
delay(80);
display1.setSegments(SEG_DONE1);
delay(80);
display1.setSegments(SEG_DONE2);
delay(80);
display1.setSegments(SEG_DONE3);
delay(80);
display1.setSegments(SEG_DONE4);
delay(80);
display1.setSegments(SEG_DONE13);
delay(80);
display1.setSegments(SEG_DONE14);
delay(80);
display1.setSegments(SEG_DONE15);
delay(80);
display1.setSegments(SEG_DONE16);
delay(80);
display1.setSegments(SEG_DONE17);
delay(80);
display1.setSegments(SEG_DONE18);
delay(80);
}
}
///////////////////////////////////////CC
if (digitalRead(SAVED_BREW_SWITCH1) == LOW && !savedBrew1Active) { //CC
if (!isCounting1) {
isCounting1 = true;
count1 = savedCount1; //CC***???
}
digitalWrite(PRE_INFUSION_RELAY, HIGH);
display1.clear();
display1.setSegments(SEG_DONE);
delay(TEST_DELAY);
digitalWrite(PRE_INFUSION_RELAY, LOW);
delay(1000);
//count++;
//display.showNumberDec(count);
//delay(1000); // Count up every second
//delay(000);
digitalWrite(BREW_RELAY1, HIGH);
digitalWrite(PUMP_RELAY, HIGH);
savedBrew1Active = true; //CC
}
if (savedBrew1Active) { //CC
count1--; //CC
display1.showNumberDec(count1);
delay(1000); // Count down every second
if (count1 == 0 || count1 < 0) { //CC
digitalWrite(BREW_RELAY1, LOW);
digitalWrite(PUMP_RELAY, LOW);
savedBrew1Active = false; //CC
delay(3000);
display1.showNumberDec(0);
isCounting1 = false;
display1.setSegments(SEG_DONE5);
delay(80);
display1.setSegments(SEG_DONE6);
delay(80);
display1.setSegments(SEG_DONE7);
delay(80);
display1.setSegments(SEG_DONE8);
delay(80);
display1.setSegments(SEG_DONE9);
delay(80);
display1.setSegments(SEG_DONE10);
delay(80);
display1.setSegments(SEG_DONE11);
delay(80);
display1.setSegments(SEG_DONE12);
delay(80);
display1.setSegments(SEG_DONE1);
delay(80);
display1.setSegments(SEG_DONE2);
delay(80);
display1.setSegments(SEG_DONE3);
delay(80);
display1.setSegments(SEG_DONE4);
delay(80);
display1.setSegments(SEG_DONE13);
delay(80);
display1.setSegments(SEG_DONE14);
delay(80);
display1.setSegments(SEG_DONE15);
delay(80);
display1.setSegments(SEG_DONE16);
delay(80);
display1.setSegments(SEG_DONE17);
delay(80);
display1.setSegments(SEG_DONE18);
delay(80);
}
}
//////////////////////////////////////////CC
// Check the Brew Switch for the second display
if (digitalRead(BREW_SWITCH2) == LOW && !brewActive2) {
if (!isCounting2) {
isCounting2 = true;
count2 = 0;
}
digitalWrite(PRE_INFUSION_RELAY, HIGH);
display2.clear();
display2.setSegments(SEG_DONE);
delay(TEST_DELAY);
digitalWrite(PRE_INFUSION_RELAY, LOW);
delay(1000);
digitalWrite(BREW_RELAY2, HIGH);
digitalWrite(PUMP_RELAY, HIGH);
brewActive2 = true;
}
if (brewActive2) {
count2++;
display2.showNumberDec(count2);
delay(1000);
if (digitalRead(BREW_SWITCH2) == HIGH) {
digitalWrite(BREW_RELAY2, LOW);
digitalWrite(PUMP_RELAY, LOW);
brewActive2 = false;
delay(3000);
display2.showNumberDec(0);
isCounting2 = false;
///////////////************
display2.setSegments(SEG_DONE5);
delay(80);
display2.setSegments(SEG_DONE6);
delay(80);
display2.setSegments(SEG_DONE7);
delay(80);
display2.setSegments(SEG_DONE8);
delay(80);
display2.setSegments(SEG_DONE9);
delay(80);
display2.setSegments(SEG_DONE10);
delay(80);
display2.setSegments(SEG_DONE11);
delay(80);
display2.setSegments(SEG_DONE12);
delay(80);
display2.setSegments(SEG_DONE1);
delay(80);
display2.setSegments(SEG_DONE2);
delay(80);
display2.setSegments(SEG_DONE3);
delay(80);
display2.setSegments(SEG_DONE4);
delay(80);
display2.setSegments(SEG_DONE13);
delay(80);
display2.setSegments(SEG_DONE14);
delay(80);
display2.setSegments(SEG_DONE15);
delay(80);
display2.setSegments(SEG_DONE16);
delay(80);
display2.setSegments(SEG_DONE17);
delay(80);
display2.setSegments(SEG_DONE18);
delay(80);
//display2.clear();
/////////////********
}
}
///////////////////////////////////////CC
if (digitalRead(SAVED_BREW_SWITCH2) == LOW && !savedBrew2Active) { //CC
if (!isCounting2) {
isCounting2 = true;
count2 = savedCount2; //CC******??
}
digitalWrite(PRE_INFUSION_RELAY, HIGH);
display2.clear();
display2.setSegments(SEG_DONE);
delay(TEST_DELAY);
digitalWrite(PRE_INFUSION_RELAY, LOW);
delay(1000);
//count++;
//display.showNumberDec(count);
//delay(1000); // Count up every second
//delay(000);
digitalWrite(BREW_RELAY2, HIGH);
digitalWrite(PUMP_RELAY, HIGH);
savedBrew2Active = true; //CC
}
if (savedBrew2Active) { //CC
count2--; //CC
display2.showNumberDec(count2);
delay(1000); // Count down every second
if (count2 == 0 || count2 < 0) { //CC
digitalWrite(BREW_RELAY2, LOW);
digitalWrite(PUMP_RELAY, LOW);
savedBrew2Active = false; //CC
delay(3000);
display2.showNumberDec(0);
isCounting2 = false;
display2.setSegments(SEG_DONE5);
delay(80);
display2.setSegments(SEG_DONE6);
delay(80);
display2.setSegments(SEG_DONE7);
delay(80);
display2.setSegments(SEG_DONE8);
delay(80);
display2.setSegments(SEG_DONE9);
delay(80);
display2.setSegments(SEG_DONE10);
delay(80);
display2.setSegments(SEG_DONE11);
delay(80);
display2.setSegments(SEG_DONE12);
delay(80);
display2.setSegments(SEG_DONE1);
delay(80);
display2.setSegments(SEG_DONE2);
delay(80);
display2.setSegments(SEG_DONE3);
delay(80);
display2.setSegments(SEG_DONE4);
delay(80);
//display1.setSegments(SEG_DONE5);
//delay(100);
display2.setSegments(SEG_DONE13);
delay(80);
display2.setSegments(SEG_DONE14);
delay(80);
display2.setSegments(SEG_DONE15);
delay(80);
display2.setSegments(SEG_DONE16);
delay(80);
display2.clear();
////////////////JC
display2.showNumberDecEx(0, 0b01000000);
}
}
//////////////////////////////////////////CC
// Check the Boiler Fill Switch
if (digitalRead(BOILER_FILL_SWITCH) == LOW && !boilerFillActive) {
delay(2000);
digitalWrite(BOILER_FILL_RELAY, HIGH);
boilerFillActive = true;
}
if (boilerFillActive && digitalRead(BOILER_FILL_SWITCH) == HIGH) {
delay(2000);
digitalWrite(BOILER_FILL_RELAY, LOW);
boilerFillActive = false;
}
}