Piñas update

This commit is contained in:
Arturo Corro 2022-07-19 00:52:35 -05:00
parent 2eeedbe232
commit 87af839da4

View File

@ -40,20 +40,18 @@
* MENÚ
**************************************************/
// BLOQUES DE MEMORIA EEPROM
#define BUTTON_SENSITIVITY_EEPROM_ADDRESS 0
#define PRESS_BUTTON_EEPROM_ADDRESS 1
#define HOLD_DOWN_BUTTON_EEPROM_ADDRESS 2
#define LAG_TIME_MIN_EEPROM_ADDRESS 3 // Minutos, tiempo de retraso
#define LAG_TIME_SEG_EEPROM_ADDRESS 4 // Segundo, tiempo de retraso
#define LAG_TIME_DEC_EEPROM_ADDRESS 5 // Décimas de segundo, tiempo de retraso
#define DOSING_TIME_MIN_EEPROM_ADDRESS 6 // Minutos, tiempo dosificación
#define DOSING_TIME_SEG_EEPROM_ADDRESS 7 // Segundos, tiempo dosificación
#define DOSING_TIME_DEC_EEPROM_ADDRESS 8 // Décimas de segundo, tiempo dosificación
#define BUTTON_SENSITIVITY_EEPROM_ADDRESS 0
#define DISPENSER_MODE_EEPROM_ADDRESS 1
#define LAG_TIME_MIN_EEPROM_ADDRESS 2 // Minutos, tiempo de retraso
#define LAG_TIME_SEG_EEPROM_ADDRESS 3 // Segundo, tiempo de retraso
#define LAG_TIME_DEC_EEPROM_ADDRESS 4 // Décimas de segundo, tiempo de retraso
#define DOSING_TIME_MIN_EEPROM_ADDRESS 5 // Minutos, tiempo dosificación
#define DOSING_TIME_SEG_EEPROM_ADDRESS 6 // Segundos, tiempo dosificación
#define DOSING_TIME_DEC_EEPROM_ADDRESS 7 // Décimas de segundo, tiempo dosificación
// FACTORY SETTINGS
#define BUTTON_SENSITIVITY_DEFAULT_VALUE 9
#define PRESS_BUTTON_DEFAULT_VALUE 3
#define HOLD_DOWN_BUTTON_DEFAULT_VALUE 1
#define BUTTON_SENSITIVITY_DEFAULT_VALUE 10
#define DISPENSER_MODE_DEFAULT_VALUE 2
#define LAG_TIME_MIN_DEFAULT_VALUE 0 // Minutos, tiempo de retraso
#define LAG_TIME_SEG_DEFAULT_VALUE 3 // Segundo, tiempo de retraso
#define LAG_TIME_DEC_DEFAULT_VALUE 5 // Décimas de segundo, tiempo de retraso
@ -62,32 +60,33 @@
#define DOSING_TIME_DEC_DEFAULT_VALUE 9 // Décimas de segundo, tiempo dosificación
// SETTINGS MENU
#define ALL_SETTINGS 0
#define OUT_OF_MENU 0
#define OUT_OF_MENU 0
#define ALL_SETTINGS 0
#define IN_SENSITIVITY_BUTTON 1
#define IN_PRESS_BUTTON 2
#define IN_HOLD_DOWN_BUTTON 3
#define IN_LAG 4
#define IN_DOSING 5
#define IN_FACTORY_RESET 6
#define IN_RESTART 7
#define IN_EXIT 8
// POSITION MENU
#define IN_SENSITIVITY_BUTTON 1
#define IN_DISPENSER_MODE 2
#define IN_LAG 3
#define IN_DOSING 4
#define IN_FACTORY_RESET 5
#define IN_RESTART 6
#define IN_EXIT 7
#define VIEW 0
#define UPDATE 1
#define VIEW 0
#define UPDATE 1
#define POSITION_ONE 0
#define POSITION_TWO 1
#define POSITION_THREE 2
#define POSITION_ONE 0
#define POSITION_TWO 1
#define POSITION_THREE 2
#define MODE_1 0
#define MODE_2 1
#define MODE_3 2
#define FACTORY_RESET 3
#define RESTART 4
#define CANCEL 5
// text_info[] index
#define DISPENSER_MODE 0
#define BELT_MODE 1
#define FACTORY_RESET 2
#define RESTART 3
#define CANCEL 4
// MENU & LCD
#define AUTO_EXIT_MENU_MILLIS 15000
#define BLINK_MILLIS 1600
#define LCD_PROCESS_REFRESH_MILLIS 333
@ -100,13 +99,22 @@
#define DISPENSER_DOSING 3
#define DISPENSER_BLOCK 4
// STATUS RELAY
#define RELAY_HIGH HIGH
#define RELAY_LOW LOW
// MODE EEPROM DISPENSER
#define DISPENSER_MODE_VALUE 1
#define BELT_MODE_VALUE 2
// STATUS BUTTON
#define DOSING_BUTTON_PUSH 0
#define DOSING_BUTTON_IDLE 1
// RELAY STATUS
#define RELAY_HIGH HIGH
#define RELAY_LOW LOW
// SENSOR STATUS
#define SENSOR_UNLOCK 0
#define SENSOR_LOCK 1
#define SENSOR_ACTIVATED LOW
// SENSOR ACTIVATION BUFFER SIZE
#define SENSOR_BUFFER_SIZE 25
/**************************************************
@ -134,35 +142,49 @@
/**************************************************
* ENVIRONMENT VARIABLES
**************************************************/
// Dosing
// Configuraciones del dosificador
uint16_t button_sensitivity_millis;
uint8_t press_button_mode;
uint8_t hold_down_button_mode;
uint8_t dispenser_mode;
uint16_t lag_time_decseg;
uint16_t dosing_time_decseg;
uint32_t button_pressed_millis;
uint8_t release_button;
// Momento del bloqueo del sensor
uint32_t sensor_lock_millis;
// Registro del sensor
uint8_t last_sensor_status = SENSOR_UNLOCK;
uint8_t relay_activation_pointer;
uint32_t relay_activation_millis_ini[SENSOR_BUFFER_SIZE];
uint32_t relay_activation_millis_end[SENSOR_BUFFER_SIZE];
// Estado del Relevador
uint8_t relay_state = RELAY_LOW;
// Estado del dosificador
uint8_t dispenser_status;
uint32_t dispenser_status_time_millis;
// Navegación de menú
uint8_t setup_var[3];
uint8_t menu_section;
uint8_t menu_status;
uint8_t menu_cursor_var;
uint8_t setup_var[3];
uint32_t blink_millis;
uint32_t last_change_menu_millis;
boolean refresh_lcd_menu;
// LCD2004 Render
LiquidCrystal_I2C lcd(LCD_I2C_ADDRESS, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
String menu[] = {
"SENSIBILIDAD BOTON",
"AL PRESIONAR BOTON",
"AL MANTENER PRESIO",
"SENSIBILIDAD SENSOR",
"MODO DE TRABAJO",
"RETARDO AL INICIAR",
"TIEMPO DOSIFICACION",
"VALORES DE FABRICA",
@ -179,17 +201,13 @@
};
String text_info[] = {
"MODO 1",
"MODO 2",
"MODO 3",
"DOSIFICADOR",
"BANDA TRANSPORTADOR",
"RESTAURAR",
"REINICAR",
"CANCELAR",
};
boolean refresh_lcd_menu;
uint32_t blink_millis;
/**************************************************
* FRONT PANEL OF CONFIGURATIONS
@ -291,20 +309,12 @@
save_setting(IN_SENSITIVITY_BUTTON);
break;
case IN_PRESS_BUTTON:
case IN_DISPENSER_MODE:
if(menu_status == VIEW)
menu_status = UPDATE;
else if(++menu_cursor_var > POSITION_ONE)
save_setting(IN_PRESS_BUTTON);
break;
case IN_HOLD_DOWN_BUTTON:
if(menu_status == VIEW)
menu_status = UPDATE;
else if(++menu_cursor_var > POSITION_ONE)
save_setting(IN_HOLD_DOWN_BUTTON);
save_setting(IN_DISPENSER_MODE);
break;
case IN_LAG:
@ -374,19 +384,10 @@
}
break;
case IN_PRESS_BUTTON:
case IN_DISPENSER_MODE:
if(menu_status == VIEW){
load_menu_variables(IN_SENSITIVITY_BUTTON);
}else{ // UPDATE
setup_var[0] = setup_var[0] <= 1 ? 3 : --setup_var[0];
}
break;
case IN_HOLD_DOWN_BUTTON:
if(menu_status == VIEW){
load_menu_variables(IN_PRESS_BUTTON);
}else{ // UPDATE
setup_var[0] = setup_var[0] <= 1 ? 2 : --setup_var[0];
}
@ -394,7 +395,7 @@
case IN_LAG:
if(menu_status == VIEW){
load_menu_variables(IN_SENSITIVITY_BUTTON);
load_menu_variables(IN_DISPENSER_MODE);
}else{ // UPDATE
if(menu_cursor_var == POSITION_ONE)
@ -426,7 +427,9 @@
case IN_FACTORY_RESET:
if(menu_status == VIEW){
load_menu_variables(IN_DOSING);
dispenser_mode == DISPENSER_MODE_VALUE?
load_menu_variables(IN_DOSING):
load_menu_variables(IN_LAG);
}else{ // UPDATE
setup_var[0] = setup_var[0] >= 1 ? 0 : ++setup_var[0];
@ -443,7 +446,7 @@
break;
case IN_EXIT:
load_menu_variables(IN_FACTORY_RESET);
load_menu_variables(IN_RESTART);
break;
}
break;
@ -456,23 +459,14 @@
case IN_SENSITIVITY_BUTTON:
if(menu_status == VIEW){
load_menu_variables(IN_LAG);
load_menu_variables(IN_DISPENSER_MODE);
}else{ // UPDATE
setup_var[0] = setup_var[0] <= 1 ? 10 : --setup_var[0];
}
break;
case IN_PRESS_BUTTON:
if(menu_status == VIEW){
load_menu_variables(IN_LAG);
}else{ // UPDATE
setup_var[0] = setup_var[0] >= 3 ? 1 : ++setup_var[0];
}
break;
case IN_HOLD_DOWN_BUTTON:
case IN_DISPENSER_MODE:
if(menu_status == VIEW){
load_menu_variables(IN_LAG);
@ -483,7 +477,9 @@
case IN_LAG:
if(menu_status == VIEW){
load_menu_variables(IN_DOSING);
dispenser_mode == DISPENSER_MODE_VALUE?
load_menu_variables(IN_DOSING):
load_menu_variables(IN_FACTORY_RESET);
}else{ // UPDATE
if(menu_cursor_var == POSITION_ONE)
@ -541,8 +537,8 @@
refresh_lcd_menu = true;
last_change_menu_millis = millis();
serialPrint("button_value: ");
serialPrintln(button_value);
//serialPrint("button_value: ");
//serialPrintln(button_value);
serialPrint("menu_section: ");
serialPrint(menu_section);
@ -572,20 +568,12 @@
serialPrintln("Save button_sensitivity_millis");
break;
case IN_PRESS_BUTTON:
EEPROM.write(PRESS_BUTTON_EEPROM_ADDRESS, setup_var[0]);
case IN_DISPENSER_MODE:
EEPROM.write(DISPENSER_MODE_EEPROM_ADDRESS, setup_var[0]);
load_setting(IN_PRESS_BUTTON);
load_setting(IN_DISPENSER_MODE);
serialPrintln("Save press_button_mode");
break;
case IN_HOLD_DOWN_BUTTON:
EEPROM.write(HOLD_DOWN_BUTTON_EEPROM_ADDRESS, setup_var[0]);
load_setting(IN_HOLD_DOWN_BUTTON);
serialPrintln("Save hold_down_button_mode");
serialPrintln("Save dispenser_mode");
break;
case IN_LAG:
@ -611,8 +599,7 @@
case IN_FACTORY_RESET:
if(setup_var[0]){
EEPROM.write(BUTTON_SENSITIVITY_EEPROM_ADDRESS, BUTTON_SENSITIVITY_DEFAULT_VALUE);
EEPROM.write(PRESS_BUTTON_EEPROM_ADDRESS, PRESS_BUTTON_DEFAULT_VALUE);
EEPROM.write(HOLD_DOWN_BUTTON_EEPROM_ADDRESS, HOLD_DOWN_BUTTON_DEFAULT_VALUE);
EEPROM.write(DISPENSER_MODE_EEPROM_ADDRESS, DISPENSER_MODE_DEFAULT_VALUE);
EEPROM.write(LAG_TIME_MIN_EEPROM_ADDRESS, LAG_TIME_MIN_DEFAULT_VALUE);
EEPROM.write(LAG_TIME_SEG_EEPROM_ADDRESS, LAG_TIME_SEG_DEFAULT_VALUE);
EEPROM.write(LAG_TIME_DEC_EEPROM_ADDRESS, LAG_TIME_DEC_DEFAULT_VALUE);
@ -629,8 +616,11 @@
case IN_RESTART:
if(setup_var[0]){
dispenser_status = DISPENSER_DOSING;
dispenser_status_time_millis = 0;
for (int i = 0; i < SENSOR_BUFFER_SIZE; ++i){
relay_activation_pointer = 0;
relay_activation_millis_ini[i] = 0;
relay_activation_millis_end[i] = 0;
}
load_menu_variables(OUT_OF_MENU);
@ -645,8 +635,7 @@
switch(_setting){
case ALL_SETTINGS:
load_setting(IN_SENSITIVITY_BUTTON);
load_setting(IN_PRESS_BUTTON);
load_setting(IN_HOLD_DOWN_BUTTON);
load_setting(IN_DISPENSER_MODE);
load_setting(IN_LAG);
load_setting(IN_DOSING);
break;
@ -658,22 +647,15 @@
serialPrintln(button_sensitivity_millis);
break;
case IN_PRESS_BUTTON:
press_button_mode = EEPROM.read(PRESS_BUTTON_EEPROM_ADDRESS);
case IN_DISPENSER_MODE:
dispenser_mode = EEPROM.read(DISPENSER_MODE_EEPROM_ADDRESS);
serialPrint("press_button_mode: ");
serialPrintln(press_button_mode);
break;
case IN_HOLD_DOWN_BUTTON:
hold_down_button_mode = EEPROM.read(HOLD_DOWN_BUTTON_EEPROM_ADDRESS);
serialPrint("hold_down_button_mode: ");
serialPrintln(hold_down_button_mode);
serialPrint("dispenser_mode: ");
serialPrintln(dispenser_mode);
break;
case IN_LAG:
lag_time_decseg = (EEPROM.read(LAG_TIME_SEG_EEPROM_ADDRESS) * 10) + EEPROM.read(LAG_TIME_DEC_EEPROM_ADDRESS);
lag_time_decseg = (EEPROM.read(LAG_TIME_MIN_EEPROM_ADDRESS) * 600) + (EEPROM.read(LAG_TIME_SEG_EEPROM_ADDRESS) * 10) + EEPROM.read(LAG_TIME_DEC_EEPROM_ADDRESS);
serialPrint("lag_time_decseg: ");
serialPrintln(lag_time_decseg);
@ -707,12 +689,8 @@
setup_var[0] = EEPROM.read(BUTTON_SENSITIVITY_EEPROM_ADDRESS);
break;
case IN_PRESS_BUTTON:
setup_var[0] = EEPROM.read(PRESS_BUTTON_EEPROM_ADDRESS);
break;
case IN_HOLD_DOWN_BUTTON:
setup_var[0] = EEPROM.read(HOLD_DOWN_BUTTON_EEPROM_ADDRESS);
case IN_DISPENSER_MODE:
setup_var[0] = EEPROM.read(DISPENSER_MODE_EEPROM_ADDRESS);
break;
case IN_LAG:
@ -816,19 +794,14 @@
lcd.print(fill_string_ws(fill_string_ws(String(setup_var[0]), 2, 1, "0"), 20, 3));
break;
case IN_PRESS_BUTTON:
case IN_HOLD_DOWN_BUTTON:
case IN_DISPENSER_MODE:
switch(setup_var[0]){
case 1:
lcd.print(fill_string_ws(text_info[MODE_1], 20, 3));
case DISPENSER_MODE_VALUE:
lcd.print(fill_string_ws(text_info[DISPENSER_MODE], 20));
break;
case 2:
lcd.print(fill_string_ws(text_info[MODE_2], 20, 3));
break;
case 3:
lcd.print(fill_string_ws(text_info[MODE_3], 20, 3));
case BELT_MODE_VALUE:
lcd.print(fill_string_ws(text_info[BELT_MODE], 20));
break;
}
break;
@ -889,11 +862,10 @@
break;
case DISPENSER_DOSING:
lcd.print(fill_string_ws(process_time(), 8, 1));
lcd.print(fill_string_ws(dispenser_mode == DISPENSER_MODE_VALUE? process_time(): "--:--", 8, 1));
break;
case DISPENSER_BLOCK:
//lcd.print(fill_string_ws(process_time(), 8, 1));
break;
}
}
@ -920,12 +892,15 @@
break;
case IN_SENSITIVITY_BUTTON:
case IN_PRESS_BUTTON:
case IN_HOLD_DOWN_BUTTON:
case IN_FACTORY_RESET:
case IN_RESTART:
lcd.setCursor(3,1);
break;
case IN_DISPENSER_MODE:
lcd.setCursor(0,1);
break;
}
lcd.cursor();
@ -938,113 +913,138 @@
**************************************************/
void loop_dosage_process()
{
if(digitalRead(DOSING_BUTTON_PIN) == DOSING_BUTTON_PUSH){
if(button_pressed_millis == 0)
button_pressed_millis = millis();
dispenser_status = DISPENSER_IDLE;
// Se supero el button_sensitivity_millis
if (millis() >= (button_pressed_millis + button_sensitivity_millis))
start_dosing_process();
// Se a activado el Sensor
if(digitalRead(DOSING_BUTTON_PIN) == SENSOR_ACTIVATED){
if(sensor_lock_millis == 0)
sensor_lock_millis = millis();
// Se supero el button_sensitivity_millis
if(last_sensor_status == SENSOR_UNLOCK && millis() >= (sensor_lock_millis + button_sensitivity_millis)){
// Registramos en Inicio de Proceso de dosifiación
relay_activation_millis_ini[relay_activation_pointer] = millis() + (lag_time_decseg * 100);
// En modo Dosificador
if(dispenser_mode == DISPENSER_MODE_VALUE)
relay_activation_millis_end[relay_activation_pointer] = relay_activation_millis_ini[relay_activation_pointer] + (dosing_time_decseg * 100);
last_sensor_status = SENSOR_LOCK;
}
if(dispenser_mode == DISPENSER_MODE_VALUE && relay_activation_millis_end[relay_activation_pointer] == 0){
dispenser_status = DISPENSER_BLOCK;
}
}else if(last_sensor_status == SENSOR_LOCK){
if(dispenser_mode == DISPENSER_MODE_VALUE){
relay_activation_millis_ini[relay_activation_pointer] = 0;
relay_activation_millis_end[relay_activation_pointer] = 0;
}else{
relay_activation_millis_end[relay_activation_pointer++] = millis() + (lag_time_decseg * 100);
// Si supera el tamaño del buffer vamos al inicio del buffer
if(relay_activation_pointer >= SENSOR_BUFFER_SIZE)
relay_activation_pointer = 0;
}
sensor_lock_millis = 0;
last_sensor_status = SENSOR_UNLOCK;
}
// Determinamos el estado del Relevador
relay_state = RELAY_LOW;
if(dispenser_mode == DISPENSER_MODE_VALUE){
// Depuramos
if(relay_activation_millis_end[relay_activation_pointer] > 0 && millis() >= relay_activation_millis_end[relay_activation_pointer]){
relay_activation_millis_ini[relay_activation_pointer] = 0;
relay_activation_millis_end[relay_activation_pointer] = 0;
}
// Existe periodo de dosificación
if(relay_activation_millis_ini[relay_activation_pointer] > 0) {
// Revisamos si se debe encender el Dosificador
if(millis() >= relay_activation_millis_ini[relay_activation_pointer]){
dispenser_status = DISPENSER_DOSING;
dispenser_status_time_millis = relay_activation_millis_end[relay_activation_pointer];
relay_state = RELAY_HIGH;
// Aun no comienza dosificación
}else{
dispenser_status = DISPENSER_LAG;
dispenser_status_time_millis = relay_activation_millis_ini[relay_activation_pointer];
}
}
}else{
for (int i = 0; i < SENSOR_BUFFER_SIZE; ++i){
// Depuramos el Buffer
if(relay_activation_millis_end[i] > 0 && millis() >= relay_activation_millis_end[i]){
relay_activation_millis_ini[i] = 0;
relay_activation_millis_end[i] = 0;
}
release_button = 0;
button_pressed_millis = 0;
if(relay_activation_millis_ini[i] > 0){
// Revisamos en el Buffer si se debe encender el Dosificador
if(millis() >= relay_activation_millis_ini[i]){
dispenser_status = DISPENSER_DOSING;
dispenser_status_time_millis = 0;
relay_state = RELAY_HIGH;
// Aun no comienza dosificación
}else if (relay_state == RELAY_LOW){
dispenser_status = DISPENSER_LAG;
dispenser_status_time_millis = relay_activation_millis_ini[i];
}
}
}
}
continue_dosing_process();
}
void start_dosing_process()
{
/*
Modo 1:
Modo 2:
Modo 3:
*/
// Aplicamos cambios en el estado del relevador
digitalWrite(RELAY_PIN, relay_state);
/*
if(press_button_mode == 3 &&
dispenser_status != DISPENSER_IDLE &&
dispenser_status_time_millis >= button_pressed_millis &&
release_button == 0){
dispenser_status_time_millis
dispenser_status = DISPENSER_DOSING;
dispenser_status_time_millis = 0;
serialPrint("Proceso detenido");
serialPrintln(millis());
dispenser_status = DISPENSER_IDLE;
dispenser_status = DISPENSER_LAG;
dispenser_status = DISPENSER_DOSING;
dispenser_status = DISPENSER_BLOCK;
}else if((press_button_mode == 1 || press_button_mode == 3) && dispenser_status == DISPENSER_IDLE){
dispenser_status = DISPENSER_LAG;
dispenser_status_time_millis = millis() + ((uint32_t) lag_time_decseg * 100);
release_button = 1;
// Determinamos el estado del Dosificador
if(dispenser_mode == DISPENSER_MODE_VALUE){
serialPrint("Iniciando proceso ");
serialPrintln(millis());
}else if(press_button_mode == 2){
dispenser_status = DISPENSER_RESTART;
}else{
release_button = 1;
}
}
for (int i = 0; i < SENSOR_BUFFER_SIZE; ++i){
serialPrint(i);
serialPrint(") ");
serialPrint(relay_activation_millis_ini[i]);
serialPrint(", ");
serialPrint(relay_activation_millis_end[i]);
serialPrint(" - ");
serialPrintln((relay_activation_millis_end[i] - relay_activation_millis_ini[i]));
}
serialPrintln("");
serialPrintln("");
serialPrintln("");
*/
switch(press_button_mode){
case 1:
dispenser_status = DISPENSER_RESTART;
serialPrintln("Modo 1 ");
break;
case 2:
dispenser_status = DISPENSER_RESTART;
serialPrintln("Modo 2 ");
break;
case 3:
dispenser_status = DISPENSER_RESTART;
serialPrintln("Modo 3 ");
break;
}
}
void continue_dosing_process()
{
switch(dispenser_status){
case DISPENSER_RESTART:
digitalWrite(RELAY_PIN, RELAY_LOW);
dispenser_status = DISPENSER_LAG;
dispenser_status_time_millis = millis() + ((uint32_t) lag_time_decseg * 100);
break;
case DISPENSER_LAG:
if(millis() >= dispenser_status_time_millis){
dispenser_status = DISPENSER_DOSING;
dispenser_status_time_millis = millis() + ((uint32_t) dosing_time_decseg * 100);
digitalWrite(RELAY_PIN, RELAY_HIGH);
}
break;
case DISPENSER_DOSING:
if(millis() >= dispenser_status_time_millis){
dispenser_status = button_pressed_millis == 0? DISPENSER_IDLE: DISPENSER_BLOCK;
dispenser_status_time_millis = 0;
digitalWrite(RELAY_PIN, RELAY_LOW);
}
break;
case DISPENSER_BLOCK:
if(button_pressed_millis == 0)
dispenser_status = DISPENSER_IDLE;
break;
}
}
@ -1058,7 +1058,7 @@
pinMode(SETTINGS_BUTTONS_PIN, INPUT_PULLUP);
// Salida Serial
serialBegin(9600);
serialBegin(115200);
serialBeginWhile();
// Cargamos configuraciones de la EEPROM a la ram