/************************************
OLED製作功能表選單控制LED
可控制4LED
************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 寬度像素
#define SCREEN_HEIGHT 64 // OLED 高度像素
// 設定OLED
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 ssd(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//button
const byte up = 33;
const byte down = 13;
const byte ok = 26;
//button status
int up_last_state = 0;
int down_last_state = 0;
int ok_last_state = 0;
int sel = 1; //selected option
int layer = 0; //menu 層級
//LED
const byte red = 2;
const byte green = 15;
const byte yellow = 18;
const byte blue = 5;
//LED state
int red_state = 0;
int green_state = 0;
int yellow_state = 0;
int blue_state = 0;
//初始化顯示
void initoled() {
ssd.clearDisplay();
ssd.setTextSize(2); // 設定文字大小
ssd.setTextColor(1); // 1:OLED預設的顏色
ssd.setCursor(0, 0);
ssd.print("> Red");
ssd.setCursor(0, 20);
ssd.print(" Green");
ssd.setCursor(0, 40);
ssd.print(" More");
ssd.display(); // 要有這行才會把文字顯示出來
}
void displayoled() {
ssd.clearDisplay();
ssd.setTextSize(2); // 設定文字大小
ssd.setTextColor(WHITE);
ssd.setCursor(0, 0);
if(layer == 0){
if (sel == 1) {
ssd.print("> Red");
} else {
ssd.print(" Red");
}
ssd.setCursor(0, 20);
if (sel == 2) {
ssd.print("> Green");
} else {
ssd.print(" Green");
}
ssd.setCursor(0, 40);
if (sel == 3) {
ssd.print("> More");
} else {
ssd.print(" More");
}
}
if(layer == 1){
if (sel == 1) {
ssd.print("> Yellow");
} else {
ssd.print(" Yellow");
}
ssd.setCursor(0, 20);
if (sel == 2) {
ssd.print("> Blue");
} else {
ssd.print(" Blue");
}
ssd.setCursor(0, 40);
if (sel == 3) {
ssd.print("> Back");
} else {
ssd.print(" Back");
}
}
delay(10);
ssd.display(); // 要有這行才會把文字顯示出來
}
void setup() {
Serial.begin(9600);
pinMode(up, INPUT_PULLUP);
pinMode(down, INPUT_PULLUP);
pinMode(ok, INPUT_PULLUP);
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(blue, OUTPUT);
// 偵測是否安裝好OLED了
if (!ssd.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 一般1306 OLED的位址都是0x3C
Serial.println(F("SSD1306 allocation failed"));
for (;;)
;
}
ssd.clearDisplay(); // 清除畫面
delay(10);
initoled();
}
void loop() {
int button_up = digitalRead(up);
int button_down = digitalRead(down);
int button_ok = digitalRead(ok);
//up down select
if (button_up == 1 && up_last_state == 0) {
if (sel < 3) {
sel++;
}
displayoled();
}
if (button_down == 1 && down_last_state == 0) {
if (sel > 1) {
sel--;
}
displayoled();
}
//confirm action
if (button_ok == 1 && ok_last_state == 0) {
Serial.println("clicked");
if(layer == 0){
if(sel == 1){
red_state =!red_state;
digitalWrite(red, red_state);
}
if(sel == 2){
green_state =!green_state;
digitalWrite(green, green_state);
}
if(sel == 3){
sel = 1; //reset selected
layer = 1;
displayoled();
}
}
else if(layer == 1){
if(sel == 1){
yellow_state =!yellow_state;
digitalWrite(yellow, yellow_state);
}
if(sel == 2){
blue_state =!blue_state;
digitalWrite(blue, blue_state);
}
if(sel == 3){
layer = 0;
sel = 1;
displayoled();
}
}
}
up_last_state = button_up;
down_last_state = button_down;
ok_last_state = button_ok;
}