#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "push_button.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SCREEN_I2C_ADDRESS 0x3C
#define OLED_RESET_PIN -1
#define LED_PIN 6
#define up_button_pin 5
#define left_button_pin 2
#define right_button_pin 3
#define down_button_pin 4
Adafruit_SSD1306 screen(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET_PIN);
PushButton up_button(up_button_pin,true,true,1);
PushButton left_button(left_button_pin,true,true,2);
PushButton right_button(right_button_pin,true,true,3);
PushButton down_button(down_button_pin,true,true,4);
enum ModeState{
SETBRIGHTNESS,
SETLEDON_INTERVAL,
SETLEDOFF_INTERVAL,
SETTIMEOUT,
OPERATING,
};
ModeState currentstate ;
int line;
int increase_decrease = 1;
int timeout = 0;
int brightness = 0;
int ledon_interval = 0;
int ledoff_interval = 0;
int currentStateCLK;
int lastStateCLK;
int operating = 0;
bool blinkstate = 0;
unsigned long blink_interval_tick = 0;
long blink_interval;
int operate = 0;
unsigned long timeout_tick = 0;
void rotary_increament_decreament(ModeState currentstate,int inc_dec){
Serial.println(inc_dec);
if(currentstate == SETBRIGHTNESS){
if (inc_dec == -1) {
brightness --;
if(brightness == -1){
brightness = 0;
}
} else {
brightness ++;
if(brightness == 101){
brightness = 100;
}
}
Serial.print("Brightness: ");
Serial.println(brightness);
}else if(currentstate == SETLEDON_INTERVAL){
if (inc_dec == -1) {
ledon_interval --;
if(ledon_interval == -1){
ledon_interval = 0;
}
} else {
ledon_interval ++;
}
Serial.print("ledon_interval : ");
Serial.println(ledon_interval );
}else if(currentstate == SETLEDOFF_INTERVAL){
if (inc_dec == -1) {
ledoff_interval --;
if(ledoff_interval == -1){
ledoff_interval = 0;
}
} else {
ledoff_interval ++;
}
Serial.print("ledoff_interval : ");
Serial.println(ledoff_interval );
}else if(currentstate == SETTIMEOUT){
if (inc_dec == -1) {
timeout --;
if(timeout == -1){
timeout = 0;
}
} else {
timeout ++;
}
Serial.print("timeout : ");
Serial.println(timeout );
}
}
void cursor_position(int line){
if(line == 0){
screen.setCursor(0,0);
screen.print("->");
}else{
screen.setCursor(0,0);
screen.print(" ");
} if(line == 1){
screen.setCursor(0,18);
screen.print("->");
}else{
screen.setCursor(0,18);
screen.print(" ");
} if(line == 2){
screen.setCursor(0,36);
screen.print("->");
}else{
screen.setCursor(0,36);
screen.print(" ");
} if(line == 3){
screen.setCursor(0,54);
screen.print("->");
}else{
screen.setCursor(0,54);
screen.print(" ");
}
screen.display();
}
void lcd_data(){
screen.setCursor(15,0);
screen.print("Brightness :");
screen.setCursor(90,0);
screen.print(brightness);
screen.setCursor(15,18);
screen.print("led_on :");
screen.setCursor(90,18);
screen.print(ledon_interval);
screen.setCursor(15,36);
screen.print("led_off :");
screen.setCursor(90,36);
screen.print(ledoff_interval);
screen.setCursor(15,54);
screen.print("timeout :");
screen.setCursor(90,54);
screen.print(timeout);
screen.display();
}
void setup() {
screen.begin(SSD1306_SWITCHCAPVCC, SCREEN_I2C_ADDRESS);
screen.setTextSize(1);
screen.setTextColor(WHITE);
Serial.begin(9600);
currentstate = SETBRIGHTNESS;
up_button.init();
left_button.init();
right_button.init();
down_button.init();
timeout_tick = millis();
blink_interval_tick = millis();
screen.clearDisplay();
// delay(1000);
lcd_data();
line = 0;
cursor_position(line);
}
void loop() {
if(down_button.isPressed()){
if(currentstate == SETBRIGHTNESS){
screen.clearDisplay();
lcd_data();
currentstate = SETLEDON_INTERVAL;
line = 1;
}else if(currentstate == SETLEDON_INTERVAL){
screen.clearDisplay();
lcd_data();
currentstate = SETLEDOFF_INTERVAL;
line = 2;
}else if(currentstate == SETLEDOFF_INTERVAL){
screen.clearDisplay();
lcd_data();
currentstate = SETTIMEOUT;
line = 3;
}else if(currentstate == SETTIMEOUT){
screen.clearDisplay();
lcd_data();
screen.clearDisplay();
timeout_tick = millis();
blink_interval_tick = millis();
blink_interval = ledoff_interval;
currentstate = OPERATING;
line = 4;
}else if(currentstate == OPERATING){
operating = 1;
digitalWrite(LED_PIN, LOW);
currentstate = SETBRIGHTNESS;
line = 0;
}
cursor_position(line);
}
if(up_button.isPressed()){
if(currentstate == SETTIMEOUT){
screen.clearDisplay();
lcd_data();
currentstate = SETLEDOFF_INTERVAL;
line = 2;
}else if(currentstate == SETLEDOFF_INTERVAL){
screen.clearDisplay();
lcd_data();
currentstate = SETLEDON_INTERVAL;
line = 1;
}else if(currentstate == SETLEDON_INTERVAL){
screen.clearDisplay();
lcd_data();
currentstate = SETBRIGHTNESS;
line = 0;
}else if(currentstate == SETBRIGHTNESS){
screen.clearDisplay();
lcd_data();
screen.clearDisplay();
timeout_tick = millis();
blink_interval_tick = millis();
blink_interval = ledoff_interval;
currentstate = OPERATING;
line = 4;
}else if(currentstate == OPERATING){
operating = 1;
digitalWrite(LED_PIN, LOW);
currentstate = SETTIMEOUT;
line = 3;
}
cursor_position(line);
}
if (left_button.isPressed()) {
// increase_decrease == -1;
rotary_increament_decreament(currentstate,-1);
operating = 1;
} else if(right_button.isPressed()){
// increase_decrease == 1;
rotary_increament_decreament(currentstate,1);
operating = 1;
}
switch (currentstate){
case OPERATING:
operate = 1;
break;
}
if(operate == 1){
if(millis() - timeout_tick <=timeout*1000){
if(millis() - blink_interval_tick >= blink_interval*1000){
// Serial.println(blink_interval);
if(blink_interval == ledoff_interval && blinkstate == 0){
blink_interval = ledon_interval;
Serial.println("ledon");
Serial.println(blink_interval);
analogWrite(LED_PIN,brightness);
blinkstate = 1;
blink_interval_tick = millis();
}
else{
blink_interval = ledoff_interval;
Serial.println("ledoff");
Serial.println(blink_interval);
digitalWrite(LED_PIN, LOW);
blinkstate = 0;
blink_interval_tick = millis();
}
}
screen.clearDisplay();
screen.setCursor(0,0);
screen.print("Operating....");
screen.display();
}else{
operating = 1;
currentstate = SETBRIGHTNESS ;
line = 0;
analogWrite(LED_PIN,0);
}
operate = 0;
}
if(operating == 1){
// lcd.backlight();
screen.clearDisplay();
lcd_data();
cursor_position(line);
operating = 0;
}
}