#include <Wire.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header
#include <Encoder.h> // https://www.pjrc.com/teensy/td_libs_Encoder.html
#include <Toggle.h> // https://github.com/Dlloydev/Toggle
struct Group {
const byte pin;
long duration;
};
Group sequencer[] = {{5, 0}, {6, 0}, {7, 0}, {8, 0}};
const byte pinCount = sizeof sequencer / sizeof * sequencer;
const uint8_t nbCols = 20;
const uint8_t nbRows = 4;
hd44780_I2Cexp lcd;
const byte encoderCLKPin = 2;
const byte encoderDTPin = 3;
Encoder encoder(encoderDTPin, encoderCLKPin);
long encoderPosition;
const byte encoderSWPin = 4;
Toggle encoderSwitch(encoderSWPin);
bool encoderChanged() {
long newPosition = encoder.read() >> 2;
if (newPosition != 0) {
encoderPosition = newPosition;
encoder.write(encoder.read() - (encoderPosition << 2));
return true;
}
return false;
}
void setup() {
encoderSwitch.begin(encoderSWPin);
Serial.begin(115200);
int result = lcd.begin(nbCols, nbRows);
if (result) {
Serial.print("LCD initialization failed: ");
Serial.println(result);
hd44780::fatalError(result);
}
// DURATION CONFIGURATION
lcd.setCursor(0, 0); lcd.print("--- CONFIGURATION ---");
lcd.setCursor(0, 1); lcd.print("Select duration for");
lcd.setCursor(0, 2); lcd.print("pin #");
lcd.setCursor(0, 3); lcd.print("duration:");
for (Group& g : sequencer) {
pinMode(g.pin, OUTPUT);
lcd.setCursor(6, 2); lcd.print(" ");
lcd.setCursor(6, 2); lcd.print(g.pin);
lcd.setCursor(10, 3); lcd.print(g.duration); lcd.print('s');
while (true) {
if (encoderChanged()) {
g.duration += encoderPosition;
if (g.duration < 0) g.duration = 0;
lcd.setCursor(10, 3); lcd.print(" ");
lcd.setCursor(10, 3); lcd.print(g.duration); lcd.print('s');
}
encoderSwitch.poll();
if (encoderSwitch.onRelease()) break;
}
}
// CLICK TO START
lcd.clear();
lcd.setCursor(0, 0); lcd.print("--- READY TO GO ---");
lcd.setCursor(0, 1); lcd.print("Press button");
while (true) {
encoderSwitch.poll();
if (encoderSwitch.onRelease()) break;
}
lcd.clear();
lcd.setCursor(0, 2); lcd.print("pin #");
}
void loop() {
for (Group& g : sequencer) {
lcd.setCursor(6, 2); lcd.print(" ");
lcd.setCursor(6, 2); lcd.print(g.pin); lcd.print(" ON");
digitalWrite(g.pin, HIGH);
delay(1000ul * g.duration);
digitalWrite(g.pin, LOW);
}
}