//실수 .00단위까지 출력한다. lcd에.
//로터리 인코더 오른쪽 딸깍 = 실수 += 0.1, 왼쪽 -= 0.1, 클릭 시 시리얼 모니터에 "saved" 출력
#include <LiquidCrystal_I2C.h>
//int dial 변수들
#define CLK 7 // 로터리 인코더 CLK 핀
#define DT 8 // 로터리 인코더 DT 핀
#define SW 9 // 로터리 인코더 스위치 핀
int counter = 0; // 메뉴 선택용 카운터
int currentStateCLK; // CLK의 현재 신호 상태 저장
int lastStateCLK; // 직전 CLK의 신호 상태 저장
unsigned long lastButtonPress = 0; // 버튼 눌림 시간 저장
int dial(); //로터리 인코더의 입력값 반환. 시계 1 반시계 -1 클릭 0
char *Func_name_arr[] = { "1_Lee", "2_Hyun", "3_Ho", "4_Babo" };
int Func_name_arr_size = 4;
//void lcd_print 변수들
LiquidCrystal_I2C lcd(0x27, 16, 2); //I2C 주소는 LCD에 맞게 수정해야 합니다.
void lcd_print(String a, String b); //문자열 두 개를 lcd에 출력
void select(char* Func_name_arr[]);
//--------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP); // 스위치 핀 내부 풀업 저항 사용
lastStateCLK = digitalRead(CLK); // CLK 핀의 초기 상태 저장
//void lcd_print
lcd.init(); // I2C LCD를 초기화 합니다..
lcd.backlight(); // I2C LCD의 백라이트를 켜줍니다.
}
void loop()
{
select(Func_name_arr);
while(1)
{
}
}
void select(char* Func_name_arr[])
{
int menu_num = 0;
lcd_print("Select Function", String(Func_name_arr[menu_num]));
while(1)
{
int dial_output = dial();
menu_num += dial_output;
Serial.println(Func_name_arr_size);
if(menu_num<0) menu_num = Func_name_arr_size - 1;
else if(menu_num >= Func_name_arr_size) menu_num = 0;
lcd_print("Select Function", String(Func_name_arr[menu_num]));
if (dial_output == 0) return 0;
}
}
int dial()
{
while(1)
{
{ // 무한 루프, 메뉴 선택 대기
currentStateCLK = digitalRead(CLK); // 현재 CLK 핀 상태 읽기
// 로터리 인코더가 회전했는지 확인
if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
// 회전 방향에 따라 메뉴 항목 이동
if (digitalRead(DT) != currentStateCLK) {
//Serial.println("1");
lastStateCLK = currentStateCLK;
return 1;
} else {
//Serial.println("-1");
lastStateCLK = currentStateCLK;
return -1;
}
}
lastStateCLK = currentStateCLK; // 마지막 CLK 상태 업데이트
// 스위치가 눌렸는지 확인
int btnState = digitalRead(SW);
if (btnState == LOW) {
//Serial.println("0");
lastStateCLK = currentStateCLK;
return 0;
delay(50); // 디바운싱 처리
if (digitalRead(SW) == LOW) {
//Serial.println("0");
}
}
}
delay(1);
}
}
//--------------------------------------------------------------------
void lcd_print(String a, String b)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(a);
lcd.setCursor(0,1);
lcd.print(b);
}