mirror of
https://github.com/dimoniche/solarium_arduino.git
synced 2026-01-30 01:23:30 +03:00
Поменял алгоритм работы кнопок в меню
This commit is contained in:
parent
c85da270c2
commit
c2072b26f9
@ -26,13 +26,12 @@ const PROGMEM char Device_Date[] = "09/09/24"; // дата производ
|
||||
const unsigned long block = 500000; // блокировка устройства при превышении этой суммы денег
|
||||
|
||||
//======Переменные обработки клавиш=================
|
||||
boolean lastReading = false; // флаг предыдущего состояния кнопки
|
||||
boolean buttonSingle = false; // флаг состояния "краткое нажатие"
|
||||
boolean buttonDouble = false; // флаг состояния "двойное нажатие"
|
||||
boolean buttonHold = false; // флаг состояния "долгое нажатие"
|
||||
unsigned long onTime = 0; // переменная обработки временного интервала
|
||||
unsigned long lastSwitchTime = 0; // переменная времени предыдущего переключения состояния
|
||||
unsigned long ledStartTime = 0; // переменная-флаг времени начала включения LED
|
||||
boolean lastReading[2] = {false, false}; // флаг предыдущего состояния кнопки
|
||||
boolean buttonSingle[2] = {false, false}; // флаг состояния "краткое нажатие"
|
||||
boolean buttonDouble[2] = {false, false}; // флаг состояния "двойное нажатие"
|
||||
boolean buttonHold[2] = {false, false}; // флаг состояния "долгое нажатие"
|
||||
unsigned long onTime[2] = {0, 0}; // переменная обработки временного интервала
|
||||
unsigned long lastSwitchTime[2] = {0, 0}; // переменная времени предыдущего переключения состояния
|
||||
|
||||
const int bounceTime = 10; // задержка для подавления дребезга
|
||||
const int holdTime = 1000; // время, в течение которого нажатие можно считать удержанием кнопки
|
||||
@ -135,50 +134,56 @@ LiquidCrystal_I2C lcd(0x27, SIZE_SCREEN_LINE, SIZE_SCREEN); //
|
||||
void read_buttons(byte x)
|
||||
{
|
||||
boolean reading = !digitalRead(x);
|
||||
int index = (x == buttonPin_Service ? 0 : 1);
|
||||
|
||||
if (reading && !lastReading) // проверка первичного нажатия
|
||||
if (reading && !lastReading[index]) // проверка первичного нажатия
|
||||
{
|
||||
onTime = millis();
|
||||
onTime[index] = millis();
|
||||
!index ? Serial.println("click button Service") : Serial.println("click button Start");
|
||||
}
|
||||
if (reading && lastReading) // проверка удержания
|
||||
if (reading && lastReading[index]) // проверка удержания
|
||||
{
|
||||
if ((millis() - onTime) > holdTime)
|
||||
if ((millis() - onTime[index]) > holdTime)
|
||||
{
|
||||
buttonHold = true;
|
||||
buttonHold[index] = true;
|
||||
!index ? Serial.println("buttonHold Service") : Serial.println("buttonHold Start");
|
||||
digitalWrite(LEDPin, !digitalRead(LEDPin)); // при удержании кнопки мигает светодиод
|
||||
isButtonHoldRepeate(x);
|
||||
}
|
||||
}
|
||||
if (!reading && lastReading) // проверка отпускания кнопки
|
||||
if (!reading && lastReading[index]) // проверка отпускания кнопки
|
||||
{
|
||||
if (((millis() - onTime) > bounceTime) && !buttonHold)
|
||||
if (((millis() - onTime[index]) > bounceTime) && !buttonHold[index])
|
||||
{
|
||||
if ((millis() - lastSwitchTime) >= doubleTime)
|
||||
if ((millis() - lastSwitchTime[index]) >= doubleTime)
|
||||
{
|
||||
lastSwitchTime = millis();
|
||||
buttonSingle = true;
|
||||
lastSwitchTime[index] = millis();
|
||||
buttonSingle[index] = true;
|
||||
!index ? Serial.println("buttonSingle Service") : Serial.println("buttonSingle Start");
|
||||
}
|
||||
else
|
||||
{
|
||||
lastSwitchTime = millis();
|
||||
buttonDouble = true;
|
||||
buttonSingle = false;
|
||||
isButtonDouble();
|
||||
buttonDouble = false; // сброс состояния после выполнения команды
|
||||
lastSwitchTime[index] = millis();
|
||||
buttonDouble[index] = true;
|
||||
!index ? Serial.println("buttonDouble Service") : Serial.println("buttonDouble Start");
|
||||
buttonSingle[index] = false;
|
||||
buttonDouble[index] = false; // сброс состояния после выполнения команды
|
||||
isButtonDouble(x);
|
||||
}
|
||||
}
|
||||
if (buttonHold)
|
||||
if (buttonHold[index])
|
||||
{
|
||||
buttonDouble = false;
|
||||
isButtonHold();
|
||||
buttonHold = false; // сброс состояния после выполнения команды
|
||||
buttonDouble[index] = false;
|
||||
buttonHold[index] = false; // сброс состояния после выполнения команды
|
||||
isButtonHold(x);
|
||||
}
|
||||
}
|
||||
lastReading = reading;
|
||||
if (buttonSingle && (millis() - lastSwitchTime) > doubleTime)
|
||||
lastReading[index] = reading;
|
||||
if (buttonSingle[index] && (millis() - lastSwitchTime[index]) > doubleTime)
|
||||
{
|
||||
buttonDouble = false;
|
||||
isButtonSingle();
|
||||
buttonSingle = false; // сброс состояния после выполнения команды
|
||||
buttonDouble[index] = false;
|
||||
buttonSingle[index] = false; // сброс состояния после выполнения команды
|
||||
isButtonSingle(x);
|
||||
}
|
||||
}
|
||||
|
||||
@ -219,7 +224,7 @@ struct parameter_digit {
|
||||
struct parameter_list {
|
||||
byte param_index;
|
||||
param_limit limit;
|
||||
char list_data[4][13];
|
||||
char list_data[4][11];
|
||||
};
|
||||
|
||||
struct parameter_header {
|
||||
@ -586,10 +591,10 @@ const menu_screen menu_settings[] PROGMEM = {
|
||||
3,
|
||||
},
|
||||
{
|
||||
"Luxura ",
|
||||
"FireSun UV ",
|
||||
"FireSun UV+K",
|
||||
"SunFlower "
|
||||
"Luxura ",
|
||||
"FS UV ",
|
||||
"FS UV+K ",
|
||||
"SunFlower"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -857,13 +862,50 @@ void reset_short_counters()
|
||||
save_long_parameter(short_time_counter);
|
||||
}
|
||||
|
||||
/*
|
||||
удержание кнопки на повторе
|
||||
*/
|
||||
void isButtonHoldRepeate(byte x)
|
||||
{
|
||||
need_reload_menu = true;
|
||||
|
||||
if(x == buttonPin_Start)
|
||||
{
|
||||
if(start_edit_parameter)
|
||||
{
|
||||
Serial.println("isButtonHoldRepeate");
|
||||
if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE)
|
||||
{
|
||||
if(all_byte_parameters[current_menu_screen.menu_lines[current_line_index].parameter.digit.param_index]++ >= current_menu_screen.menu_lines[current_line_index].parameter.digit.limit.max)
|
||||
{
|
||||
all_byte_parameters[current_menu_screen.menu_lines[current_line_index].parameter.digit.param_index] = current_menu_screen.menu_lines[current_line_index].parameter.digit.limit.min;
|
||||
}
|
||||
}
|
||||
else if(current_menu_screen.menu_lines[current_line_index].type == LIST_PARAM_LINE)
|
||||
{
|
||||
if(all_byte_parameters[current_menu_screen.menu_lines[current_line_index].parameter.list.param_index]++ >= current_menu_screen.menu_lines[current_line_index].parameter.list.limit.max)
|
||||
{
|
||||
all_byte_parameters[current_menu_screen.menu_lines[current_line_index].parameter.list.param_index] = current_menu_screen.menu_lines[current_line_index].parameter.list.limit.min;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
удержание кнопки
|
||||
*/
|
||||
void isButtonHold()
|
||||
void isButtonHold(byte x)
|
||||
{
|
||||
need_reload_menu = true;
|
||||
|
||||
if(x == buttonPin_Start)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(!menu_enable)
|
||||
{
|
||||
menu_index = MAIN_MENU;
|
||||
@ -875,20 +917,7 @@ void isButtonHold()
|
||||
}
|
||||
else
|
||||
{
|
||||
if(start_edit_parameter)
|
||||
{
|
||||
start_edit_parameter = false;
|
||||
need_hide_cursor = false;
|
||||
if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE)
|
||||
{
|
||||
save_byte_parameter(current_menu_screen.menu_lines[current_line_index].parameter.digit.param_index);
|
||||
}
|
||||
else if(current_menu_screen.menu_lines[current_line_index].type == LIST_PARAM_LINE)
|
||||
{
|
||||
save_byte_parameter(current_menu_screen.menu_lines[current_line_index].parameter.list.param_index);
|
||||
}
|
||||
}
|
||||
else
|
||||
if(!start_edit_parameter)
|
||||
{
|
||||
if(menu_index == MAIN_MENU)
|
||||
{
|
||||
@ -912,11 +941,11 @@ void isButtonHold()
|
||||
/*
|
||||
одиночное нажатие кнопки
|
||||
*/
|
||||
void isButtonSingle()
|
||||
void isButtonSingle(byte x)
|
||||
{
|
||||
need_reload_menu = true;
|
||||
|
||||
if(start_edit_parameter)
|
||||
if(start_edit_parameter && (x == buttonPin_Start || x == buttonPin_Service))
|
||||
{
|
||||
if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE)
|
||||
{
|
||||
@ -933,7 +962,7 @@ void isButtonSingle()
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else if(x == buttonPin_Service)
|
||||
{
|
||||
last_cursor_index = cursor_index;
|
||||
cursor_index++;
|
||||
@ -956,10 +985,14 @@ void isButtonSingle()
|
||||
/*
|
||||
двойное нажатие кнопки
|
||||
*/
|
||||
void isButtonDouble()
|
||||
void isButtonDouble(byte x)
|
||||
{
|
||||
need_reload_menu = true;
|
||||
|
||||
if(x == buttonPin_Start) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(current_menu_screen.menu_lines[current_line_index].type == MENU_LINE)
|
||||
{
|
||||
last_menu_index[menu_inter] = menu_index;
|
||||
@ -978,6 +1011,17 @@ void isButtonDouble()
|
||||
start_edit_parameter = true;
|
||||
hide_cursor();
|
||||
need_hide_cursor = true;
|
||||
} else {
|
||||
start_edit_parameter = false;
|
||||
need_hide_cursor = false;
|
||||
if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE)
|
||||
{
|
||||
save_byte_parameter(current_menu_screen.menu_lines[current_line_index].parameter.digit.param_index);
|
||||
}
|
||||
else if(current_menu_screen.menu_lines[current_line_index].type == LIST_PARAM_LINE)
|
||||
{
|
||||
save_byte_parameter(current_menu_screen.menu_lines[current_line_index].parameter.list.param_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -995,7 +1039,7 @@ void show_line(byte index_line)
|
||||
else if(current_menu_screen.menu_lines[index_line].type == DIGIT_PARAM_LINE)
|
||||
{
|
||||
char line[SIZE_SCREEN_LINE * 2];
|
||||
char format[9] = "%s %d %s";
|
||||
char format[11] = "%s %d %s ";
|
||||
if(start_edit_parameter && index_line == current_line_index)
|
||||
{
|
||||
format[2] = '>';
|
||||
@ -1008,7 +1052,7 @@ void show_line(byte index_line)
|
||||
else if(current_menu_screen.menu_lines[index_line].type == LIST_PARAM_LINE)
|
||||
{
|
||||
char line[SIZE_SCREEN_LINE * 2];
|
||||
char format[6] = "%s %s";
|
||||
char format[8] = "%s %s ";
|
||||
if(start_edit_parameter && index_line == current_line_index)
|
||||
{
|
||||
format[2] = '>';
|
||||
@ -1283,6 +1327,7 @@ void menu()
|
||||
while (menu_enable == true)
|
||||
{
|
||||
read_buttons(buttonPin_Service);
|
||||
read_buttons(buttonPin_Start);
|
||||
|
||||
if(need_clear_menu)
|
||||
{
|
||||
@ -1436,6 +1481,7 @@ void setup()
|
||||
void loop()
|
||||
{
|
||||
read_buttons(buttonPin_Service);
|
||||
read_buttons(buttonPin_Start);
|
||||
hide_cursor();
|
||||
need_hide_cursor = true;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user