#include <Wire.h>
#include <U8g2lib.h>
#include <Arduino.h>
//Pin Rotate Encoder
#define RE_CLK_Pin 34
#define RE_DT_Pin 35
#define RE_SW_Pin 32
int RE_Counter = 0;
int RE_CLK_last;
int RE_CLK_current;
int RE_RT_current;
int RE_SW = 0;
int RE_Dir; // Left:1 Right=0
//Pin button
#define btn_Pin1 27
#define btn_Pin2 14
#define btn_Pin3 12
int btn1;
int btn2;
int btn3;
//Pin Rocker Bar
#define RB_VRX_Pin 26
#define RB_VRY_Pin 25
#define RB_SW_Pin 33
int RB_VRX;
int RB_VRY;
int RB_SW;
//Menu
uint8_t func_index=0;
void (*current_operation_index)();
void fun1();
void fun2();
void fun3();
void fun4();
void page_1_to_4();
typedef struct
{
uint8_t current;
uint8_t up;
uint8_t down;
uint8_t enter;
void (*current_operation)();
}key_table;
key_table table[7]=
{
{0,3,1,0,(*fun1)},
{1,0,2,1,(*fun2)},
{2,1,3,2,(*fun3)},
{3,2,0,3,(*fun4)},
};
// OLED
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
//Settings
void setPins();
//Functions
//setup
void setup() {
Serial.begin(9600);
setPins();
u8g2.begin();
u8g2.enableUTF8Print();
RE_CLK_last = digitalRead(RE_CLK_Pin);
}
void loop() {
//Button
btn1 = digitalRead(btn_Pin1);
btn2 = digitalRead(btn_Pin2);
btn3 = digitalRead(btn_Pin3);
//Rocker Bar
RB_VRX = analogRead(RB_VRX_Pin);
RB_VRY = analogRead(RB_VRY_Pin);
RB_SW = digitalRead(RB_SW_Pin);
//Rotate Encoder
RE_CLK_current = digitalRead(RE_CLK_Pin);
RE_RT_current = digitalRead(RE_DT_Pin);
int RE_RT_current = digitalRead(RE_DT_Pin);
if(RE_CLK_current != RE_CLK_last && RE_CLK_current == 1)
{
if(RE_RT_current != RE_CLK_current)
{RE_Counter--; RE_Dir = 1;}
else
{RE_Counter++; RE_Dir = 0;}
}
RE_CLK_last = RE_CLK_current;
RE_SW = digitalRead(RE_SW_Pin);
//
if((btn1==1)||(btn2==1)||(btn3==1))
{
if(btn1==1)
{
func_index=table[func_index].up;
}
if(btn2==1)
{
func_index=table[func_index].down;
}
if(btn3==1)
{
func_index=table[func_index].enter;
}
}
current_operation_index=table[func_index].current_operation;
(*current_operation_index)();//执行当前操作函数
}
void setPins()
{
//Rotae Encoder
pinMode(RE_CLK_Pin, INPUT);
pinMode(RE_DT_Pin, INPUT);
pinMode(RE_SW_Pin, INPUT_PULLUP);
//Button
pinMode(btn_Pin1, INPUT_PULLUP);
pinMode(btn_Pin2, INPUT_PULLUP);
pinMode(btn_Pin3, INPUT_PULLUP);
//Rocker Bar
pinMode(RB_VRX_Pin, INPUT);
pinMode(RB_VRY_Pin, INPUT);
pinMode(RB_SW_Pin, INPUT_PULLUP);
}
void fun1(){
u8g2.clearBuffer();
page_1_to_4();
u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
u8g2.drawGlyph(5, 16*(1%4==0? 4:1%4)-4,118);
u8g2.sendBuffer();
}
void fun2(){
u8g2.clearBuffer();
page_1_to_4();
u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
u8g2.drawGlyph(5, 16*(2%4==0? 4:2%4)-4,118);
u8g2.sendBuffer();
}
void fun3(){
u8g2.clearBuffer();
page_1_to_4();
u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
u8g2.drawGlyph(5, 16*(3%4==0? 4:3%4)-4,118);
u8g2.sendBuffer();
}
void fun4(){
u8g2.clearBuffer();
page_1_to_4();
u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
u8g2.drawGlyph(5, 16*(4%4==0? 4:4%4)-4,118);
u8g2.sendBuffer();
}
void page_1_to_4(){
u8g2.setFont(u8g2_font_wqy14_t_gb2312a);
u8g2.setCursor(20, 16*1-2);
u8g2.print("Model");
u8g2.setCursor(20, 16*2-2);
u8g2.print("Link");
u8g2.setCursor(20, 16*3-2);
u8g2.print("Menu");
u8g2.setCursor(20, 16*4-2);
u8g2.print("Test");
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA
encoder1:CLK
encoder1:DT
encoder1:SW
encoder1:VCC
encoder1:GND
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
joystick1:VCC
joystick1:VERT
joystick1:HORZ
joystick1:SEL
joystick1:GND