#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
void cfdrop();
void cal();
void set_amount();
void set_constant();
void (*Func_list[4])() = {cfdrop, cal, set_amount, set_constant};
//int dial 함수, 변수들
int dial(); //로터리 인코더의 입력값 반환. 시계 1 반시계 -1 클릭 0
#define CLK 7 // 로터리 인코더 CLK 핀
#define DT 8 // 로터리 인코더 DT 핀
#define SW 9 // 로터리 인코더 스위치 핀
int counter = 0; // 메뉴 선택용 카운터
int currentStateCLK; // CLK의 현재 신호 상태 저장
int lastStateCLK; // 직전 CLK의 신호 상태 저장
unsigned long lastButtonPress = 0; // 버튼 눌림 시간 저장
//void select 함수, 변수들
void select(char* Func_name_arr[]);
char *Func_name_arr[] = {"1_cfdrop", "2_cal", "3_set_amount", "4_set_constant"};
int Func_name_arr_size = 4; //메뉴 이름 배열의 크기
//void lcd_print 함수, 변수들
//문자열 두 개를 lcd에 출력
void lcd_print(String a, String b);
LiquidCrystal_I2C lcd(0x27, 16, 2); //I2C 주소는 LCD에 맞게 수정해야 합니다.
//EEPROM 함수들, 변수들
//void EEPROM_put 함수
//EEPROM의 주소값에 실수를 기입하는 함수이다.
void EEPROM_put(int EEPROM_Address, float value);
//float EEPROM_get 함수
//EEPROM의 주소값의 실수값을 반환하는 함수이다.
float EEPROM_get(int EEPROM_Address);
//EEPROM 변수들
float Loadcell_num, Gram_num, Constant_num;
float* vars[] = {&Loadcell_num, &Gram_num, &Constant_num};
//로드셀 함수들, 변수들
//--------------------------------------------------------------------
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의 백라이트를 켜줍니다.
//EEPROM 읽어와서 저장하기 코드
for(int i=0;i<3;i++)
{
*vars[i] = EEPROM_get(i*sizeof(float));
Serial.println(*vars[i]);
}
}
void loop()
{
select(Func_name_arr);
Serial.println("Restart");
}
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;
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) break;
}
lcd.clear();
//함수 실행
Func_list[menu_num]();
/*
switch (menu_num)
{
case 0:
//함수 1;
break;
case 1:
//함수 1;
break;
case 2:
//함수 1;
break;
case 3:
//함수 1;
break;
}
*/
}
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);
}
//-------------------------------------------------------------------
//EEPROM의 주소값에 실수를 기입하는 함수이다.
void EEPROM_put(int EEPROM_Address, float value)
{
EEPROM.put(EEPROM_Address, value);
}
//------------------------------------------------------------------
//EEPROM의 주소값의 실수값을 반환하는 함수이다.
float EEPROM_get(int EEPROM_Address)
{
float value;
EEPROM.get(EEPROM_Address, value);
return value;
}
void cfdrop()
{
Serial.println("cfdrop");
}
void cal()
{
Serial.println("cal");
}
void set_amount()
{
Serial.println("set_amount");
float num = 0;
int Local_constant = 0;
lcd_print("set_amount mode","");
delay(2000);
while(1)
{
lcd_print("weight is : ", String(num) + " g");
Local_constant = dial();
num += Local_constant * 0.1;
if(Local_constant == 0) break;
}
Gram_num = num;
lcd_print("Saved", " : " + String(Gram_num));
delay(2000);
}
void set_constant()
{
Serial.println("set_constant");
float num = 0;
int Local_constant = 0;
lcd_print("set_constant mode","");
delay(2000);
while(1)
{
lcd_print("constant is : ", String(num) + " g");
Local_constant = dial();
num += Local_constant * 0.1;
if(Local_constant == 0) break;
}
Constant_num = num;
lcd_print("Saved", " : " + String(Constant_num));
delay(2000);
}