#include <LiquidCrystal_I2C.h>
#define ENCODER_CLK 6
#define ENCODER_DT 7
#define ENCODER_SW 8
bool start = false;
uint8_t numstops = 50;
uint16_t pause = 250;
uint8_t pulse = 200;
typedef enum {
SET_START,
SET_NUMSTOPS,
SET_PAUSE,
SET_PULSE,
} Mode;
Mode mode = SET_NUMSTOPS;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
// Serial.begin(115200);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
lcd.begin(20, 4);
// ------- Quick 2 blinks of backlight -------------
for (int i = 0; i < 2; i++)
{
lcd.backlight();
delay(250);
lcd.noBacklight();
delay(250);
}
lcd.backlight(); // finish with backlight on
// Print a message to the LCD.
lcd.setCursor(0, 1);
lcd.print("START");
lcd.setCursor(1, 1);
lcd.print("N. Stops: ");
lcd.setCursor(1, 2);
lcd.print("Pause ms: ");
lcd.setCursor(1, 3);
lcd.print("Pulse ms: ");
updateDisplay();
}
long int modeLastChanged = 0;
int prevClk = HIGH;
void loop() {
if (digitalRead(ENCODER_SW) == LOW && millis() - modeLastChanged > 300) {
modeLastChanged = millis();
nextMode();
updateDisplay();
}
int clk = digitalRead(ENCODER_CLK);
if (clk != prevClk && clk == LOW) {
int dt = digitalRead(ENCODER_DT);
int increment = dt == HIGH ? 1 : -1;
updateValue(increment);
updateDisplay();
/*
Serial.print("Start");
Serial.print(start);
Serial.print(" Nº Stops:");
Serial.print(degrees);
Serial.print(" Pause:");
Serial.print(pause);
Serial.print(" Pulse:");
Serial.println(pulse);
*/
}
prevClk = clk;
}
void nextMode() {
if (!start) {
switch (mode) {
case SET_NUMSTOPS:
mode = SET_PAUSE;
break;
case SET_PAUSE:
mode = SET_PULSE;
break;
case SET_PULSE:
mode = SET_START;
break;
case SET_START:
mode = SET_NUMSTOPS;
break;
}
}
}
void updateValue(int increment) {
switch (mode) {
case SET_NUMSTOPS:
numstops = constrain(numstops + 2*increment, 2, 100);
break;
case SET_PAUSE:
pause = constrain(pause + 50*increment, 100, 1000);
break;
case SET_PULSE:
pulse = constrain(pulse + 10*increment, 100, 250);
break;
case SET_START:
start = constrain(start + increment, 0, 1);
break;
}
}
void updateDisplay() {
lcd.setCursor(10, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(numstops);
if (mode == SET_NUMSTOPS) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(">");
}
lcd.setCursor(10, 2);
lcd.print(" ");
lcd.setCursor(10, 2);
lcd.print(pause);
if (mode == SET_PAUSE) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(">");
}
lcd.setCursor(10, 3);
lcd.print(" ");
lcd.setCursor(10, 3);
lcd.print(pulse);
if (mode == SET_PULSE) {
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(">");
}
lcd.setCursor(1, 0);
if (start){
lcd.print("STOP ");
}
else{
lcd.print("START");
}
if (mode == SET_START) {
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(">");
}
}