Скелет работы с соляриями

This commit is contained in:
Dmitriy 2024-09-17 00:26:56 +03:00
parent eb203bfb28
commit 362aeb6ae5

View File

@ -11,7 +11,12 @@ const byte inhibitPin = 4; // +Inhibit (зеленый)
const byte buttonPin_Start = 15; // номер входа, подключенный к кнопке "Старт", А0 const byte buttonPin_Start = 15; // номер входа, подключенный к кнопке "Старт", А0
const byte buttonPin_Service = 13; // номер входа, подключенный к кнопке "Сервис", А1 const byte buttonPin_Service = 13; // номер входа, подключенный к кнопке "Сервис", А1
const byte LEDPin = 14; // номер выхода светодиода кнопки Старт, DB13 const byte LEDPin = 14; // номер выхода светодиода кнопки Старт, DB13
//const byte RelayPin = 17; // номер выхода, подключенный к реле, А3
// ноги управления соляриями
const byte lamp_start_pin = 5; // Запуск солярия Luxura. Включение ламп солярия FireSun, SunFlower
const byte vent_pin = 6; // Включение вентиляторов солярия FireSun, SunFlower
const byte start_solarium = 7; // Удаленный старт от солярия
const byte Device_SerNum = 1; // серийный номер устройства const byte Device_SerNum = 1; // серийный номер устройства
const PROGMEM char Device_Ver[] = "0.0"; // версия ПО устройства const PROGMEM char Device_Ver[] = "0.0"; // версия ПО устройства
const PROGMEM char Device_Date[] = "09/09/24"; // дата производства устройства const PROGMEM char Device_Date[] = "09/09/24"; // дата производства устройства
@ -96,15 +101,14 @@ const byte all_byte_parameters_default[COUNT_BYTE_PARAMETER] = {
#define short_starts_counter 3 #define short_starts_counter 3
#define short_money_counter 4 #define short_money_counter 4
#define short_time_counter 5 #define short_time_counter 5
#define impulse_counter 6 #define money_counter 6
#define COUNT_LONG_PARAMETER 7 #define COUNT_LONG_PARAMETER 7
unsigned long all_long_parameters[COUNT_LONG_PARAMETER]; unsigned long all_long_parameters[COUNT_LONG_PARAMETER];
#define time_seance 0 #define time_seance 0
#define time_delay 1 #define time_delay 1
#define time_delay 1
#define COUNT_TEXT_PARAMETER 2 #define COUNT_TEXT_PARAMETER 2
char text_parameters[COUNT_TEXT_PARAMETER][6]; char text_parameters[COUNT_TEXT_PARAMETER][20];
// ============================== Описываем свой символ "Рубль" ======================================================================== // ============================== Описываем свой символ "Рубль" ========================================================================
// Просто "рисуем" символ единицами. Единицы при выводе на экран окажутся закрашенными точками, нули - не закрашенными // Просто "рисуем" символ единицами. Единицы при выводе на экран окажутся закрашенными точками, нули - не закрашенными
@ -258,10 +262,10 @@ const menu_screen menu_main[] PROGMEM = {
{0} {0}
}, },
{ {
" BHECEHO", " BHECEHO",
DIGIT_VIEW_LINE, DIGIT_VIEW_LINE,
{ {
impulse_counter, money_counter,
{ {
0, 0,
0, 0,
@ -271,7 +275,7 @@ const menu_screen menu_main[] PROGMEM = {
}, },
{ {
"", "",
DIGIT_VIEW_LINE, TEXT_PARAM_LINE,
{ {
time_seance, time_seance,
{ {
@ -316,13 +320,13 @@ const menu_screen menu_main[] PROGMEM = {
{0} {0}
}, },
{ {
" CEAHC", " CEAHC",
FIXED_LINE, FIXED_LINE,
{0} {0}
}, },
{ {
" ", " ",
DIGIT_VIEW_LINE, TEXT_PARAM_LINE,
{ {
time_seance, time_seance,
{ {
@ -754,8 +758,8 @@ void reset_parameter()
all_long_parameters[short_time_counter] = 0; all_long_parameters[short_time_counter] = 0;
save_long_parameter(short_time_counter); save_long_parameter(short_time_counter);
all_long_parameters[impulse_counter] = 0; all_long_parameters[money_counter] = 0;
save_long_parameter(impulse_counter); save_long_parameter(money_counter);
} }
/* /*
@ -978,9 +982,10 @@ void hide_cursor()
* фиксируется время появления импульса в lastStateChangeTime. Если длительность импульса > debounceDelay (время дребезга), * фиксируется время появления импульса в lastStateChangeTime. Если длительность импульса > debounceDelay (время дребезга),
* значит это полезный импульс, значения изменяются reading = trueState = lastState = LOW * значит это полезный импульс, значения изменяются reading = trueState = lastState = LOW
*/ */
void read_money_impulse () bool read_money_impulse ()
{ {
int reading = digitalRead(moneyPin); int reading = digitalRead(moneyPin);
bool impulse = false;
if (reading != lastState) if (reading != lastState)
{ {
lastStateChangeTime = millis(); lastStateChangeTime = millis();
@ -992,11 +997,14 @@ void read_money_impulse ()
trueState = reading; trueState = reading;
if (trueState == LOW) if (trueState == LOW)
{ {
all_long_parameters[impulse_counter] += all_byte_parameters[weight_impulse]; all_long_parameters[money_counter] += all_byte_parameters[weight_impulse];
impulse = true;
} }
} }
} }
lastState = reading; lastState = reading;
return impulse;
} }
/* /*
@ -1004,30 +1012,59 @@ void read_money_impulse ()
*/ */
void get_money () void get_money ()
{ {
read_money_impulse (); bool impulse = read_money_impulse();
minute = all_long_parameters[impulse_counter] / all_byte_parameters[price]; minute = all_long_parameters[money_counter] / all_byte_parameters[price];
remain = all_long_parameters[impulse_counter] % all_byte_parameters[price]; remain = all_long_parameters[money_counter] % all_byte_parameters[price];
second = remain * 60 / all_byte_parameters[price]; second = remain * 60 / all_byte_parameters[price];
if (all_long_parameters[impulse_counter] >= all_byte_parameters[price]) if(impulse) need_reload_menu = true;
if (all_long_parameters[money_counter] >= all_byte_parameters[price])
{ {
// достаточно денег для оказания услуги // достаточно денег для оказания услуги
sprintf(text_parameters[time_seance]," CEAHC %02d:%02d MUH", minute, second); sprintf(text_parameters[time_seance]," CEAHC %02d:%02d MUH", minute, second);
digitalWrite(LEDPin, HIGH); // зажигаем светодиод digitalWrite(LEDPin, HIGH); // зажигаем светодиод
if (digitalRead(buttonPin_Start) == LOW)
if (digitalRead(buttonPin_Start) == HIGH)
{ {
digitalWrite(inhibitPin, HIGH); // выставляем запрет приема монет digitalWrite(inhibitPin, HIGH); // выставляем запрет приема монет
digitalWrite(LEDPin, LOW); // гасим светодиод digitalWrite(LEDPin, LOW); // гасим светодиод
lcd.clear();
sprintf(text_parameters[time_seance],"%2d", all_byte_parameters[pause_before]); // сохраняем статистику
delay(all_byte_parameters[pause_before]); {
all_long_parameters[long_starts_counter]++;
save_long_parameter(long_starts_counter);
all_long_parameters[short_starts_counter]++;
save_long_parameter(short_starts_counter);
all_long_parameters[long_time_counter] += minute * 60 + second;
save_long_parameter(long_time_counter);
all_long_parameters[short_time_counter] += minute * 60 + second;
save_long_parameter(short_time_counter);
all_long_parameters[long_money_counter] += all_long_parameters[money_counter];
save_long_parameter(long_money_counter);
all_long_parameters[short_money_counter] += all_long_parameters[money_counter];
save_long_parameter(short_money_counter);
all_long_parameters[money_counter] = 0;
save_long_parameter(money_counter);
}
// задержка до запуска
memcpy_P( &current_menu_screen, &menu_main[1], sizeof(menu_screen));
sprintf(text_parameters[time_delay],"%2d", all_byte_parameters[pause_before]);
lcd.clear();
show_menu();
delay(all_byte_parameters[pause_before] * 1000);
memcpy_P( &current_menu_screen, &menu_main[2], sizeof(menu_screen));
menu_index = 2;
sprintf(text_parameters[time_seance]," %02d:%02d", minute, second);
need_clear_menu = true;
need_reload_menu = true;
bill_enable =! bill_enable; // устанавливаем флаг: не принимаем деньги bill_enable =! bill_enable; // устанавливаем флаг: не принимаем деньги
// Запускаем работу солярия
} }
} }
} }
@ -1079,7 +1116,35 @@ void one_half_second()
*/ */
void second_event() void second_event()
{ {
unsigned long time_remain = minute * 60 + second - 1;
minute = time_remain / 60;
second = time_remain % 60;
sprintf(text_parameters[time_seance]," %02d:%02d", minute, second);
need_reload_menu = true;
if(menu_index == 3 && time_remain == 0)
{
memcpy_P( &current_menu_screen, &menu_main[0], sizeof(menu_screen));
sprintf(text_parameters[time_seance],"");
menu_index = 0;
need_clear_menu = true;
need_reload_menu = true;
bill_enable =! bill_enable;
}
if(menu_index == 2 && time_remain == 0)
{
memcpy_P( &current_menu_screen, &menu_main[3], sizeof(menu_screen));
menu_index = 3;
need_clear_menu = true;
need_reload_menu = true;
second = 10;
}
} }
void countdown_timer() void countdown_timer()
@ -1097,7 +1162,8 @@ void countdown_timer()
} }
} }
void setup() { void setup()
{
Serial.begin(115200); Serial.begin(115200);
lcd.init(); // инициализация LCD lcd.init(); // инициализация LCD
@ -1115,6 +1181,8 @@ void setup() {
load_parameter(); load_parameter();
memcpy_P( &current_menu_screen, &menu_main[0], sizeof(menu_screen)); memcpy_P( &current_menu_screen, &menu_main[0], sizeof(menu_screen));
sprintf(text_parameters[time_seance],"");
menu_index = 0;
} }
void loop() void loop()
@ -1135,6 +1203,11 @@ void loop()
{ {
get_money(); get_money();
} }
if(need_clear_menu)
{
lcd.clear();
need_clear_menu = false;
}
if(need_reload_menu) if(need_reload_menu)
{ {
show_menu(); show_menu();