#define injector 5
#include <LiquidCrystal_I2C.h>
#include <EncButton.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
EncButton eb(2, 3, 4);
byte dPage = 1;
byte tMode = 2;
int workTime = 10;
uint32_t tmr1;
uint32_t tmr2;
byte w1[] = {0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00};
byte w2[] = {0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x10, 0x10};
byte w3[] = {0x10, 0x10, 0x08, 0x04, 0x04, 0x02, 0x01, 0x01};
void tmodeLCD(){
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("Test Mode");
if (tMode == 2){
lcd.setCursor(0, tMode);
lcd.print(">");
}
else{
lcd.setCursor(13, 3);
lcd.print(">");
}
lcd.setCursor(14, 3);
lcd.print("Start");
lcd.setCursor(0, 1);
lcd.print("Select Time:");
lcd.setCursor(1, 2);
lcd.print(workTime);
if(workTime < 100){
lcd.setCursor(3, 2);
lcd.print("sec");
}
else{
lcd.setCursor(4, 2);
lcd.print("sec");
}
}
void mainMenu(){
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Select Work Mode");
lcd.setCursor(1, 1);
lcd.print("Clean Mode");
lcd.setCursor(1, 2);
lcd.print("Test Mode");
lcd.setCursor(1, 3);
lcd.print("Manual Mode");
lcd.setCursor(0, dPage);
lcd.print(">");
}
void setup() {
pinMode(injector, OUTPUT);
eb.setEncReverse(1);
lcd.init();
lcd.backlight();
lcd.createChar(0, w1);
lcd.createChar(1, w2);
lcd.createChar(2, w3);
lcd.setCursor(2, 0);
lcd.print("Injector cleaner");
lcd.setCursor(5, 1);
lcd.print("by Apengen");
lcd.setCursor(2, 3);
lcd.print("Loading...");
for(byte i = 0; i < 110; i = i + 10){
lcd.setCursor(13, 3);
lcd.print(i);
if(i < 100){
lcd.setCursor(15, 3);
lcd.print("%");
}
else{
lcd.setCursor(16, 3);
lcd.print("%");
}
delay(100);
}
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Select Work Mode");
lcd.setCursor(1, 1);
lcd.print("Clean Mode");
lcd.setCursor(1, 2);
lcd.print("Test Mode");
lcd.setCursor(1, 3);
lcd.print("Manual Mode");
lcd.setCursor(0, dPage);
lcd.print(">");
}
void loop() {
eb.tick();
if (eb.turn()) {
if (eb.right()) dPage ++;
if (eb.left()) dPage --;
dPage = constrain(dPage, 1, 3);
mainMenu();
}
if(eb.click() && dPage == 1){
lcd.clear();
while(true){
eb.tick();
if (eb.hold()) {
mainMenu();
break;
}
}
}
if(eb.click() && dPage == 2){
tmodeLCD();
while(true){
eb.tick();
if (eb.hold()) {
mainMenu();
break;
}
if (eb.right()) tMode ++;
if (eb.left()) tMode --;
tMode = constrain(tMode, 2, 3);
if (eb.turn()){
tmodeLCD();
}
if(eb.click() && tMode == 2){
while(true){
eb.tick();
if (eb.right()) workTime = workTime + 10;
if (eb.left()) workTime = workTime - 10;
workTime = constrain(workTime, 10, 300);
if (eb.turn()){
tmodeLCD();
}
if(eb.click()) break;
}
}
if(eb.click() && tMode == 3){
lcd.clear();
lcd.setCursor(8, 3);
lcd.print("Stop");
lcd.setCursor(7, 3);
lcd.print(">");
lcd.setCursor(12, 3);
lcd.print("<");
lcd.setCursor(6, 0);
lcd.print("Process:");
lcd.setCursor(0, 1);
lcd.print("Time Left:");
while(true){
digitalWrite(injector, HIGH);
if(eb.hold()) {
tmodeLCD();
break;
}
if (millis() - tmr1 >= 1000) {
tmr1 = millis();
workTime --;
lcd.setCursor(11, 1);
lcd.print(workTime);
if(workTime < 10){
lcd.setCursor(15, 1);
lcd.print(" ");
lcd.setCursor(12, 1);
}
else {
lcd.setCursor(13, 1);
}
lcd.print("sec");
if (workTime == 0){
digitalWrite(injector, LOW);
tmodeLCD();
break;
}
if (millis() - tmr2 >= 200) {
byte a;
a++;
if(a == 3) a = 0;
switch (a){
case 0:
lcd.setCursor(9, 2);
lcd.write(0);
break;
case 1:
lcd.setCursor(9, 2);
lcd.write(1);
break;
case 2:
lcd.setCursor(9, 2);
lcd.write(2);
break;
}
}
}
}
}
if(eb.click() && dPage == 3){
lcd.clear();
while(true){
eb.tick();
if (eb.hold()) {
mainMenu();
break;
}
}
}
}
}
}