// LCD1602 to Arduino Uno connection example
// while editing blink or print text
// Update set liquid with variable length of liquids
// Marcro for max timing
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
// Menu Macros
int MAX_CYCLES = 7
int MAX_DOSING = 10
int MAX_TYPE = 6
int MAX_DOSE_TIME = 30 // 30 mins
const int ENCODER_CLK = 3; //CLK pin on the rotary encoder
const int ENCODER_DT = 2; //DT pin on the rotary encoder
const int ENCODER_SW = 1; //SW pin on the rotary encoder (Button function)
int cycles[7][10][2] = {{{0,1},{1,1},{2,1},{3,1},{1,0},{2,3},{3,1},{1,1},{0,2},{3,2}}};
int sub_menu[3] = {0,1,2};
String liq[6] = {"water", "acid", "milk", "liquid4","alcohol","alkali"};
int cycle_count = 0;
int lastClk = HIGH;
void print_menu(int rotation) {
if (rotation == 0) {
if (cycle_count == 9){
cycle_count = 0;
} else {
cycle_count++;
}
lcd.clear();
}else if (rotation ==1) {
if (cycle_count == 0){
cycle_count = 9;
} else {
cycle_count--;
}
lcd.clear();
} else {
1<2;
}
lcd.setCursor(0,0);
lcd.print("Cycle");
lcd.setCursor(6,0);
lcd.print(cycle_co30unt+1);
}
///////////////////////////////////////////////////////////////////////////
int print_submenu(int sub_count) {
delay(100);
lcd.clear();
while (digitalRead(ENCODER_SW) == HIGH) {
Serial.println(sub_count);
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk) {
// There was a change on the CLK pin
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) {
Serial.println("Rotated clockwise ⏩");
if (sub_count == 2){
sub_count = 0;
} else {
sub_count++;
}
}
if (newClk == LOW && dtValue == LOW) {
Serial.println("Rotated counterclockwise ⏪");
if (sub_count == 0){
sub_count = 2;
} else {
sub_count--;
}
}
lcd.clear();
}
lcd.setCursor(12,1);
lcd.print("back");
lcd.setCursor(1,0);
lcd.print("RUN");
lcd.setCursor(1,1);
lcd.print("EDIT");
if (sub_count == 2){
lcd.setCursor(11,1);
lcd.print(">");
}else{
lcd.setCursor(0,sub_count);
lcd.print(">");
}
}
delay(100);
return sub_count;
}
///////////////////////////////////////////////////////////////////////////
void print_liq(int counter) {
lcd.setCursor(0,0);
lcd.print("LIQUID");
lcd.setCursor(7,0);
lcd.print(counter);
lcd.setCursor(12,1);
lcd.print("back");
}
/////////////////////////////////////////////////////////////////////////
int set_liquid(int cyc_no, int counter, int s){
delay(100);
int l = cycles[cyc_no][counter][0];
lcd.clear();
print_liq(counter+1);
lcd.setCursor(1,1);
lcd.print(liq[l]);
lcd.setCursor(0,1);
lcd.print(">");
while (digitalRead(ENCODER_SW) ==HIGH) {
Serial.println(s);
Serial.println("S");
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk) {
// There was a change on the CLK pin
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) {
Serial.println("Rotated clockwise ⏩");
s++;
}
if (newClk == LOW && dtValue == LOW) {
Serial.println("Rotated counterclockwise ⏪");
s++;
}
if (s%2 ==0) {
lcd.setCursor(0,1);
lcd.print(">");
lcd.setCursor(11,1);
lcd.print(" ");
}else{
lcd.setCursor(11,1);
lcd.print(">");
lcd.setCursor(0,1);
lcd.print(" ");
}
}
delay(10);
}
if (s%2 == 1){
goto back;
}
delay(100);
while (digitalRead(ENCODER_SW) == HIGH) {
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk) {
// There was a change on the CLK pin
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) {
Serial.println("Rotated clockwise ⏩");
lcd.clear();
if (l == 3){
l = 0;
}else {
l++;
}
}
if (newClk == LOW && dtValue == LOW) {
Serial.println("Rotated counterclockwise ⏪");
lcd.clear();
if (l == 0) {
l = 3;
} else {
l--;
}
}
}
cycles[cyc_no][counter][0] = l;
back:
print_liq(counter+1);
lcd.setCursor(1,1);
lcd.print(liq[l]);
lcd.setCursor(0,1);
lcd.print(">");
}
return s;
}
//////////////////////////////////////////////////////////////////////
void set_time(int cycle_no, int counter) {
int t = cycles[cycle_no][counter][1];
lcd.setCursor(10,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(13,1);
lcd.print(">");
lcd.setCursor(14,1);
lcd.print(t);
delay(20);
while (digitalRead(ENCODER_SW)==HIGH) {
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk) {
// There was a change on the CLK pin
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) {
Serial.println("Rotated clockwise ⏩");
if (t == 10){
t = 0;
}else{
t++;
}
lcd.setCursor(14,1);
lcd.print(" ");
}
if (newClk == LOW && dtValue == LOW) {
Serial.println("Rotated counterclockwise ⏪");
if (t == 0){
t= 10;
} else {
t--;
}
lcd.setCursor(14,1);
lcd.print(" ");
}
}
lcd.setCursor(14,1);
lcd.print(t);
delay(10);
}
cycles[cycle_no][counter][1] = t;
lcd.setCursor(10,1);
lcd.print(" ");
}
////////////////////////////////////////////////////////////////////////////
void edit(int cycle_no){
int counter = 0;
delay(100);
while (counter<10) {
if (digitalRead(ENCODER_SW)== LOW){
break;
}
Serial.println("in edit");
int s = set_liquid(cycle_no, counter,0);
delay(50);
if (s%2==1) {
Serial.println("breaking");
Serial.println(s%2);
break;
}
set_time(cycle_no, counter);
delay(100);
counter++;
}
}
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
// you can now interact with the LCD, e.g.:
lcd.setCursor(0,0);
lcd.print("Cycle");
lcd.setCursor(6,0);
lcd.print(cycle_count+1);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(1, INPUT_PULLUP);
//attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
}
void loop() {
// ...
print_menu(-1);
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk) {
// There was a change on the CLK pin
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) {
Serial.println("Rotated clockwise ⏩");
print_menu(0);
}
if (newClk == LOW && dtValue == LOW) {
Serial.println("Rotated counterclockwise ⏪");
print_menu(1);
}
}
if (digitalRead(ENCODER_SW) == LOW) {
int sub = print_submenu(0);
Serial.println("sub");
Serial.println(sub);
delay(100);
if (sub == 1) {
Serial.println("cycle count");
Serial.println(cycle_count);
edit(sub);
Serial.println("out of edit");
}
lcd.clear();
}
}