//Rotary Encoder library
#include "rotary_encoder.h"
//OLED library
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//Define Rotary Encoder
#define CLK A1
#define DT A2
#define SW A3
//Define OLED
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1
// #define SCREEN_ADDRESS 0x3C
RotaryEncoder rotary(DT, CLK);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
unsigned long lastButtonPress = 0;
int LED [] = {6, 7};
unsigned int menu = 0;
int ledStatus[6] = {0};
int timer = 1000;
void setup() {
//Setup display
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
// if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
// Serial.println(F("SSD1306 allocation failed"));
// for(;;); // Don't proceed, loop forever
// }
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32
// display.clearDisplay();
// display.display(); // this command will display all the data which is in buffer
// Set encoder pins as input
// pinMode(CLK, INPUT);
// pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP);
// set led as output
for (int i = 0; i < 2; i++) {
pinMode(LED[i], OUTPUT);
}
menu = 0;
updateMenu();
}
void loop() {
rotary.decode(&countUp, &countDown);
// currentStateCLK = digitalRead(CLK);
// if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
// if (digitalRead(DT) != currentStateCLK) {
// menu --;
// updateMenu();
// } else {
// menu ++;
// updateMenu();
// }
// }
// lastStateCLK = currentStateCLK;
int btnState = digitalRead(SW);
if (btnState == LOW) {
if (millis() - lastButtonPress > 50) {
executeAction();
updateMenu();
}
lastButtonPress = millis();
}
delay(1);
}
void countUp() {
menu--;
updateMenu();
}
void countDown() {
menu++;
updateMenu();
}
void printDisplay(){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Main Menu");
display.setCursor(0,10);
// Serial1.println("LED Controller");
}
void updateMenu() {
switch (menu) {
case 0:
menu = 1;
break;
case 1:
printDisplay();
display.println(" LED 1>");
// Serial1.println(" LED 1>");
break;
case 2:
printDisplay();
display.println("<LED 2>");
// Serial1.println("<LED 2>");
break;
case 3:
menu = 4;
break;
}
}
void executeAction() {
switch (menu) {
case 1:
action1();
break;
case 2:
action2();
break;
}
}
void action1() {
if (ledStatus[menu] != 0) {
ledStatus[menu] = 0;
display.clearDisplay();
display.println("> LED 1 OFF...");
// Serial1.println("> LED 1 OFF...");
digitalWrite(LED[menu - 1], ledStatus[menu]);
delay(timer);
} else {
ledStatus[menu] = 1;
display.clearDisplay();
display.println("> LED 1 ON...");
// Serial1.println("> LED 1 ON...");
digitalWrite(LED[menu - 1], ledStatus[menu]);
delay(timer);
}
}
void action2() {
if (ledStatus[menu] != 0) {
ledStatus[menu] = 0;
display.clearDisplay();
display.println("> LED 2 OFF...");
// Serial1.println("> LED 2 OFF...");
digitalWrite(LED[menu - 1], ledStatus[menu]);
delay(timer);
} else {
ledStatus[menu] = 1;
display.clearDisplay();
display.println("> LED 2 OFF...");
// Serial1.println("> LED 2 ON...");
digitalWrite(LED[menu - 1], ledStatus[menu]);
delay(timer);
}
}