From 2db0c79bd60650bb0b28dbfd15b2a372200f445c Mon Sep 17 00:00:00 2001 From: daniel3514 Date: Sat, 1 Aug 2020 19:08:48 -0500 Subject: [PATCH 1/2] update --- DMX_Controller/DMX_Controller.cpp.elf | Bin 200243 -> 0 bytes DMX_Controller/DMX_Controller.cpp.hex | 1713 ------- DMX_Controller/DMX_Controller.ino | 5927 +++++++++++++------------ LCD - EEPROM - Layout.xls | Bin 0 -> 196096 bytes LCD - EEPROM - Layout.xlsx | Bin 65481 -> 0 bytes 5 files changed, 2975 insertions(+), 4665 deletions(-) delete mode 100644 DMX_Controller/DMX_Controller.cpp.elf delete mode 100644 DMX_Controller/DMX_Controller.cpp.hex create mode 100644 LCD - EEPROM - Layout.xls delete mode 100644 LCD - EEPROM - Layout.xlsx diff --git a/DMX_Controller/DMX_Controller.cpp.elf b/DMX_Controller/DMX_Controller.cpp.elf deleted file mode 100644 index dbada6b84fb22ecaf9d988a43d3b6b94062390fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200243 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¥$&mWnxEfknGsszq((Wr^wsV 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 cv // libreria para LCD - ttps://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +#include // libreria para LCD - ttps://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home #include #include #include -#include // libreria DMX 4 universos deskontrol four universes DMX library - http://www.deskontrol.net/blog -#include // libreria encoder - http://www.pjrc.com/teensy/td_libs_Encoder.html +#include // libreria DMX 4 universos deskontrol four universes DMX library - http://www.deskontrol.net/blog +#include // libreria encoder - http://www.pjrc.com/teensy/td_libs_Encoder.html // DMX Library -#define DMX512 (0) // (250 kbaud - 2 to 512 channels) Standard USITT DMX-512 -//#define DMX1024 (1) // (500 kbaud - 2 to 1024 channels) Completely non standard - TESTED ok -//#define DMX2048 (2) // (1000 kbaud - 2 to 2048 channels) called by manufacturers DMX1000K, DMX 4x or DMX 1M ??? +#define DMX512 (0) // (250 kbaud - 2 to 512 channels) Standard USITT DMX-512 +//#define DMX1024 (1) // (500 kbaud - 2 to 1024 channels) Completely non standard - TESTED ok +//#define DMX2048 (2) // (1000 kbaud - 2 to 2048 channels) called by manufacturers DMX1000K, DMX 4x or DMX 1M ??? -// Puertos, variables // DMX -int DMX_Data_Flux = 2; // control de flujo de datos para dmx, 0 por default int DMX_Values [515]; // array de valores actuales DMX -int Canal_Actual = 1; -byte Universo_Actual = 0; +int Canal_Actual = 1; // canal actual de dmx +byte Universo_Actual = 0; // universo actual de dmx // Encoder -Encoder myEnc (7, 6); // coneccion de encoder - - // Botones cursor -int Boton_Up = 9; -int Boton_Down = 12; -int Boton_Left = 8; -int Boton_Right = 10; -int Boton_Center = 11; +byte Enc_Center = 8; // pin +byte Enc_CLK = 7; // pin +byte Enc_Data = 6; // pin +Encoder myEnc (Enc_Data, Enc_CLK); // conexion de encoder + + // Cursor +byte Enc_ultima_pos = 1; // saber cual fue la ultima posicion de cursor, para posicionar encoder byte LCD_Col_Pos = 0; // posicion en tiempo real de lcd byte LCD_Row_Pos = 0; // posicion en tiempo real de lcd - - // config de posiciones de lcd Col Row -byte Cursor_Conf[4][20] = +byte Cursor_Conf[4][20] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, @@ -97,83 +89,90 @@ byte Cursor_Conf[4][20] = }; //Teclado Numerico Array -int Boton_Array_1 = 38; -int Boton_Array_2 = 40; -int Boton_Array_3 = 42; -int Boton_Array_4 = 44; -int Boton_Array_A = 30; -int Boton_Array_B = 32; -int Boton_Array_C = 34; -int Boton_Array_D = 36; +byte Boton_Array_1 = 36; // pin +byte Boton_Array_2 = 34; // pin +byte Boton_Array_3 = 32; // pin +byte Boton_Array_4 = 30; // pin +byte Boton_Array_A = 44; // pin +byte Boton_Array_B = 42; // pin +byte Boton_Array_C = 40; // pin +byte Boton_Array_D = 38; // pin byte Boton_Calc = 17; // valor calculado # E * F, 17 sin valor calculado byte Num_Col_Pos = 0; // posicion en tiempo real de lcd byte Num_Row_Pos = 0; // posicion en tiempo real de lcd int Num_Val = 0; // valor generado al calculo long Boton_Delay_Teclado = 100; // delay de lectura de boton - // Potenciometro -int Pot = A15; // entrada de potenciometro - // LCD -int LCD_RS = 43; // puertos de conexion de LCD -int LCD_E = 45; -int LCD_D4 = 47; -int LCD_D5 = 49; -int LCD_D6 = 51; -int LCD_D7 = 53; -LiquidCrystal lcd (LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7); //LCD setup -int Back_Light_PWM = 13; // salida para PWM de Back Light de LCD -int Contrast_PWM = 4; // salida para pwm de contraste de LCD +byte LCD_RS = 43; // pin +byte LCD_E = 45; // pin +byte LCD_D4 = 47; // pin +byte LCD_D5 = 49; // pin +byte LCD_D6 = 51; // pin +byte LCD_D7 = 53; // pin +byte Back_Light_PWM = 13; // salida para PWM de Back Light de LCD +byte Contrast_PWM = 12; // salida para pwm de contraste de LCD byte Light_On_Off = 0; // saber si esta encendida o apagada, back y key +LiquidCrystal lcd (LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7); //LCD setup // Key Light -int Key_Light_PWM = 3; // salida para pwm de key light +byte Key_Light_PWM = 11; // pin +byte Key_Light_SW = 3; // pin + + // Light external +byte Light_PWM = 10; // pin +byte Light_SW = 2; // pin // EEPROM -int BackLight_Add = 4094; // direccion de eeprom -int Contrast_Add = 4095; // direccion de eeprom -int Bank_Init_Add = 4093; // direccion de eeprom -int Key_Light_Add = 4092; // direccion de eeprom -int EEPROM_Limit = 4091; // limite de espacios en eeprom para universos +int BackLight_Add = 4094; // direccion de eeprom +int Contrast_Add = 4095; // direccion de eeprom +int Bank_Init_Add = 4093; // direccion de eeprom +int Key_Light_Add = 4092; // direccion de eeprom +int Light_Ext_Add = 4091; // direccion de eeprom +int EEPROM_Limit = 4090; // limite de espacios en eeprom para universos +byte EEPROM_Def_Jumper = 9; // pin void setup() { - // DMX - // pinMode(DMX_Data_Flux, OUTPUT); - - // Botones cursor - pinMode(Boton_Up, INPUT_PULLUP); - pinMode(Boton_Down, INPUT_PULLUP); - pinMode(Boton_Left, INPUT_PULLUP); - pinMode(Boton_Right, INPUT_PULLUP); - pinMode(11, INPUT_PULLUP); //Boton_Center, INPUT_PULLUP); + // Encoder + pinMode(Enc_Center, INPUT_PULLUP); + // no es necesario declarar CLK y data // Botones Teclado numerico - pinMode(Boton_Array_1, OUTPUT); - pinMode(Boton_Array_2, OUTPUT); - pinMode(Boton_Array_3, OUTPUT); - pinMode(Boton_Array_4, OUTPUT); - pinMode(Boton_Array_A, INPUT_PULLUP); - pinMode(Boton_Array_B, INPUT_PULLUP); - pinMode(Boton_Array_C, INPUT_PULLUP); - pinMode(Boton_Array_D, INPUT_PULLUP); - digitalWrite (Boton_Array_1, HIGH); - digitalWrite (Boton_Array_2, HIGH); - digitalWrite (Boton_Array_3, HIGH); - digitalWrite (Boton_Array_4, HIGH); + pinMode(Boton_Array_1, OUTPUT); + pinMode(Boton_Array_2, OUTPUT); + pinMode(Boton_Array_3, OUTPUT); + pinMode(Boton_Array_4, OUTPUT); + pinMode(Boton_Array_A, INPUT_PULLUP); + pinMode(Boton_Array_B, INPUT_PULLUP); + pinMode(Boton_Array_C, INPUT_PULLUP); + pinMode(Boton_Array_D, INPUT_PULLUP); + digitalWrite (Boton_Array_1, HIGH); + digitalWrite (Boton_Array_2, HIGH); + digitalWrite (Boton_Array_3, HIGH); + digitalWrite (Boton_Array_4, HIGH); // LCD - pinMode(LCD_RS, OUTPUT); - pinMode(LCD_E, OUTPUT); - pinMode(LCD_D7, OUTPUT); - pinMode(LCD_D6, OUTPUT); - pinMode(LCD_D5, OUTPUT); - pinMode(LCD_D4, OUTPUT); - pinMode(Back_Light_PWM, OUTPUT); + pinMode(LCD_RS, OUTPUT); + pinMode(LCD_E, OUTPUT); + pinMode(LCD_D7, OUTPUT); + pinMode(LCD_D6, OUTPUT); + pinMode(LCD_D5, OUTPUT); + pinMode(LCD_D4, OUTPUT); + pinMode(Back_Light_PWM, OUTPUT); + pinMode(Contrast_PWM, OUTPUT); lcd.begin(20, 4); //tamaño de LCD // Key Light - pinMode(Key_Light_PWM, OUTPUT); + pinMode(Key_Light_PWM, OUTPUT); + pinMode(Key_Light_SW, INPUT_PULLUP); + + // Light + pinMode(Light_PWM, OUTPUT); + pinMode(Light_SW, INPUT_PULLUP); + + // EEPROM Default + pinMode(EEPROM_Def_Jumper, INPUT); // no tiene pullup fisico // DMX ArduinoDmx0.set_tx_address (1); // poner aqui la direccion de inicio de DMX @@ -181,64 +180,70 @@ void setup() ArduinoDmx0.init_tx (DMX512); // iniciar transmision universo 0, modo estandar DMX512 // no conectados - pinMode (5, OUTPUT); - digitalWrite (5, LOW); - pinMode (22, OUTPUT); - digitalWrite (22, LOW); - pinMode (23, OUTPUT); - digitalWrite (23, LOW); - pinMode (24, OUTPUT); - digitalWrite (24, LOW); - pinMode (25, OUTPUT); - digitalWrite (25, LOW); - pinMode (26, OUTPUT); - digitalWrite (26, LOW); - pinMode (27, OUTPUT); - digitalWrite (27, LOW); - pinMode (28, OUTPUT); - digitalWrite (28, LOW); - pinMode (29, OUTPUT); - digitalWrite (29, LOW); - pinMode (31, OUTPUT); - digitalWrite (31, LOW); - pinMode (33, OUTPUT); - digitalWrite (33, LOW); - pinMode (35, OUTPUT); - digitalWrite (35, LOW); - pinMode (37, OUTPUT); - digitalWrite (37, LOW); - pinMode (39, OUTPUT); - digitalWrite (39, LOW); - pinMode (41, OUTPUT); - digitalWrite (41, LOW); - pinMode (46, OUTPUT); - digitalWrite (46, LOW); - pinMode (48, OUTPUT); - digitalWrite (48, LOW); - pinMode (50, OUTPUT); - digitalWrite (50, LOW); - pinMode (52, OUTPUT); - digitalWrite (52, LOW); - pinMode (A0, OUTPUT); - digitalWrite (A0, LOW); - pinMode (A1, OUTPUT); - digitalWrite (A1, LOW); - pinMode (A2, OUTPUT); - digitalWrite (A2, LOW); - pinMode (A3, OUTPUT); - digitalWrite (A3, LOW); - pinMode (A4, OUTPUT); - digitalWrite (A4, LOW); - pinMode (A5, OUTPUT); - digitalWrite (A5, LOW); - pinMode (A6, OUTPUT); - digitalWrite (A6, LOW); - pinMode (A7, OUTPUT); - digitalWrite (A7, LOW); - pinMode (A8, OUTPUT); - digitalWrite (A8, LOW); - pinMode (A9, OUTPUT); - digitalWrite (A9, LOW); + pinMode (5, OUTPUT); + digitalWrite (5, LOW); + pinMode (6, OUTPUT); + digitalWrite (6, LOW); + pinMode (20, OUTPUT); + digitalWrite (20, LOW); + pinMode (21, OUTPUT); + digitalWrite (21, LOW); + pinMode (22, OUTPUT); + digitalWrite (22, LOW); + pinMode (23, OUTPUT); + digitalWrite (23, LOW); + pinMode (24, OUTPUT); + digitalWrite (24, LOW); + pinMode (25, OUTPUT); + digitalWrite (25, LOW); + pinMode (26, OUTPUT); + digitalWrite (26, LOW); + pinMode (27, OUTPUT); + digitalWrite (27, LOW); + pinMode (28, OUTPUT); + digitalWrite (28, LOW); + pinMode (29, OUTPUT); + digitalWrite (29, LOW); + pinMode (31, OUTPUT); + digitalWrite (31, LOW); + pinMode (33, OUTPUT); + digitalWrite (33, LOW); + pinMode (35, OUTPUT); + digitalWrite (35, LOW); + pinMode (37, OUTPUT); + digitalWrite (37, LOW); + pinMode (39, OUTPUT); + digitalWrite (39, LOW); + pinMode (41, OUTPUT); + digitalWrite (41, LOW); + pinMode (46, OUTPUT); + digitalWrite (46, LOW); + pinMode (48, OUTPUT); + digitalWrite (48, LOW); + pinMode (50, OUTPUT); + digitalWrite (50, LOW); + pinMode (52, OUTPUT); + digitalWrite (52, LOW); + pinMode (A0, OUTPUT); + digitalWrite (A0, LOW); + pinMode (A1, OUTPUT); + digitalWrite (A1, LOW); + pinMode (A2, OUTPUT); + digitalWrite (A2, LOW); + pinMode (A3, OUTPUT); + digitalWrite (A3, LOW); + pinMode (A4, OUTPUT); + digitalWrite (A4, LOW); + pinMode (A5, OUTPUT); + digitalWrite (A5, LOW); + pinMode (A6, OUTPUT); + digitalWrite (A6, LOW); + pinMode (A7, OUTPUT); + digitalWrite (A7, LOW); + pinMode (A8, OUTPUT); + digitalWrite (A8, LOW); + pinMode (A9, OUTPUT); + digitalWrite (A9, LOW); pinMode (A10, OUTPUT); digitalWrite (A10, LOW); pinMode (A11, OUTPUT); @@ -249,51 +254,86 @@ void setup() digitalWrite (A13, LOW); pinMode (A14, OUTPUT); digitalWrite (A14, LOW); + pinMode (A15, OUTPUT); + digitalWrite (A15, LOW); } void loop() { - digitalWrite(2, HIGH); // max 485 como salida, no se deja asignar desde el apuntador Back_Light_Init(); // inicializador de Backlight desde eeprom Contrast_Init(); // inicializador de EEPROM desde eeprom + EEPROM_Default(); // jumper para default eeprom EEPROM_Load_Init(); // valores desde eeprom GUI_About(); // interface grafica de about GUI_Memory_Init(); // interface grafica de memoria } -void Back_Light_Init() +void EEPROM_Default() { - // lee y aplica el ultimo estado del backlight - - byte Back_Light_Value = EEPROM.read(BackLight_Add); - - analogWrite(Back_Light_PWM, Back_Light_Value); - - if (Back_Light_Value == 0) + // jumper cerrado, eeprom a default + // valores default + byte Key_Light_Val_Def = 255; // valor default de keylight + byte Ext_Light_Def = 255; + byte CH_DMX_Val_Def = 0; // valor default de canales DMX + byte Initial_Bank_Def = 1; // banco inicial de memoria a cargar + byte Backlight_Def = 255; + byte Contrast_Def = 150; + + if (digitalRead(EEPROM_Def_Jumper) == 0) { - Light_On_Off = 0; - } + lcd.clear (); + lcd.setCursor(1, 1); + lcd.print("EEPROM Default:"); - if (Back_Light_Value > 0) - { - Light_On_Off = 1; + // canales DMX + for (int ch = 0; ch <= EEPROM_Limit; ch ++) + { + EEPROM.write(ch, CH_DMX_Val_Def); + lcd.setCursor(16, 1); + lcd.print(ch); + } + + // backlight + EEPROM.write(BackLight_Add, Backlight_Def); + // contraste + EEPROM.write(Contrast_Add, Contrast_Def); + // Bank init + EEPROM.write(Bank_Init_Add, Initial_Bank_Def); + // Key light + EEPROM.write(Key_Light_Add, Key_Light_Val_Def); + // Light Ext + EEPROM.write(Light_Ext_Add, Ext_Light_Def); + + lcd.clear (); + lcd.setCursor(1, 0); + lcd.print("EEPROM Default ok!"); + lcd.setCursor(3, 2); + lcd.print("Remove jumper"); + lcd.setCursor(4, 3); + lcd.print("and reset!"); + while(1); } } -void Key_Light_Init() +void Back_Light_Init() { - // lee y aplica el ultimo estado del Key Light + // lee y aplica el ultimo estado del backlight - byte Key_Light_Value = EEPROM.read (Key_Light_Add); - - analogWrite(Key_Light_PWM, Key_Light_Value); + byte Back_Light_Value = EEPROM.read(BackLight_Add); + + // dimmer de pantalla + for (int dim = 0; dim <= Back_Light_Value; dim ++) + { + analogWrite(Back_Light_PWM, dim); + delay(3); // aqui el retardo para el dimmer + } - if (Key_Light_Value == 0) + if (Back_Light_Value == 0) { Light_On_Off = 0; } - if (Key_Light_Value > 0) + if (Back_Light_Value > 0) { Light_On_Off = 1; } @@ -301,7 +341,7 @@ void Key_Light_Init() void Contrast_Init() { - // lee y aplica el ultimo estado del comtrast + // lee y aplica el ultimo estado del contrast byte Contrast_Value = EEPROM.read(Contrast_Add); @@ -379,7 +419,7 @@ void Light_En() Light_On_Off = 0; } -salida: + salida: delay(300); // para impedir repeticion del comando } @@ -454,9 +494,9 @@ void GUI_About() // imprimir about byte Firm_Ver_Ent = 1; - byte Firm_Ver_Dec = 7; + byte Firm_Ver_Dec = 8; byte Hard_Ver_Ent = 0; - byte Hard_Ver_Dec = 5; + byte Hard_Ver_Dec = 7; byte Key_Light_Value = EEPROM.read(Key_Light_Add); byte Back_Light_Value = EEPROM.read(BackLight_Add); @@ -528,10 +568,8 @@ void GUI_About() lcd.setCursor(10, 2); // Blink // lectura del boton centro - while (digitalRead(Boton_Center) == HIGH) - { + while (digitalRead(Enc_Center) == HIGH); - } delay (300); // rebote de boton lcd.clear (); lcd.setCursor(0, 0); @@ -558,10 +596,8 @@ void GUI_About() lcd.setCursor(19, 1); // lectura del boton centro - while (digitalRead(Boton_Center) == HIGH) - { + while (digitalRead(Enc_Center) == HIGH); - } delay (300); // rebote de boton lcd.noBlink (); } @@ -602,7 +638,7 @@ void GUI_Control_Matrix() int Inicial = 1; Canal_Actual = 1; -inicio: + inicio: lcd.clear(); lcd.setCursor (0, 0); @@ -655,7 +691,7 @@ inicio: Cursor_Conf[3][16] = 1; // navegar -Banco: + Banco: GUI_Navegar(1, Inicial); @@ -826,7 +862,7 @@ Banco: goto Salida_DMX; } -Salida_DMX: + Salida_DMX: Num_Row_Pos = LCD_Row_Pos; Num_Col_Pos = LCD_Col_Pos + 1; @@ -876,2928 +912,2915 @@ void GUI_Navegar(byte matrix, int banco) int Boton_Delay_Cursor = 300; // delay de lectura de boton byte LCD_Col_Pos_Ant; // saber el estado anterior para borrar cursor byte LCD_Row_Pos_Ant; // saber el estado anterior para borrar cursor - - // guardar valor anterior de row col + + // guardar valor anterior de row col LCD_Col_Pos_Ant = LCD_Col_Pos; LCD_Row_Pos_Ant = LCD_Row_Pos; - // Dibujar cursor + // Dibujar cursor lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); - lcd.print(">"); - - // navegacion - -Dibujar: - - byte Dibujar_Cursor = 0; // saber si dibujar cursor para evitar repeticiones en lcd, 0 no dibujar, 1 dibujar >, 2 dibujar + - - // LCD Back Light * - digitalWrite(Boton_Array_1, LOW); // lectura linea 1 - if (digitalRead(Boton_Array_D) == LOW) - { - delay(Boton_Delay_Teclado); - Light_En(); - } - digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 - - // Left - if (digitalRead(Boton_Left) == LOW) - { - delay (Boton_Delay_Cursor); - byte Salida_Left = 0; - byte LCD_Col_Pos_Temp = 0; - LCD_Col_Pos_Temp = LCD_Col_Pos; - - while (Salida_Left == 0) - { - if (LCD_Col_Pos_Temp == 0) - { - LCD_Col_Pos_Temp = 20; - } - - LCD_Col_Pos_Temp = LCD_Col_Pos_Temp - 1; - - if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] == 1) - { - LCD_Col_Pos = LCD_Col_Pos_Temp; - Dibujar_Cursor = 1; - Salida_Left = 1; - } - } - goto Salida; + lcd.print(">"); + + // navegacion + + Dibujar: + + byte Dibujar_Cursor = 0; // saber si dibujar cursor para evitar repeticiones en lcd, 0 no dibujar, 1 dibujar >, 2 dibujar + + + // LCD Back Light * + digitalWrite(Boton_Array_1, LOW); // lectura linea 1 + if (digitalRead(Boton_Array_D) == LOW) + { + delay(Boton_Delay_Teclado); + Light_En(); + } + digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 + + /* // Left + if (digitalRead(Boton_Left) == LOW) + { + delay (Boton_Delay_Cursor); + byte Salida_Left = 0; + byte LCD_Col_Pos_Temp = 0; + LCD_Col_Pos_Temp = LCD_Col_Pos; + while (Salida_Left == 0) + { + if (LCD_Col_Pos_Temp == 0) + { + LCD_Col_Pos_Temp = 20; + } + LCD_Col_Pos_Temp = LCD_Col_Pos_Temp - 1; + if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] == 1) + { + LCD_Col_Pos = LCD_Col_Pos_Temp; + Dibujar_Cursor = 1; + Salida_Left = 1; + } + } + goto Salida; } - - // Right - if (digitalRead(Boton_Right) == LOW) - { - delay(Boton_Delay_Cursor); - byte Salida_Right = 0; - byte LCD_Col_Pos_Temp = 0; - LCD_Col_Pos_Temp = LCD_Col_Pos; - - while (Salida_Right == 0) - { - LCD_Col_Pos_Temp = LCD_Col_Pos_Temp + 1; - - if (LCD_Col_Pos_Temp >= 20) - { - LCD_Col_Pos_Temp = 0; // regresar al cero - } - if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] == 1) - { - LCD_Col_Pos = LCD_Col_Pos_Temp; - Dibujar_Cursor = 1; - Salida_Right = 1; - } - } - goto Salida; - } - - // Down - if (digitalRead(Boton_Down) == LOW) - { - delay(Boton_Delay_Cursor); - byte Salida_Down = 0; - byte LCD_Row_Pos_Temp = 0; - LCD_Row_Pos_Temp = LCD_Row_Pos; + // Right + if (digitalRead(Boton_Right) == LOW) + { + delay(Boton_Delay_Cursor); + byte Salida_Right = 0; + byte LCD_Col_Pos_Temp = 0; + LCD_Col_Pos_Temp = LCD_Col_Pos; + while (Salida_Right == 0) + { + LCD_Col_Pos_Temp = LCD_Col_Pos_Temp + 1; + if (LCD_Col_Pos_Temp >= 20) + { + LCD_Col_Pos_Temp = 0; // regresar al cero + } + if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] == 1) + { + LCD_Col_Pos = LCD_Col_Pos_Temp; + Dibujar_Cursor = 1; + Salida_Right = 1; + } + } + goto Salida; + } + + // Down + if (digitalRead(Boton_Down) == LOW) + { + delay(Boton_Delay_Cursor); + byte Salida_Down = 0; + byte LCD_Row_Pos_Temp = 0; + LCD_Row_Pos_Temp = LCD_Row_Pos; + while (Salida_Down == 0) + { + LCD_Row_Pos_Temp = LCD_Row_Pos_Temp + 1; + if (LCD_Row_Pos_Temp >= 4) + { + LCD_Row_Pos_Temp = 0; // regresar al cero + } + if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] == 1) + { + LCD_Row_Pos = LCD_Row_Pos_Temp; + Dibujar_Cursor = 1; + Salida_Down = 1; + } + } + goto Salida; + } + + // Up + if (digitalRead(Boton_Up) == LOW) + { + delay(Boton_Delay_Cursor); + byte Salida_Up = 0; + byte LCD_Row_Pos_Temp; + LCD_Row_Pos_Temp = LCD_Row_Pos; + while (Salida_Up == 0) + { + if (LCD_Row_Pos_Temp <= 0) + { + LCD_Row_Pos_Temp = 4; + } + LCD_Row_Pos_Temp = LCD_Row_Pos_Temp - 1; + if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] == 1) + { + Dibujar_Cursor = 1; + LCD_Row_Pos = LCD_Row_Pos_Temp; + Salida_Up = 1; + } + } + goto Salida; + }*/ + + // Center + if (digitalRead(Enc_Center) == LOW) + { + delay(Boton_Delay_Cursor); + byte Salida_Center = 0; + while (Salida_Center == 0) + { + if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos] == 1) + { + Dibujar_Cursor = 2; // dibujar + + Salida_Center = 1; + } + } + } + + Salida: + + // Dibujar Cursor + if (Dibujar_Cursor > 0) + { + if (Dibujar_Cursor == 1) + { + // borra el anterior + lcd.setCursor (LCD_Col_Pos_Ant, LCD_Row_Pos_Ant); + lcd.print(" "); + // escribir > + lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); + lcd.print(">"); + // matrix print posicion + if (matrix == 1) + { + // banco inicial + if (LCD_Col_Pos == 12 && LCD_Row_Pos == 0) + { + lcd.setCursor(1, 0); + lcd.print("---"); + goto salida; + } + // banco final + if (LCD_Col_Pos == 16 && LCD_Row_Pos == 0) + { + lcd.setCursor(1, 0); + lcd.print("---"); + goto salir; + } + // Memory + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 0) + { + lcd.setCursor(1, 0); + lcd.print("---"); + goto salida; + } + // Unitary + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 0) + { + lcd.setCursor(1, 0); + lcd.print("---"); + goto salida; + } + // banco 1 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) + { + Numerico_Write (banco, 1, 0); + goto salida; + } + // banco 2 + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 1) + { + Numerico_Write (banco + 1, 1, 0); + goto salida; + } + // banco 3 + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) + { + Numerico_Write (banco + 2, 1, 0); + goto salida; + } + // banco 4 + if (LCD_Col_Pos == 12 && LCD_Row_Pos == 1) + { + Numerico_Write (banco + 3, 1, 0); + goto salida; + } + // banco 5 + if (LCD_Col_Pos == 16 && LCD_Row_Pos == 1) + { + Numerico_Write (banco + 4, 1, 0); + goto salida; + } + // banco 6 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 5, 1, 0); + goto salida; + } + // banco 7 + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 6, 1, 0); + goto salida; + } + // banco 8 + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 7, 1, 0); + goto salida; + } + // banco 9 + if (LCD_Col_Pos == 12 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 8, 1, 0); + goto salida; + } + // banco 10 + if (LCD_Col_Pos == 16 && LCD_Row_Pos == 2) + { + Numerico_Write (banco + 9, 1, 0); + goto salida; + } + // banco 11 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 10, 1, 0); + goto salida; + } + // banco 12 + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 11, 1, 0); + goto salida; + } + // banco 13 + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 12, 1, 0); + goto salida; + } + // banco 14 + if (LCD_Col_Pos == 12 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 13, 1, 0); + goto salida; + } + // banco 15 + if (LCD_Col_Pos == 16 && LCD_Row_Pos == 3) + { + Numerico_Write (banco + 14, 1, 0); + goto salida; + } + + // escribir guion de bancos + salida: + + lcd.setCursor(16, 0); + lcd.print("-"); + + salir: {} + + } + } + else + { + // escribir + + lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); + lcd.print("+"); + } + + //salida + LCD_Col_Pos_Ant = LCD_Col_Pos; + LCD_Row_Pos_Ant = LCD_Row_Pos; + if (Dibujar_Cursor == 2) + { + goto Salir; + } + else + { + Dibujar_Cursor = 0; + } + } + goto Dibujar; + + Salir: {} - while (Salida_Down == 0) - { - LCD_Row_Pos_Temp = LCD_Row_Pos_Temp + 1; +} - if (LCD_Row_Pos_Temp >= 4) - { - LCD_Row_Pos_Temp = 0; // regresar al cero - } +void GUI_Memory_Init() +{ - if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] == 1) - { - LCD_Row_Pos = LCD_Row_Pos_Temp; - Dibujar_Cursor = 1; - Salida_Down = 1; - } - } - goto Salida; - } + inicio: - // Up - if (digitalRead(Boton_Up) == LOW) - { - delay(Boton_Delay_Cursor); - byte Salida_Up = 0; - byte LCD_Row_Pos_Temp; - LCD_Row_Pos_Temp = LCD_Row_Pos; + int salir = 0; + lcd.clear (); + + // Texto + lcd.setCursor (0, 0); + lcd.print("Initial Memory:"); + lcd.setCursor (2, 2); + lcd.print("Empty"); + lcd.setCursor (9, 2); + lcd.print("Load"); + lcd.setCursor (15, 2); + lcd.print("Clear"); + + // bank + lcd.setCursor(18, 0); + lcd.print("b"); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + // Cursor + LCD_Col_Pos = 1; // posicion de cursor + LCD_Row_Pos = 2; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[2][1] = 1; // Empty + Cursor_Conf[2][8] = 1; // Load + Cursor_Conf[2][14] = 1; // Clear + + // navegar + GUI_Navegar(0, 0); + + // Acciones + // Load + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + salir = EEPROM_Load(); + if (salir == 1) + { + goto inicio; + } + GUI_Control_Options(); + } + + // Clear + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + salir = EEPROM_Clear(); + if (salir == 1) + { + goto inicio; + } + GUI_Control_Options(); + } + + // Empty + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 2) + { + GUI_Control_Options(); + } +} - while (Salida_Up == 0) - { - if (LCD_Row_Pos_Temp <= 0) - { - LCD_Row_Pos_Temp = 4; - } +int GUI_Memory_Bank(byte Opcion) +{ + // regresa 1 si se selecciona salir, de lo contrario 0 + // recibe opcion para pintar en la pantalla lo que se selecciono + + int salir = 0; + lcd.clear (); + delay (200); // retardo para no seleccionar inmediatamente la opcion del banco + + // Texto + lcd.setCursor (6, 0); + lcd.print("Memory Bank:"); + lcd.setCursor (1, 1); + lcd.print("Bank1 Bank4 Bank7"); + lcd.setCursor (1, 2); + lcd.print("Bank2 Bank5 Bank8"); + lcd.setCursor (1, 3); + lcd.print("Bank3 Bank6 Exit"); + + switch (Opcion) + { + case 1: + lcd.setCursor (1, 0); + lcd.print("Save"); + break; + + case 2: + lcd.setCursor (1, 0); + lcd.print("Load"); + break; + + case 3: + lcd.setCursor (0, 0); + lcd.print("Clear"); + break; + } + + // Universo Actual + lcd.setCursor (19, 0); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + // Cursor inicial + LCD_Col_Pos = 0; // posicion de cursor + LCD_Row_Pos = 1; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][0] = 1; // Bank 1 + Cursor_Conf[2][0] = 1; // Bank 2 + Cursor_Conf[3][0] = 1; // Bank 3 + Cursor_Conf[1][7] = 1; // Bank 4 + Cursor_Conf[2][7] = 1; // Bank 5 + Cursor_Conf[3][7] = 1; // Bank 6 + Cursor_Conf[1][14] = 1; // Bank 7 + Cursor_Conf[2][14] = 1; // Bank 8 + Cursor_Conf[3][14] = 1; // Exit + + // navegar + GUI_Navegar(0, 0); + + // Acciones + // Bank 1 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) + { + Universo_Actual = 1; + goto Salida; + } + + // Bank 2 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) + { + Universo_Actual = 2; + goto Salida; + } + + // Bank 3 + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) + { + Universo_Actual = 3; + goto Salida; + } + + // Bank 4 + if (LCD_Col_Pos == 7 && LCD_Row_Pos == 1) + { + Universo_Actual = 4; + goto Salida; + } + + // Bank 5 + if (LCD_Col_Pos == 7 && LCD_Row_Pos == 2) + { + Universo_Actual = 5; + goto Salida; + } + + // Bank 6 + if (LCD_Col_Pos == 7 && LCD_Row_Pos == 3) + { + Universo_Actual = 6; + goto Salida; + } + + // Bank 7 + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 1) + { + Universo_Actual = 7; + goto Salida; + } + + // Bank 8 + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + Universo_Actual = 8; + goto Salida; + } + + // Exit + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) + { + salir = 1; + } + + Salida: + + return salir; +} - LCD_Row_Pos_Temp = LCD_Row_Pos_Temp - 1; +void GUI_Memory() +{ - if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] == 1) - { - Dibujar_Cursor = 1; - LCD_Row_Pos = LCD_Row_Pos_Temp; - Salida_Up = 1; - } - } - goto Salida; - } - - // Center - if (digitalRead(Boton_Center) == LOW) - { - delay(Boton_Delay_Cursor); - byte Salida_Center = 0; - while (Salida_Center == 0) - { - if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos] == 1) - { - Dibujar_Cursor = 2; // dibujar + - Salida_Center = 1; - } - } - } - -Salida: + iniciar: + + // Texto + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print("Memory: b"); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + lcd.setCursor (1, 1); + lcd.print("Save"); + lcd.setCursor (1, 2); + lcd.print("Load"); + lcd.setCursor (1, 3); + lcd.print("Clear"); + lcd.setCursor (7, 2); + lcd.print("ClearAll"); + lcd.setCursor (7, 1); + lcd.print("BlackOut"); + lcd.setCursor (16, 3); + lcd.print("Exit"); + lcd.setCursor (7, 3); + lcd.print("EmptyRAM"); + + // Cursor + LCD_Col_Pos = 0; // posicion de cursor + LCD_Row_Pos = 1; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][0] = 1; // Save + Cursor_Conf[2][0] = 1; // Load + Cursor_Conf[3][0] = 1; // Clear + Cursor_Conf[2][6] = 1; // Clear All + Cursor_Conf[3][6] = 1; // Empty RAM + Cursor_Conf[1][6] = 1; // Black Out + Cursor_Conf[3][15] = 1; // Exit + + // navegar + regresa: + + GUI_Navegar(0, 0); - // Dibujar Cursor - if (Dibujar_Cursor > 0) - { - if (Dibujar_Cursor == 1) - { - // borra el anterior - lcd.setCursor (LCD_Col_Pos_Ant, LCD_Row_Pos_Ant); - lcd.print(" "); - // escribir > - lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); - lcd.print(">"); - // matrix print posicion - if (matrix == 1) - { - // banco inicial - if (LCD_Col_Pos == 12 && LCD_Row_Pos == 0) - { - lcd.setCursor(1, 0); - lcd.print("---"); - goto salida; - } + // Acciones + // Load + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) + { + if (EEPROM_Load() == 1) + { + goto iniciar; + } + goto salida; + } + + // Clear + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) + { + if (EEPROM_Clear() == 1) + { + goto iniciar; + } + goto salida; + } + + // Clear All + if (LCD_Col_Pos == 6 && LCD_Row_Pos == 2) + { + EEPROM_Clear_All(); + goto salida; + } + + // Save + if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) + { + if (EEPROM_Save() == 1) + { + goto iniciar; + } + goto salida; + } + + // Empty RAM + if (LCD_Col_Pos == 6 && LCD_Row_Pos == 3) + { + EEPROM_Empty(); + goto salida; + } + + // Black Out + if (LCD_Col_Pos == 6 && LCD_Row_Pos == 1) + { + Black_Out(); + goto regresa; + } + + // Exit + if (LCD_Col_Pos == 15 && LCD_Row_Pos == 3) {} + + salida: {} - // banco final - if (LCD_Col_Pos == 16 && LCD_Row_Pos == 0) - { - lcd.setCursor(1, 0); - lcd.print("---"); - goto salir; - } +} - // Memory - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 0) - { - lcd.setCursor(1, 0); - lcd.print("---"); - goto salida; - } +void GUI_Control_Secuencer() +{ + // secuenciador de bancos guardados en eeprom + + int Delay_Secuencia = 1; + int First_Bank = 1; + int Final_Bank = 8; + lcd.clear (); + + // Texto + lcd.setCursor (0, 0); + lcd.print("Secuencer Banks: b"); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + lcd.setCursor (4, 1); + lcd.print("Delay 001x100=mS"); + lcd.setCursor (0, 2); + lcd.print("FirstBank 001 Exit"); + lcd.setCursor (0, 3); + lcd.print("FinalBank 008 Start"); + + // Cursor + LCD_Col_Pos = 9; // posicion de cursor + LCD_Row_Pos = 1; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][9] = 1; // Delay + Cursor_Conf[2][9] = 1; // First Bank + Cursor_Conf[3][9] = 1; // Final Bank + Cursor_Conf[2][14] = 1; // Control + Cursor_Conf[3][14] = 1; // start + + inicio: + + lcd.setCursor (15, 3); + lcd.print("Start"); + lcd.noBlink(); + + // navegar + GUI_Navegar(0, 0); - // Unitary - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 0) - { - lcd.setCursor(1, 0); - lcd.print("---"); - goto salida; - } + // Acciones + // Delay + if (LCD_Col_Pos == 9 && LCD_Row_Pos == 1) + { + Num_Row_Pos = 1; + Num_Col_Pos = 10; + Num_Val = Delay_Secuencia; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + + if (Num_Val == 0) + { + Numerico_Write (1, 10, 1); + Delay_Secuencia = 1; + Numerico_Write (Delay_Secuencia, 10, 1); + } + else + { + Delay_Secuencia = Num_Val; // por el multiplicador + } + + if (Num_Val > 100) + { + Delay_Secuencia = 100; + Numerico_Write (Delay_Secuencia, 10, 1); + } + + goto inicio; + } + + // First Bank + if (LCD_Col_Pos == 9 && LCD_Row_Pos == 2) + { + Num_Row_Pos = 2; + Num_Col_Pos = 10; + Num_Val = First_Bank; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + First_Bank = Num_Val; + + if (Num_Val == 0) + { + First_Bank = 1; + Numerico_Write (First_Bank, 10, 2); + } + + if (Num_Val > 8) + { + Numerico_Write (8, 10, 2); + First_Bank = 8; + } + + goto inicio; + } + + // Final Bank + if (LCD_Col_Pos == 9 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 10; + Num_Val = Final_Bank; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Final_Bank = Num_Val; + + if (Num_Val == 0) + { + Final_Bank = 1; + Numerico_Write (Final_Bank, 10, 3); + } + + if (Num_Val > 8) + { + Numerico_Write (8, 10, 2); + Final_Bank = 8; + } + + goto inicio; + } + + // Control + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + // restablecer salida dmx como estaba antes de entrar + for (int Canal = 0; Canal <= 512; Canal ++) + { + ArduinoDmx0.TxBuffer[Canal] = DMX_Values[Canal]; // salida a DMX + } + GUI_Control_Options (); + } + + // start + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) + { + // validar + if (First_Bank == Final_Bank) + { + First_Bank = 1; + Numerico_Write (First_Bank, 10, 2); + Final_Bank = 8; + Numerico_Write (Final_Bank, 10, 2); + goto inicio; + } + + // LCD + lcd.setCursor (14, 3); + lcd.print("+"); + lcd.setCursor (15, 3); + lcd.print("Stop "); + + // establecer reversa o adelante + byte Adelante_Reversa = 0; // 0 Adelante, 1 Reversa + + // adelante + if (First_Bank < Final_Bank) + { + Adelante_Reversa = 0; + } + + // reversa + if (First_Bank > Final_Bank) + { + Adelante_Reversa = 1; + } + + // establecer bancos a secuenciar + byte Bancos [9] = {0, 0, 0, 0, 0, 0, 0, 0}; + + if (Adelante_Reversa == 0) + { + for (byte Bank = 1; Bank <= 8; Bank ++) + { + if (Bank >= First_Bank && Bank <= Final_Bank) + { + Bancos[Bank] = 1; + } + } + } + + if (Adelante_Reversa == 1) + { + for (byte Bank = 8; Bank >= 1; Bank --) + { + if (Bank <= First_Bank && Bank >= Final_Bank) + { + Bancos[Bank] = 1; + } + } + } + + //Secuenciar + byte value = 0; + lcd.blink(); + + // adelante + if (Adelante_Reversa == 0) + { + + contar: + + for (byte conteo = 1; conteo <= 8; conteo ++) + { + if (Bancos [conteo] == 1) + { + lcd.setCursor (19, 0); + lcd.print(conteo); + lcd.setCursor (19, 3); + for (int canal = 0; canal <= 511; canal ++) + { + switch (conteo) + { + case 1: + value = EEPROM.read(canal); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 2: + value = EEPROM.read(canal + 512); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 3: + value = EEPROM.read(canal + 1024); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 4: + value = EEPROM.read(canal + 1536); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 5: + value = EEPROM.read(canal + 2048); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 6: + value = EEPROM.read(canal + 2560); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 7: + value = EEPROM.read(canal + 3072); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 8: + value = EEPROM.read(canal + 3584); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + } + } + + //delay + long delay_contar = Delay_Secuencia * 100; + + while (digitalRead(Enc_Center) == HIGH) // lectura del boton centro + { + for (long contar = 0; contar <= delay_contar; contar ++) + { + delay(1); + if (digitalRead(Enc_Center) == LOW) + { + goto salida; + } + } + goto Delay_Salir; + } + + salida: + + delay(500); // rebote de boton + goto inicio; + + Delay_Salir: {} + + } + } + goto contar; + } + + // reversa + if (Adelante_Reversa == 1) + { + + contar_rev: + + for (byte conteo = 8; conteo >= 1; conteo --) + { + if (Bancos [conteo] == 1) + { + lcd.setCursor (19, 0); + lcd.print(conteo); + lcd.setCursor (19, 3); + for (int canal = 0; canal <= 511; canal ++) + { + switch (conteo) + { + case 1: + value = EEPROM.read(canal); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 2: + value = EEPROM.read(canal + 512); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 3: + value = EEPROM.read(canal + 1024); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 4: + value = EEPROM.read(canal + 1536); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 5: + value = EEPROM.read(canal + 2048); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 6: + value = EEPROM.read(canal + 2560); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 7: + value = EEPROM.read(canal + 3072); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + + case 8: + value = EEPROM.read(canal + 3584); + ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX + break; + } + } + + //delay + long delay_contar = Delay_Secuencia * 100; + + while (digitalRead(Enc_Center) == HIGH) // lectura del boton centro + { + for (long contar = 0; contar <= delay_contar; contar ++) + { + delay(1); + if (digitalRead(Enc_Center) == LOW) + { + goto salida_rev; + } + } + goto Delay_Salir_Rev; + } + + salida_rev: + + delay(500); // rebote de boton + goto inicio; + + Delay_Salir_Rev: {} + + } + } + goto contar_rev; + } + } + goto inicio; +} - // banco 1 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) - { - Numerico_Write (banco, 1, 0); - goto salida; - } +void Black_Out() +{ + lcd.setCursor (15, 1); + lcd.blink(); - // banco 2 - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 1) - { - Numerico_Write (banco + 1, 1, 0); - goto salida; - } + // limpiar universo + for (int Canal = 1; Canal <= 512; Canal ++) + { + ArduinoDmx0.TxBuffer[Canal - 1] = 0; + } - // banco 3 - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) - { - Numerico_Write (banco + 2, 1, 0); - goto salida; - } + // esperar al boton centro para cancelar + while (digitalRead(Enc_Center) == HIGH) {} - // banco 4 - if (LCD_Col_Pos == 12 && LCD_Row_Pos == 1) - { - Numerico_Write (banco + 3, 1, 0); - goto salida; - } + delay(300); // retardo de rebote de boton - // banco 5 - if (LCD_Col_Pos == 16 && LCD_Row_Pos == 1) - { - Numerico_Write (banco + 4, 1, 0); - goto salida; - } + // regresar el universo a su lugar + for (int Canal = 1; Canal <= 512; Canal ++) + { + ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; + } - // banco 6 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 5, 1, 0); - goto salida; - } + lcd.setCursor (6, 2); + lcd.noBlink(); +} - // banco 7 - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 6, 1, 0); - goto salida; - } +int EEPROM_Save() +{ + // guarda el universo en la eeprom + // regresa 1 si se selecciona exit + + int cancel = 0; // regresa 1 si se selecciona salir + int bank; // regresa 1 si se selecciona salir + int EEPROM_Add = 0; // direccion de eeprom para universos + bank = GUI_Memory_Bank(1); // seleccinar banco + + if (bank == 1) + { + cancel = 1; + goto salida; + } + + lcd.clear (); + lcd.setCursor (1, 1); + lcd.print ("Memory Saving..."); + lcd.setCursor (1, 2); + lcd.print ("Bank: "); + lcd.setCursor (7, 2); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + lcd.blink(); + + for (int Canal = 0; Canal <= 511; Canal ++) + { + // Escritura de universo EEPROM + switch (Universo_Actual) + { + case 1: + EEPROM_Add = 0 + Canal; + break; + + case 2: + EEPROM_Add = 512 + Canal; + break; + + case 3: + EEPROM_Add = 1024 + Canal; + break; + + case 4: + EEPROM_Add = 1536 + Canal; + break; + + case 5: + EEPROM_Add = 2048 + Canal; + break; + + case 6: + EEPROM_Add = 2560 + Canal; + break; + + case 7: + EEPROM_Add = 3072 + Canal; + break; + + case 8: + EEPROM_Add = 3584 + Canal; + if (EEPROM_Add > EEPROM_Limit) + { + EEPROM_Add = EEPROM_Limit; + } + break; + } + + EEPROM.write(EEPROM_Add, DMX_Values[Canal + 1]); // lectura desde EEPROM + } + + lcd.clear (); + lcd.setCursor (3, 1); + lcd.print ("Memory Saved!"); + lcd.setCursor (3, 2); + lcd.print ("Bank: "); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + delay (1000); + lcd.noBlink(); + + salida: + + return cancel; +} - // banco 8 - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 7, 1, 0); - goto salida; - } +int EEPROM_Load() +{ + // guarda los valores en la eeprom + // regresa 1 si se selecciona exit + + int cancel = 0; // regresa 1 si se selecciona salir + int bank; // regresa 1 si se selecciona salir + int EEPROM_Add = 0; // seleccion de universo + bank = GUI_Memory_Bank(2); // seleccinar banco + + if (bank == 1) + { + cancel = 1; + goto salida; + } + + lcd.clear (); + + for (int Canal = 1; Canal <= 512; Canal ++) + { + // Escritura de universo EEPROM + switch (Universo_Actual) + { + case 1: + EEPROM_Add = 0 + Canal - 1; + break; + + case 2: + EEPROM_Add = 512 + Canal - 1; + break; + + case 3: + EEPROM_Add = 1024 + Canal - 1; + break; + + case 4: + EEPROM_Add = 1536 + Canal - 1; + break; + + case 5: + EEPROM_Add = 2048 + Canal - 1; + break; + + case 6: + EEPROM_Add = 2560 + Canal - 1; + break; + + case 7: + EEPROM_Add = 3072 + Canal - 1; + break; + + case 8: + EEPROM_Add = 3584 + Canal - 1; + if (EEPROM_Add > EEPROM_Limit) + { + EEPROM_Add = EEPROM_Limit; + } + break; + } + + DMX_Values[Canal] = EEPROM.read(EEPROM_Add); // lectura desde EEPROM + ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; // salida a DMX + } - // banco 9 - if (LCD_Col_Pos == 12 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 8, 1, 0); - goto salida; - } + lcd.clear (); + lcd.setCursor (3, 1); + lcd.print ("Memory Loaded!"); + lcd.setCursor (3, 2); + lcd.print ("Bank: "); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + lcd.blink(); + delay (1000); + lcd.noBlink(); + + salida: + + return cancel; +} - // banco 10 - if (LCD_Col_Pos == 16 && LCD_Row_Pos == 2) - { - Numerico_Write (banco + 9, 1, 0); - goto salida; - } +void EEPROM_Load_Init() +{ + // carga los valores de los canales DMX de la eeprom al inicio e inicia el streaming de dmx + + int EEPROM_Add = 0; + Universo_Actual = EEPROM.read(Bank_Init_Add); + + if (Universo_Actual == 0) + { + goto salir; + } + + for (int Canal = 1; Canal <= 512; Canal ++) + { + // Escritura de universo EEPROM + switch (Universo_Actual) + { + case 1: + EEPROM_Add = 0 + Canal - 1; + break; + + case 2: + EEPROM_Add = 512 + Canal - 1; + break; + + case 3: + EEPROM_Add = 1024 + Canal - 1; + break; + + case 4: + EEPROM_Add = 1536 + Canal - 1; + break; + + case 5: + EEPROM_Add = 2048 + Canal - 1; + break; + + case 6: + EEPROM_Add = 2560 + Canal - 1; + break; + + case 7: + EEPROM_Add = 3072 + Canal - 1; + break; + + case 8: + EEPROM_Add = 3584 + Canal - 1; + if (EEPROM_Add > EEPROM_Limit) + { + EEPROM_Add = EEPROM_Limit; + } + break; + } + DMX_Values[Canal] = EEPROM.read(EEPROM_Add); // lectura desde EEPROM + ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; // salida a DMX + } + + lcd.clear (); + lcd.setCursor (3, 1); + lcd.print ("Memory Loaded!"); + lcd.setCursor (3, 2); + lcd.print ("Bank: "); + lcd.print (Universo_Actual); + lcd.setCursor (10, 2); + lcd.blink(); + delay (2000); + lcd.noBlink(); + + salir: {} - // banco 11 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 10, 1, 0); - goto salida; - } +} - // banco 12 - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 11, 1, 0); - goto salida; - } +void EEPROM_Empty() +{ + // solo borra la ram + // no hay retorno al menu anterior + + lcd.clear (); + + for (int Canal = 1; Canal <= 512; Canal ++) + { + DMX_Values[Canal] = 0; // lectura desde EEPROM + ArduinoDmx0.TxBuffer[Canal - 1] = 0; // salida a DMX + } + + lcd.clear (); + lcd.setCursor (3, 1); + lcd.print ("Memory Emptied!"); + lcd.setCursor (3, 2); + lcd.print ("Bank: RAM"); + lcd.setCursor (19, 3); + lcd.blink(); + delay (1000); + lcd.noBlink(); +} - // banco 13 - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 12, 1, 0); - goto salida; - } +int EEPROM_Clear() +{ + // Pone en ceros la memoria EEPROM + // regresa 1 si se selecciona exit + + int cancel = 0; // regresa 1 si se selecciona salir + int bank; // regresa 1 si se selecciona salir + int EEPROM_Add = 0; // direccion de eeprom para universos + bank = GUI_Memory_Bank(3); // seleccinar banco + + if (bank == 1) // si se selecciono salir + { + cancel = 1; + goto salida; + } + + lcd.clear (); + lcd.setCursor (1, 1); + lcd.print ("Memory Cleaning..."); + lcd.setCursor (1, 2); + lcd.print ("Bank: "); + lcd.setCursor (7, 2); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + lcd.blink(); + + for (int Canal = 0; Canal <= 511; Canal ++) + { + DMX_Values[Canal] = 0; // lectura desde EEPROM + ArduinoDmx0.TxBuffer[Canal] = 0; // salida a DMX + // Escritura de universo EEPROM + switch (Universo_Actual) + { + case 1: + EEPROM_Add = 0 + Canal; + break; + + case 2: + EEPROM_Add = 512 + Canal; + break; + + case 3: + EEPROM_Add = 1024 + Canal; + break; + + case 4: + EEPROM_Add = 1536 + Canal; + break; + + case 5: + EEPROM_Add = 2048 + Canal; + break; + + case 6: + EEPROM_Add = 2560 + Canal; + break; + + case 7: + EEPROM_Add = 3072 + Canal; + break; + + case 8: + EEPROM_Add = 3584 + Canal; + if (EEPROM_Add > EEPROM_Limit) + { + EEPROM_Add = EEPROM_Limit; + } + break; + } + + EEPROM.write (EEPROM_Add, 0); // escritura EEPROM + } + lcd.clear (); + lcd.setCursor (2, 1); + lcd.print ("Memory Cleaned!"); + lcd.setCursor (2, 2); + lcd.print ("Bank: "); + lcd.print (Universo_Actual); + lcd.setCursor (19, 3); + delay (1000); + lcd.noBlink(); + + salida: + + return cancel; +} - // banco 14 - if (LCD_Col_Pos == 12 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 13, 1, 0); - goto salida; - } +void EEPROM_Clear_All() +{ + // Pone en ceros la memoria EEPROM toda + lcd.clear (); + lcd.setCursor (1, 1); + lcd.print ("All"); + lcd.setCursor (1, 2); + lcd.print ("Memory Cleaning..."); + lcd.setCursor (19, 2); + lcd.blink(); + + for (int Canal = 0; Canal <= EEPROM_Limit; Canal ++) + { + EEPROM.write (Canal, 0); // escritura EEPROM + if (Canal <= 511) + { + DMX_Values[Canal + 1] = 0; + ArduinoDmx0.TxBuffer[Canal] = 0; // salida a DMX + } + } + + lcd.clear (); + lcd.noBlink(); + lcd.setCursor (2, 2); + lcd.print ("Memory Cleaned!"); + lcd.setCursor (2, 1); + lcd.print ("All"); + Universo_Actual = 0; + delay (1000); +} - // banco 15 - if (LCD_Col_Pos == 16 && LCD_Row_Pos == 3) - { - Numerico_Write (banco + 14, 1, 0); - goto salida; - } - -salida: - // escribir guion de bancos - lcd.setCursor(16, 0); - lcd.print("-"); -salir: - } - } - else - { - // escribir + - lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); - lcd.print("+"); - } +void GUI_Control_Options() +{ - //salida - LCD_Col_Pos_Ant = LCD_Col_Pos; - LCD_Row_Pos_Ant = LCD_Row_Pos; + inicio: + + // LCD + lcd.clear (); + lcd.setCursor (18, 0); + lcd.print ("b"); + + if (Universo_Actual == 0) + { + lcd.print ("-"); + } + else + { + lcd.print (Universo_Actual); + } + + lcd.setCursor (2, 0); + lcd.print ("Convert"); + lcd.setCursor (2, 1); + lcd.print ("Unitary"); + lcd.setCursor (2, 2); + lcd.print ("Matrix"); + lcd.setCursor (2, 3); + lcd.print ("Chaser"); + lcd.setCursor (11, 3); + lcd.print ("Multiply"); + lcd.setCursor (11, 0); + lcd.print ("Config"); + lcd.setCursor (11, 2); + lcd.print ("Secuencer"); + lcd.setCursor (11, 1); + lcd.print ("Memory"); + + // Cursor + LCD_Col_Pos = 1; // posicion de cursor + LCD_Row_Pos = 2; + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][1] = 1; // Unitary + Cursor_Conf[2][1] = 1; // Matrix + Cursor_Conf[3][1] = 1; // Chaser + Cursor_Conf[3][10] = 1; // Multiply + Cursor_Conf[0][10] = 1; // Config + Cursor_Conf[2][10] = 1; // Secuencer + Cursor_Conf[1][10] = 1; // Memory + Cursor_Conf[0][1] = 1; // Convert + + // navegar + GUI_Navegar(0, 0); - if (Dibujar_Cursor == 2) - { - goto Salir; - } - else - { - Dibujar_Cursor = 0; - } - } - goto Dibujar; -Salir: {} + // Acciones + // Unitary + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 1) + { + GUI_Control_Unit(); + } + + // Matrix + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 2) + { + GUI_Control_Matrix(); + } + + // Chaser + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 3) + { + GUI_Control_Chaser(); + } + + // Multiply + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 3) + { + GUI_Control_Multiply(); + } + + // Config + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 0) + { + GUI_Config(); + } + + // Secuencer + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 2) + { + GUI_Control_Secuencer(); + } + + // Converter + if (LCD_Col_Pos == 1 && LCD_Row_Pos == 0) + { + //GUI_Convert(); + } + + // Memory + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 1) + { + GUI_Memory(); + goto inicio; + } } -void GUI_Memory_Init() +/*void GUI_Convert() { + int valor = 0; // aqui el valor a calcular + int valor_temp = 0; // aqui el valor temporal para las cuentas + int valor_resto = 0; // aqui el valor del resto de la divicion + int valor_Bin [10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // aqui el valor descompuesto en binario + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print ("Bin: OOOOOOOOO I=On"); + lcd.setCursor (5, 1); + lcd.print ("124813612 O=Off"); + lcd.setCursor (9, 2); + lcd.print ("62425"); + lcd.setCursor (0, 3); + lcd.print ("Dec: 000 86 Exit"); -inicio: - - int salir = 0; - lcd.clear (); - - // Texto - lcd.setCursor (0, 0); - lcd.print("Initial Memory:"); - lcd.setCursor (2, 2); - lcd.print("Empty"); - lcd.setCursor (9, 2); - lcd.print("Load"); - lcd.setCursor (15, 2); - lcd.print("Clear"); + // Cursor + LCD_Col_Pos = 4; // posicion de cursor + LCD_Row_Pos = 3; // posicion e cursor - // bank - lcd.setCursor(18, 0); - lcd.print("b"); + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } + // Cursores + Cursor_Conf[0][4] = 1; // Bin + Cursor_Conf[3][4] = 1; // Dec + Cursor_Conf[3][15] = 1; // Exit - // Cursor - LCD_Col_Pos = 1; // posicion de cursor - LCD_Row_Pos = 2; + //Navegacion: + calc: + GUI_Navegar(0, 0); - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array + // Acciones + // Exit + if (LCD_Col_Pos == 15 && LCD_Row_Pos == 3) + { + GUI_Control_Options(); + } - // Acciones - Cursor_Conf[2][1] = 1; // Empty - Cursor_Conf[2][8] = 1; // Load - Cursor_Conf[2][14] = 1; // Clear + // Binario a decimal + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 0) + { + // boton de centro para salir + // boton de lados para navegar + // boton arriba abajo para cambiar valor + byte cursor = 5; // posicion de cursor + int boton_retardo = 250; // retardo de boton para estabilidad + byte calcular = 0; // calcular binario a decimal + byte calcular_val = 0; // valor a meter a la matriz para calcular + lcd.blink(); + lcd.setCursor (5, 0); - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Load - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - salir = EEPROM_Load(); - if (salir == 1) - { - goto inicio; + while (digitalRead(Enc_Center) == HIGH) // salida + { + if (digitalRead(Boton_Right) == LOW) + { + delay(boton_retardo); // esperar a estabilidad + cursor = cursor + 1; + if (cursor > 13) + { + cursor = 5; // regresar al principio + } + lcd.setCursor (cursor, 0); } - GUI_Control_Options(); - } - // Clear - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - salir = EEPROM_Clear(); - if (salir == 1) + if (digitalRead(Boton_Left) == LOW) { - goto inicio; - } - GUI_Control_Options(); - } - - // Empty - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 2) - { - GUI_Control_Options(); - } -} - -int GUI_Memory_Bank(byte Opcion) -{ - // regresa 1 si se selecciona salir, de lo contrario 0 - // recibe opcion para pintar en la pantalla lo que se selecciono - - int salir = 0; - lcd.clear (); - delay (200); // retardo para no seleccionar inmediatamente la opcion del banco - - // Texto - lcd.setCursor (6, 0); - lcd.print("Memory Bank:"); - lcd.setCursor (1, 1); - lcd.print("Bank1 Bank4 Bank7"); - lcd.setCursor (1, 2); - lcd.print("Bank2 Bank5 Bank8"); - lcd.setCursor (1, 3); - lcd.print("Bank3 Bank6 Exit"); - - switch (Opcion) - { - case 1: - lcd.setCursor (1, 0); - lcd.print("Save"); - break; - - case 2: - lcd.setCursor (1, 0); - lcd.print("Load"); - break; - - case 3: - lcd.setCursor (0, 0); - lcd.print("Clear"); - break; - } - - // Universo Actual - lcd.setCursor (19, 0); - - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } - - // Cursor inicial - LCD_Col_Pos = 0; // posicion de cursor - LCD_Row_Pos = 1; - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][0] = 1; // Bank 1 - Cursor_Conf[2][0] = 1; // Bank 2 - Cursor_Conf[3][0] = 1; // Bank 3 - Cursor_Conf[1][7] = 1; // Bank 4 - Cursor_Conf[2][7] = 1; // Bank 5 - Cursor_Conf[3][7] = 1; // Bank 6 - Cursor_Conf[1][14] = 1; // Bank 7 - Cursor_Conf[2][14] = 1; // Bank 8 - Cursor_Conf[3][14] = 1; // Exit - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Bank 1 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) - { - Universo_Actual = 1; - goto Salida; - } - - // Bank 2 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) - { - Universo_Actual = 2; - goto Salida; - } - - // Bank 3 - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) - { - Universo_Actual = 3; - goto Salida; - } - - // Bank 4 - if (LCD_Col_Pos == 7 && LCD_Row_Pos == 1) - { - Universo_Actual = 4; - goto Salida; - } - - // Bank 5 - if (LCD_Col_Pos == 7 && LCD_Row_Pos == 2) - { - Universo_Actual = 5; - goto Salida; - } - - // Bank 6 - if (LCD_Col_Pos == 7 && LCD_Row_Pos == 3) - { - Universo_Actual = 6; - goto Salida; - } - - // Bank 7 - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 1) - { - Universo_Actual = 7; - goto Salida; - } - - // Bank 8 - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - Universo_Actual = 8; - goto Salida; - } - - // Exit - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) - { - salir = 1; - } - -Salida: - - return salir; -} - -void GUI_Memory() -{ - -iniciar: - - // Texto - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print("Memory: b"); - - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } - - lcd.setCursor (1, 1); - lcd.print("Save"); - lcd.setCursor (1, 2); - lcd.print("Load"); - lcd.setCursor (1, 3); - lcd.print("Clear"); - lcd.setCursor (7, 2); - lcd.print("ClearAll"); - lcd.setCursor (7, 1); - lcd.print("BlackOut"); - lcd.setCursor (16, 3); - lcd.print("Exit"); - lcd.setCursor (7, 3); - lcd.print("EmptyRAM"); - - // Cursor - LCD_Col_Pos = 0; // posicion de cursor - LCD_Row_Pos = 1; - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][0] = 1; // Save - Cursor_Conf[2][0] = 1; // Load - Cursor_Conf[3][0] = 1; // Clear - Cursor_Conf[2][6] = 1; // Clear All - Cursor_Conf[3][6] = 1; // Empty RAM - Cursor_Conf[1][6] = 1; // Black Out - Cursor_Conf[3][15] = 1; // Exit - - // navegar -regresa: - - GUI_Navegar(0, 0); - - // Acciones - // Load - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 2) - { - if (EEPROM_Load() == 1) - { - goto iniciar; - } - goto salida; - } - - // Clear - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 3) - { - if (EEPROM_Clear() == 1) - { - goto iniciar; - } - goto salida; - } - - // Clear All - if (LCD_Col_Pos == 6 && LCD_Row_Pos == 2) - { - EEPROM_Clear_All(); - goto salida; - } - - // Save - if (LCD_Col_Pos == 0 && LCD_Row_Pos == 1) - { - if (EEPROM_Save() == 1) - { - goto iniciar; - } - goto salida; - } - - // Empty RAM - if (LCD_Col_Pos == 6 && LCD_Row_Pos == 3) - { - EEPROM_Empty(); - goto salida; - } - - // Black Out - if (LCD_Col_Pos == 6 && LCD_Row_Pos == 1) - { - Black_Out(); - goto regresa; - } - - // Exit - if (LCD_Col_Pos == 15 && LCD_Row_Pos == 3) - { - - } - -salida: {} -} - -void GUI_Control_Secuencer() -{ - // secuenciador de bancos guardados en eeprom - - int Delay_Secuencia = 1; - int First_Bank = 1; - int Final_Bank = 8; - lcd.clear (); - - // Texto - lcd.setCursor (0, 0); - lcd.print("Secuencer Banks: b"); - - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } - - lcd.setCursor (4, 1); - lcd.print("Delay 001x100=mS"); - lcd.setCursor (0, 2); - lcd.print("FirstBank 001 Exit"); - lcd.setCursor (0, 3); - lcd.print("FinalBank 008 Start"); - - // Cursor - LCD_Col_Pos = 9; // posicion de cursor - LCD_Row_Pos = 1; - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][9] = 1; // Delay - Cursor_Conf[2][9] = 1; // First Bank - Cursor_Conf[3][9] = 1; // Final Bank - Cursor_Conf[2][14] = 1; // Control - Cursor_Conf[3][14] = 1; // start -inicio: - lcd.setCursor (15, 3); - lcd.print("Start"); - lcd.noBlink(); - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Delay - if (LCD_Col_Pos == 9 && LCD_Row_Pos == 1) - { - Num_Row_Pos = 1; - Num_Col_Pos = 10; - Num_Val = Delay_Secuencia; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - - if (Num_Val == 0) - { - Numerico_Write (1, 10, 1); - Delay_Secuencia = 1; - Numerico_Write (Delay_Secuencia, 10, 1); - } - else - { - Delay_Secuencia = Num_Val; // por el multiplicador - } - - if (Num_Val > 100) - { - Delay_Secuencia = 100; - Numerico_Write (Delay_Secuencia, 10, 1); - } - - goto inicio; - } - // First Bank - if (LCD_Col_Pos == 9 && LCD_Row_Pos == 2) - { - Num_Row_Pos = 2; - Num_Col_Pos = 10; - Num_Val = First_Bank; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - First_Bank = Num_Val; - - if (Num_Val == 0) - { - First_Bank = 1; - Numerico_Write (First_Bank, 10, 2); - } - - if (Num_Val > 8) - { - Numerico_Write (8, 10, 2); - First_Bank = 8; - } - - goto inicio; - } - // Final Bank - if (LCD_Col_Pos == 9 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 10; - Num_Val = Final_Bank; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Final_Bank = Num_Val; - - if (Num_Val == 0) - { - Final_Bank = 1; - Numerico_Write (Final_Bank, 10, 3); - } - - if (Num_Val > 8) - { - Numerico_Write (8, 10, 2); - Final_Bank = 8; - } - - goto inicio; - } - // Control - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - // restablecer salida dmx como estaba antes de entrar - for (int Canal = 0; Canal <= 512; Canal ++) - { - ArduinoDmx0.TxBuffer[Canal] = DMX_Values[Canal]; // salida a DMX - } - GUI_Control_Options (); - } - // start - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) - { - // validar - if (First_Bank == Final_Bank) - { - First_Bank = 1; - Numerico_Write (First_Bank, 10, 2); - Final_Bank = 8; - Numerico_Write (Final_Bank, 10, 2); - goto inicio; - } - // LCD - lcd.setCursor (14, 3); - lcd.print("+"); - lcd.setCursor (15, 3); - lcd.print("Stop "); - - // establecer reversa o adelante - byte Adelante_Reversa = 0; // 0 Adelante, 1 Reversa - - // adelante - if (First_Bank < Final_Bank) - { - Adelante_Reversa = 0; - } - - // reversa - if (First_Bank > Final_Bank) - { - Adelante_Reversa = 1; - } - - // establecer bancos a secuenciar - byte Bancos [9] = {0, 0, 0, 0, 0, 0, 0, 0}; - if (Adelante_Reversa == 0) - { - for (byte Bank = 1; Bank <= 8; Bank ++) - { - if (Bank >= First_Bank && Bank <= Final_Bank) - { - Bancos[Bank] = 1; - } - } - } - - if (Adelante_Reversa == 1) - { - for (byte Bank = 8; Bank >= 1; Bank --) - { - if (Bank <= First_Bank && Bank >= Final_Bank) - { - Bancos[Bank] = 1; - } - } - } - - //Secuenciar - byte value = 0; - lcd.blink(); - - // adelante - if (Adelante_Reversa == 0) - { -contar: - for (byte conteo = 1; conteo <= 8; conteo ++) - { - if (Bancos [conteo] == 1) - { - lcd.setCursor (19, 0); - lcd.print(conteo); - lcd.setCursor (19, 3); - for (int canal = 0; canal <= 511; canal ++) - { - switch (conteo) - { - case 1: - value = EEPROM.read(canal); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 2: - value = EEPROM.read(canal + 512); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 3: - value = EEPROM.read(canal + 1024); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 4: - value = EEPROM.read(canal + 1536); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 5: - value = EEPROM.read(canal + 2048); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 6: - value = EEPROM.read(canal + 2560); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 7: - value = EEPROM.read(canal + 3072); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 8: - value = EEPROM.read(canal + 3584); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - } - } - //delay - long delay_contar = Delay_Secuencia * 100; - - while (digitalRead(Boton_Center) == HIGH) // lectura del boton centro - { - for (long contar = 0; contar <= delay_contar; contar ++) - { - delay(1); - if (digitalRead(Boton_Center) == LOW) - { - goto salida; - } - } - goto Delay_Salir; - } - -salida: - - delay(500); // rebote de boton - goto inicio; - -Delay_Salir: {} - - } - } - goto contar; - } - - // reversa - if (Adelante_Reversa == 1) - { - -contar_rev: - - for (byte conteo = 8; conteo >= 1; conteo --) - { - if (Bancos [conteo] == 1) - { - lcd.setCursor (19, 0); - lcd.print(conteo); - lcd.setCursor (19, 3); - for (int canal = 0; canal <= 511; canal ++) - { - switch (conteo) - { - case 1: - value = EEPROM.read(canal); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 2: - value = EEPROM.read(canal + 512); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 3: - value = EEPROM.read(canal + 1024); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 4: - value = EEPROM.read(canal + 1536); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 5: - value = EEPROM.read(canal + 2048); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 6: - value = EEPROM.read(canal + 2560); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 7: - value = EEPROM.read(canal + 3072); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - - case 8: - value = EEPROM.read(canal + 3584); - ArduinoDmx0.TxBuffer[canal] = value; // salida a DMX - break; - } - } - - //delay - long delay_contar = Delay_Secuencia * 100; - - while (digitalRead(Boton_Center) == HIGH) // lectura del boton centro - { - for (long contar = 0; contar <= delay_contar; contar ++) - { - delay(1); - if (digitalRead(Boton_Center) == LOW) - { - goto salida_rev; - } - } - goto Delay_Salir_Rev; - } - -salida_rev: - - delay(500); // rebote de boton - goto inicio; - -Delay_Salir_Rev: {} - - } - } - goto contar_rev; - } - } - goto inicio; -} - -void Black_Out() -{ - lcd.setCursor (15, 1); - lcd.blink(); - - // limpiar universo - for (int Canal = 1; Canal <= 512; Canal ++) - { - ArduinoDmx0.TxBuffer[Canal - 1] = 0; - } - - // esperar al boton centro para cancelar - while (digitalRead(Boton_Center) == HIGH) {} - - delay(300); // retardo de rebote de boton - - // regresar el universo a su lugar - for (int Canal = 1; Canal <= 512; Canal ++) - { - ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; - } - - lcd.setCursor (6, 2); - lcd.noBlink(); -} - -int EEPROM_Save() -{ - // guarda el universo en la eeprom - // regresa 1 si se selecciona exit - - int cancel = 0; // regresa 1 si se selecciona salir - int bank; // regresa 1 si se selecciona salir - int EEPROM_Add = 0; // direccion de eeprom para universos - bank = GUI_Memory_Bank(1); // seleccinar banco - - if (bank == 1) - { - cancel = 1; - goto salida; - } - - lcd.clear (); - lcd.setCursor (1, 1); - lcd.print ("Memory Saving..."); - lcd.setCursor (1, 2); - lcd.print ("Bank: "); - lcd.setCursor (7, 2); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - lcd.blink(); - - for (int Canal = 0; Canal <= 511; Canal ++) - { - // Escritura de universo EEPROM - switch (Universo_Actual) - { - case 1: - EEPROM_Add = 0 + Canal; - break; - - case 2: - EEPROM_Add = 512 + Canal; - break; - - case 3: - EEPROM_Add = 1024 + Canal; - break; - - case 4: - EEPROM_Add = 1536 + Canal; - break; - - case 5: - EEPROM_Add = 2048 + Canal; - break; - - case 6: - EEPROM_Add = 2560 + Canal; - break; - - case 7: - EEPROM_Add = 3072 + Canal; - break; - - case 8: - EEPROM_Add = 3584 + Canal; - if (EEPROM_Add > EEPROM_Limit) - { - EEPROM_Add = EEPROM_Limit; - } - break; - } - EEPROM.write(EEPROM_Add, DMX_Values[Canal + 1]); // lectura desde EEPROM - } - - lcd.clear (); - lcd.setCursor (3, 1); - lcd.print ("Memory Saved!"); - lcd.setCursor (3, 2); - lcd.print ("Bank: "); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - delay (1000); - lcd.noBlink(); - -salida: - - return cancel; -} - -int EEPROM_Load() -{ - // guarda los valores en la eeprom - // regresa 1 si se selecciona exit - - int cancel = 0; // regresa 1 si se selecciona salir - int bank; // regresa 1 si se selecciona salir - int EEPROM_Add = 0; // seleccion de universo - bank = GUI_Memory_Bank(2); // seleccinar banco - - if (bank == 1) - { - cancel = 1; - goto salida; - } - - lcd.clear (); - - for (int Canal = 1; Canal <= 512; Canal ++) - { - // Escritura de universo EEPROM - switch (Universo_Actual) - { - case 1: - EEPROM_Add = 0 + Canal - 1; - break; - - case 2: - EEPROM_Add = 512 + Canal - 1; - break; - - case 3: - EEPROM_Add = 1024 + Canal - 1; - break; - - case 4: - EEPROM_Add = 1536 + Canal - 1; - break; - - case 5: - EEPROM_Add = 2048 + Canal - 1; - break; - - case 6: - EEPROM_Add = 2560 + Canal - 1; - break; - - case 7: - EEPROM_Add = 3072 + Canal - 1; - break; - - case 8: - EEPROM_Add = 3584 + Canal - 1; - if (EEPROM_Add > EEPROM_Limit) - { - EEPROM_Add = EEPROM_Limit; - } - break; - } - - DMX_Values[Canal] = EEPROM.read(EEPROM_Add); // lectura desde EEPROM - ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; // salida a DMX - } - - lcd.clear (); - lcd.setCursor (3, 1); - lcd.print ("Memory Loaded!"); - lcd.setCursor (3, 2); - lcd.print ("Bank: "); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - lcd.blink(); - delay (1000); - lcd.noBlink(); - -salida: - - return cancel; -} - -void EEPROM_Load_Init() -{ - // carga los valores en la eeprom al inicio - - int EEPROM_Add = 0; - Universo_Actual = EEPROM.read(Bank_Init_Add); - - if (Universo_Actual == 0) - { - goto salir; - } - - for (int Canal = 1; Canal <= 512; Canal ++) - { - // Escritura de universo EEPROM - switch (Universo_Actual) - { - case 1: - EEPROM_Add = 0 + Canal - 1; - break; - - case 2: - EEPROM_Add = 512 + Canal - 1; - break; - - case 3: - EEPROM_Add = 1024 + Canal - 1; - break; - - case 4: - EEPROM_Add = 1536 + Canal - 1; - break; - - case 5: - EEPROM_Add = 2048 + Canal - 1; - break; - - case 6: - EEPROM_Add = 2560 + Canal - 1; - break; - - case 7: - EEPROM_Add = 3072 + Canal - 1; - break; - - case 8: - EEPROM_Add = 3584 + Canal - 1; - if (EEPROM_Add > EEPROM_Limit) - { - EEPROM_Add = EEPROM_Limit; - } - break; - } - DMX_Values[Canal] = EEPROM.read(EEPROM_Add); // lectura desde EEPROM - ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; // salida a DMX - } - - lcd.clear (); - lcd.setCursor (3, 1); - lcd.print ("Memory Loaded!"); - lcd.setCursor (3, 2); - lcd.print ("Bank: "); - lcd.print (Universo_Actual); - lcd.setCursor (10, 2); - lcd.blink(); - delay (2000); - lcd.noBlink(); - -salir: {} - -} - -void EEPROM_Empty() -{ - // solo borra la ram - // no hay retorno al menu anterior - - lcd.clear (); - - for (int Canal = 1; Canal <= 512; Canal ++) - { - DMX_Values[Canal] = 0; // lectura desde EEPROM - ArduinoDmx0.TxBuffer[Canal - 1] = 0; // salida a DMX - } - - lcd.clear (); - lcd.setCursor (3, 1); - lcd.print ("Memory Emptied!"); - lcd.setCursor (3, 2); - lcd.print ("Bank: RAM"); - lcd.setCursor (19, 3); - lcd.blink(); - delay (1000); - lcd.noBlink(); -} - -int EEPROM_Clear() -{ - // Pone en ceros la memoria EEPROM - // regresa 1 si se selecciona exit - - int cancel = 0; // regresa 1 si se selecciona salir - int bank; // regresa 1 si se selecciona salir - int EEPROM_Add = 0; // direccion de eeprom para universos - bank = GUI_Memory_Bank(3); // seleccinar banco - - if (bank == 1) // si se selecciono salir - { - cancel = 1; - goto salida; - } - - lcd.clear (); - lcd.setCursor (1, 1); - lcd.print ("Memory Cleaning..."); - lcd.setCursor (1, 2); - lcd.print ("Bank: "); - lcd.setCursor (7, 2); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - lcd.blink(); - - for (int Canal = 0; Canal <= 511; Canal ++) - { - DMX_Values[Canal] = 0; // lectura desde EEPROM - ArduinoDmx0.TxBuffer[Canal] = 0; // salida a DMX - // Escritura de universo EEPROM - switch (Universo_Actual) - { - case 1: - EEPROM_Add = 0 + Canal; - break; - - case 2: - EEPROM_Add = 512 + Canal; - break; - - case 3: - EEPROM_Add = 1024 + Canal; - break; - - case 4: - EEPROM_Add = 1536 + Canal; - break; - - case 5: - EEPROM_Add = 2048 + Canal; - break; - - case 6: - EEPROM_Add = 2560 + Canal; - break; - - case 7: - EEPROM_Add = 3072 + Canal; - break; - - case 8: - EEPROM_Add = 3584 + Canal; - if (EEPROM_Add > EEPROM_Limit) - { - EEPROM_Add = EEPROM_Limit; - } - break; - } - - EEPROM.write (EEPROM_Add, 0); // escritura EEPROM - } - lcd.clear (); - lcd.setCursor (2, 1); - lcd.print ("Memory Cleaned!"); - lcd.setCursor (2, 2); - lcd.print ("Bank: "); - lcd.print (Universo_Actual); - lcd.setCursor (19, 3); - delay (1000); - lcd.noBlink(); - -salida: - - return cancel; -} - -void EEPROM_Clear_All() -{ - // Pone en ceros la memoria EEPROM toda - lcd.clear (); - lcd.setCursor (1, 1); - lcd.print ("All"); - lcd.setCursor (1, 2); - lcd.print ("Memory Cleaning..."); - lcd.setCursor (19, 2); - lcd.blink(); - - for (int Canal = 0; Canal <= EEPROM_Limit; Canal ++) - { - EEPROM.write (Canal, 0); // escritura EEPROM - if (Canal <= 511) - { - DMX_Values[Canal + 1] = 0; - ArduinoDmx0.TxBuffer[Canal] = 0; // salida a DMX - } - } - - lcd.clear (); - lcd.noBlink(); - lcd.setCursor (2, 2); - lcd.print ("Memory Cleaned!"); - lcd.setCursor (2, 1); - lcd.print ("All"); - Universo_Actual = 0; - delay (1000); -} - -void GUI_Control_Options() -{ - -inicio: - - // LCD - lcd.clear (); - lcd.setCursor (18, 0); - lcd.print ("b"); - - if (Universo_Actual == 0) - { - lcd.print ("-"); - } - else - { - lcd.print (Universo_Actual); - } - - lcd.setCursor (2, 0); - lcd.print ("Convert"); - lcd.setCursor (2, 1); - lcd.print ("Unitary"); - lcd.setCursor (2, 2); - lcd.print ("Matrix"); - lcd.setCursor (2, 3); - lcd.print ("Chaser"); - lcd.setCursor (11, 3); - lcd.print ("Multiply"); - lcd.setCursor (11, 0); - lcd.print ("Config"); - lcd.setCursor (11, 2); - lcd.print ("Secuencer"); - lcd.setCursor (11, 1); - lcd.print ("Memory"); - - // Cursor - LCD_Col_Pos = 1; // posicion de cursor - LCD_Row_Pos = 2; - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][1] = 1; // Unitary - Cursor_Conf[2][1] = 1; // Matrix - Cursor_Conf[3][1] = 1; // Chaser - Cursor_Conf[3][10] = 1; // Multiply - Cursor_Conf[0][10] = 1; // Config - Cursor_Conf[2][10] = 1; // Secuencer - Cursor_Conf[1][10] = 1; // Memory - Cursor_Conf[0][1] = 1; // Convert - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Unitary - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 1) - { - GUI_Control_Unit(); - } - - // Matrix - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 2) - { - GUI_Control_Matrix(); - } - - // Chaser - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 3) - { - GUI_Control_Chaser(); - } - - // Multiply - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 3) - { - GUI_Control_Multiply(); - } - - // Config - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 0) - { - GUI_Config(); - } - - // Secuencer - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 2) - { - GUI_Control_Secuencer(); - } - - // Converter - if (LCD_Col_Pos == 1 && LCD_Row_Pos == 0) - { - GUI_Convert(); - } - - // Memory - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 1) - { - GUI_Memory(); - goto inicio - } -} - -void GUI_Convert() -{ - int valor = 0; // aqui el valor a calcular - int valor_temp = 0; // aqui el valor temporal para las cuentas - int valor_resto = 0; // aqui el valor del resto de la divicion - int valor_Bin [10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // aqui el valor descompuesto en binario - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print ("Bin: OOOOOOOOO I=On"); - lcd.setCursor (5, 1); - lcd.print ("124813612 O=Off"); - lcd.setCursor (9, 2); - lcd.print ("62425"); - lcd.setCursor (0, 3); - lcd.print ("Dec: 000 86 Exit"); - - // Cursor - LCD_Col_Pos = 4; // posicion de cursor - LCD_Row_Pos = 3; // posicion e cursor - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Cursores - Cursor_Conf[0][4] = 1; // Bin - Cursor_Conf[3][4] = 1; // Dec - Cursor_Conf[3][15] = 1; // Exit - - //Navegacion: - calc: - GUI_Navegar(0, 0); - - // Acciones - // Exit - if (LCD_Col_Pos == 15 && LCD_Row_Pos == 3) - { - GUI_Control_Options(); - } - - // Binario a decimal - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 0) - { - // boton de centro para salir - // boton de lados para navegar - // boton arriba abajo para cambiar valor - byte cursor = 5; // posicion de cursor - int boton_retardo = 250; // retardo de boton para estabilidad - byte calcular = 0; // calcular binario a decimal - byte calcular_val = 0; // valor a meter a la matriz para calcular - lcd.blink(); - lcd.setCursor (5, 0); - - while (digitalRead(Boton_Center) == HIGH) // salida - { - if (digitalRead(Boton_Right) == LOW) - { - delay(boton_retardo); // esperar a estabilidad - cursor = cursor + 1; - if (cursor > 13) - { - cursor = 5; // regresar al principio - } - lcd.setCursor (cursor, 0); - } - - if (digitalRead(Boton_Left) == LOW) - { - delay(boton_retardo); // esperar a estabilidad - cursor = cursor - 1; - if (cursor < 5) - { - cursor = 13; // regresar al final - } - lcd.setCursor (cursor, 0); - } - - if (digitalRead(Boton_Up) == LOW) - { - delay(boton_retardo); // esperar a estabilidad - lcd.print ("I"); - lcd.setCursor (cursor, 0); - calcular_val = 1; - calcular = 1; - } - - if (digitalRead(Boton_Down) == LOW) - { - delay(boton_retardo); // esperar a estabilidad - lcd.print ("O"); - lcd.setCursor (cursor, 0); - calcular_val = 0; - calcular = 1; - } - - if (calcular == 1) - { - calcular = 0; - // agregar a la matriz el valor nuevo - switch (cursor) - { - case 5: // 1 - valor_Bin [1] = calcular_val; - break; - - case 6: // 2 - valor_Bin [2] = calcular_val; - break; - - case 7: // 4 - valor_Bin [3] = calcular_val; - break; - - case 8: // 8 - valor_Bin [4] = calcular_val; - break; - - case 9: // 16 - valor_Bin [5] = calcular_val; - break; - - case 10: // 32 - valor_Bin [6] = calcular_val; - break; - - case 11: // 64 - valor_Bin [7] = calcular_val; - break; - - case 12: // 128 - valor_Bin [8] = calcular_val; - break; - - case 13: // 256 - valor_Bin [9] = calcular_val; - break; - - } - - // calcular valor de binario a decimal - valor = 0; - if (valor_Bin [1] == 1) - { - valor = valor + 1; - } - - if (valor_Bin [2] == 1) - { - valor = valor + 2; - } - - if (valor_Bin [3] == 1) - { - - valor = valor + 4; - } - - if (valor_Bin [4] == 1) - { - valor = valor + 8; - } - - if (valor_Bin [5] == 1) - { - valor = valor + 16; - } - - if (valor_Bin [6] == 1) - { - valor = valor + 32; - } - - if (valor_Bin [7] == 1) - { - valor = valor + 64; - } - - if (valor_Bin [8] == 1) - { - valor = valor + 128; - } - - if (valor_Bin [9] == 1) - { - valor = valor + 256; - } - - // escribir el valor en decimal - Numerico_Write (valor, 5, 3); - lcd.setCursor (cursor, 0); - } - } - delay(200); // esperar a estabilidad - lcd.noBlink(); - goto calc; - } - // Decimal a binario - if (LCD_Col_Pos == 4 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 5; - Numerico_Calc (0); - - if (Num_Val == 712) - { - Encoder_Read (5, 3, 0, 511, 8); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - } - - if (Num_Val > 511) - { - Num_Val = 511; // corregir valor en pantalla - lcd.setCursor (5, 3); - lcd.print ("511"); - } - - valor = Num_Val; - - // escribir 00000000 en el valor binario para borrar el anterior - lcd.setCursor (5, 0); - lcd.print ("OOOOOOOOO"); - lcd.setCursor (5, 0); - - // calcular binario - valor_temp = valor; - for (byte pos = 9; pos >= 1; pos --) - { - valor_resto = valor_temp % 2; - valor_temp = valor_temp / 2; - valor_Bin [pos] = valor_resto; - if (valor_resto == 0) - { - lcd.print ("O"); - } - else - { - lcd.print ("I"); - } - } - goto calc; - } -} - -void GUI_Config() -{ - Inicio: - - byte Back_Light_Value = EEPROM.read(BackLight_Add); - byte Contrast_Value = EEPROM.read(Contrast_Add); - byte Bank_Init_Value = EEPROM.read(Bank_Init_Add); - byte Key_Light_Value = EEPROM.read(Key_Light_Add); - - // GUI - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print (" KeyLight:"); - Numerico_Write(Key_Light_Value, 11, 0); - lcd.setCursor (15, 2); - lcd.print ("About"); - lcd.setCursor (0, 1); - lcd.print ("BackLight:"); - Numerico_Write(Back_Light_Value, 11, 1); - lcd.setCursor (1, 2); - lcd.print ("Contrast:"); - Numerico_Write(Contrast_Value, 11, 2); - lcd.setCursor (15, 3); - lcd.print ("Exit"); - - // Bank - lcd.setCursor (1, 3); - lcd.print ("BankInit:"); - - if (Bank_Init_Value > 8 || Bank_Init_Value < 1) - { - lcd.setCursor (11, 3); - lcd.print ("---"); - } - else - { - Numerico_Write(Bank_Init_Value, 11, 3); - } - - // Cursor - LCD_Col_Pos = 10; // posicion de cursor - LCD_Row_Pos = 1; // posicion de cursor - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Cursores - Cursor_Conf[1][10] = 1; // Back Light Value - Cursor_Conf[2][10] = 1; // Contrast Value - Cursor_Conf[3][10] = 1; // Bank init Value - Cursor_Conf[0][10] = 1; // Key Light Value - Cursor_Conf[3][14] = 1; // Exit - Cursor_Conf[2][14] = 1; // About - Navegacion: - GUI_Navegar(0, 0); - - // Acciones - //Back Light Value - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 1) - { - Num_Row_Pos = 1; - Num_Col_Pos = 11; - Numerico_Calc (1); - - if (Num_Val == 712) - { - digitalWrite(Boton_Array_3, LOW); // lectura linea 3 - while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Boton_Center) == HIGH) // enter y center para paro - { - Encoder_Read (11, 1, 0, 255, 3); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - goto salida; - - } - digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 - delay(300); // retraso para center - } - - if (Num_Val > 255) - { - Num_Val = 255; - Numerico_Write (255, 11, 1); - } - analogWrite(Back_Light_PWM, Num_Val); - -salida: - - // mecanismo para on off Enable - if (Num_Val == 0) - { - Light_On_Off = 0; - } - - if (Num_Val > 0) - { - Light_On_Off = 1; - } - - EEPROM.write(BackLight_Add, Num_Val); // guardar valor nuevo - goto Navegacion; - } - - //Key Light Value - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 0) - { - Num_Row_Pos = 0; - Num_Col_Pos = 11; - Numerico_Calc (1); - - if (Num_Val == 712) - { - digitalWrite(Boton_Array_3, LOW); // lectura linea 3 - while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Boton_Center) == HIGH) // enter y center para paro - { - Encoder_Read (11, 0, 0, 255, 4); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - goto salida_key; - } - digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 - delay(300); // retraso para center - goto salida_key; - } - - if (Num_Val > 255) - { - Num_Val = 255; - Numerico_Write (255, 11, 0); - } - - analogWrite(Key_Light_PWM, Num_Val); - -salida_key: - - // mecanismo para on off Enable - if (Num_Val == 0) - { - Light_On_Off = 0; - } - - if (Num_Val > 0) - { - Light_On_Off = 1; - } - - EEPROM.write(Key_Light_Add, Num_Val); // guardar valor nuevo - goto Navegacion; - } - - //Contrast Value - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 2) - { - Num_Row_Pos = 2; - Num_Col_Pos = 11; - Numerico_Calc (1); - - // encoder - if (Num_Val == 712) - { - Encoder_Read (11, 2, 0, 255, 2); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - goto salir; - } - - // teclado - if (Num_Val > 255) - { - Num_Val = 255; - Numerico_Write (255, 11, 2); - } - - if (Num_Val < 150) - { - Num_Val = 150; // limite menor de contraste LCD - Numerico_Write (150, 11, 2); - } - - analogWrite(Contrast_PWM, Num_Val); - -salir: - - EEPROM.write(Contrast_Add, Num_Val); // guardar valor nuevo - goto Navegacion; - } - - //Bank init Value - if (LCD_Col_Pos == 10 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 11; - Numerico_Calc (1); - if (Num_Val == 712) - { - Encoder_Read (11, 3, 0, 8, 7); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - if (EEPROM.read(Bank_Init_Add) == 0) - { - lcd.setCursor (11, 3); - lcd.print("---"); - } - goto Navegacion; - } - - if (Num_Val > 8) - { - Num_Val = 8; - Numerico_Write (8, 11, 3); - } - - if (Num_Val == 0) - { - lcd.setCursor (11, 3); - lcd.print("---"); - } - - EEPROM.write(Bank_Init_Add, Num_Val); // guardar valor nuevo - goto Navegacion; - } - // Exit - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) - { - GUI_Control_Options(); - goto Navegacion; - } - - // About - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - GUI_About(); - GUI_Licence(); - goto Inicio; - } - - goto Navegacion; -} - -void GUI_Control_Multiply() -{ - int First_Channel = 1; - long Multiply = 0; - long Quantity = 0; - int Value = 255; - -iniciar: - - // LCD - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print ("b Value"); - lcd.setCursor (1, 0); - - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } - - lcd.setCursor (0, 1); - lcd.print ("First CH Exit"); - lcd.setCursor (0, 2); - lcd.print ("Multiply Memory"); - lcd.setCursor (0, 3); - lcd.print ("Quantity Apply"); - Numerico_Write (Value, 9, 0); - Numerico_Write (First_Channel, 9, 1); - Numerico_Write (Multiply, 9, 2); - Numerico_Write (Quantity, 9, 3); - - // Cursor - LCD_Col_Pos = 8; // posicion de cursor - LCD_Row_Pos = 0; - -Siguiente: - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][8] = 1; // first Channel - Cursor_Conf[3][8] = 1; // quantity - Cursor_Conf[2][8] = 1; // Multiply - Cursor_Conf[1][13] = 1; // control - Cursor_Conf[2][13] = 1; // Memory - Cursor_Conf[3][13] = 1; // apply - Cursor_Conf[0][8] = 1; // value - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Exit - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 1) - { - GUI_Control_Options(); - } - - // Memory - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 2) - { - GUI_Memory(); - goto iniciar; - } - - // Apply - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 3) - { - // Validar datos - long valid = Multiply * Quantity; - - if (valid > 512) // si no es valido - { - lcd.setCursor(13, 0); - lcd.print("Error! "); - goto Siguiente; - } - - // calcular - lcd.setCursor(13, 0); - lcd.print(" "); - lcd.setCursor(14, 3); - lcd.print("Calc.."); - long canal; - - for (long conteo = 1; conteo <= Quantity; conteo++) - { - if (conteo == 1) - { - canal = First_Channel; - } - - if (conteo != 1) - { - canal = canal + Multiply; - } - - if (canal > 512) - { - canal = canal - Multiply; - conteo = Quantity; - } - - lcd.setCursor(17, 0); - lcd.print(canal); - delay (5); - ArduinoDmx0.TxBuffer[canal - 1] = Value; - DMX_Values[canal] = Value; - } - - lcd.setCursor(13, 0); - lcd.print("Ok!"); - lcd.setCursor(14, 3); - lcd.print("Apply "); - goto Siguiente; - } - // First Channel - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) - { - Num_Row_Pos = 1; - Num_Col_Pos = 9; - Num_Val = First_Channel; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - First_Channel = Num_Val; - - if (First_Channel == 0) - { - First_Channel = 1; - Numerico_Write (First_Channel, 9, 1); - } - - if (First_Channel > 512) - { - First_Channel = 512; - Numerico_Write (First_Channel, 9, 1); - } - } - // Multiply - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - Num_Row_Pos = 2; - Num_Col_Pos = 9; - Num_Val = Multiply; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Multiply = Num_Val; - if (Multiply == 0) - { - Multiply = 1; - Numerico_Write (Multiply, 9, 2); - } - - if (Multiply > 512) - { - Multiply = 512; - Numerico_Write (Multiply, 9, 2); - } - } - // Quantity - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 9; - Num_Val = Quantity; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Quantity = Num_Val; - - if (Quantity == 0) - { - Quantity = 1; - Numerico_Write (Quantity, 9, 3); - } - - if (Quantity > 512) - { - Quantity = 512; - Numerico_Write (Quantity, 9, 3); - } - } - - // Value - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 0) - { - Num_Row_Pos = 0; - Num_Col_Pos = 9; - Num_Val = Value; // para dejar el numero que estaba si no se cambia - Numerico_Calc(1); - Value = Num_Val; - - if (Value > 255) - { - Value = 255; - Numerico_Write (Value, 9, 0); - } - } - goto Siguiente; -} - -void GUI_Control_Chaser() -{ - long Delay = 1; - long First = 1; - long Final = 0; - - // LCD - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print ("ChaserCH ---"); - lcd.setCursor (3, 1); - lcd.print ("Delay x10=mS"); - lcd.setCursor (0, 2); - lcd.print ("First CH Exit"); - lcd.setCursor (0, 3); - lcd.print ("Final CH Start"); - Numerico_Write (Delay, 9, 1); - Numerico_Write (First, 9, 2); - Numerico_Write (Final, 9, 3); - - // Cursor - LCD_Col_Pos = 8; // posicion de cursor - LCD_Row_Pos = 1; - -Siguiente: - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Acciones - Cursor_Conf[1][8] = 1; // Delay - Cursor_Conf[2][8] = 1; // First - Cursor_Conf[3][8] = 1; // Final - Cursor_Conf[2][14] = 1; // control - Cursor_Conf[3][14] = 1; // Start - - // navegar - GUI_Navegar(0, 0); - - // Acciones - // Control - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) - { - // regresar el universo a su lugar - for (int Canal = 1; Canal <= 512; Canal ++) - { - ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; - } - GUI_Control_Options(); - } - - // Start - if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) - { - long ciclo_longitud = 1300; // numero multiplicador aprox para 1 seg - long ciclo = 0; - long Delay_Cont = 0; - int canal = First; - lcd.setCursor(15, 3); - lcd.print("Stop "); - lcd.blink(); - - // borrar canales previos - for (int Canales = 0; Canales <= 512; Canales ++) - { - ArduinoDmx0.TxBuffer[Canales] = 0; // salida a DMX - } - - while (digitalRead(Boton_Center) == HIGH) // lectura del boton centro - { - ciclo = ciclo + 1; - if (ciclo == ciclo_longitud) - { - Delay_Cont = Delay_Cont + 1; - if (Delay_Cont == Delay) + delay(boton_retardo); // esperar a estabilidad + cursor = cursor - 1; + if (cursor < 5) { - if (canal > Final) - { - canal = First; - } - Numerico_Write (canal, 9, 0); - lcd.setCursor(19, 3); - - // apagar lo anterior - for (long contar = First; contar <= Final; contar ++) - { - ArduinoDmx0.TxBuffer[contar - 1] = 0; - } - // encender el siguiente - ArduinoDmx0.TxBuffer[canal - 1] = 255; - Delay_Cont = 0; - canal = canal + 1; + cursor = 13; // regresar al final } - ciclo = 0; - } + lcd.setCursor (cursor, 0); } - lcd.noBlink(); - lcd.setCursor(15, 3); - lcd.print("Start"); - delay (300); // evita que le gane la descarga del capacitor - goto Siguiente; - } - - // Delay - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) - { - Num_Row_Pos = 1; - Num_Col_Pos = 9; - Num_Val = Delay; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Delay = Num_Val; - } - - // First - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - Num_Row_Pos = 2; - Num_Col_Pos = 9; - Num_Val = First; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - First = Num_Val; - if (First == 0) + if (digitalRead(Boton_Up) == LOW) { - First = 1; - Numerico_Write (First, 9, 2); + delay(boton_retardo); // esperar a estabilidad + lcd.print ("I"); + lcd.setCursor (cursor, 0); + calcular_val = 1; + calcular = 1; } - if (First > 512) + if (digitalRead(Boton_Down) == LOW) { - First = 512; - Numerico_Write (First, 9, 2); + delay(boton_retardo); // esperar a estabilidad + lcd.print ("O"); + lcd.setCursor (cursor, 0); + calcular_val = 0; + calcular = 1; } - } - - // Final - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) - { - Num_Row_Pos = 3; - Num_Col_Pos = 9; - Num_Val = Final; // para dejar el numero que estaba si no se cambia - Numerico_Calc(0); - Final = Num_Val; - if (Final == 0) + if (calcular == 1) { - Final = 1; - Numerico_Write (Final, 9, 3); - } + calcular = 0; + // agregar a la matriz el valor nuevo + switch (cursor) + { + case 5: // 1 + valor_Bin [1] = calcular_val; + break; - if (Final > 512) - { - Final = 512; - Numerico_Write (Final, 9, 3); - } - } - goto Siguiente; -} + case 6: // 2 + valor_Bin [2] = calcular_val; + break; -void Numerico_Write (int valor, int col, int row) -{ - // posicionar el valor en los campos 000 + case 7: // 4 + valor_Bin [3] = calcular_val; + break; - lcd.setCursor (col, row); - lcd.print ("000"); + case 8: // 8 + valor_Bin [4] = calcular_val; + break; - if (valor < 10) - { - lcd.setCursor (col + 2, row); - } + case 9: // 16 + valor_Bin [5] = calcular_val; + break; - if (valor > 9 && valor < 100) - { - lcd.setCursor (col + 1, row); - } + case 10: // 32 + valor_Bin [6] = calcular_val; + break; - if (valor > 99) - { - lcd.setCursor (col, row); - } + case 11: // 64 + valor_Bin [7] = calcular_val; + break; - lcd.print (valor); -} + case 12: // 128 + valor_Bin [8] = calcular_val; + break; -void GUI_Control_Unit() -{ + case 13: // 256 + valor_Bin [9] = calcular_val; + break; -Inicio: + } - Canal_Actual = 1; + // calcular valor de binario a decimal + valor = 0; + if (valor_Bin [1] == 1) + { + valor = valor + 1; + } - // GUI - lcd.clear (); - lcd.setCursor (0, 0); - lcd.print ("Unitary Control: b"); + if (valor_Bin [2] == 1) + { + valor = valor + 2; + } - if (Universo_Actual == 0) - { - lcd.print("-"); - } - else - { - lcd.print(Universo_Actual); - } + if (valor_Bin [3] == 1) + { + + valor = valor + 4; + } - lcd.setCursor (14, 2); - lcd.print ("Exit"); - lcd.setCursor (14, 3); - lcd.print ("Memory"); - lcd.setCursor (0, 2); - lcd.print ("Channel: 001"); - lcd.setCursor (2, 3); - lcd.print ("Value:"); - Numerico_Write(DMX_Values[1], 9, 3); - lcd.setCursor (0, 1); - lcd.print ("c002=v"); - Numerico_Write(DMX_Values[2], 6, 1); - lcd.setCursor (11, 1); - lcd.print ("c003=v"); - Numerico_Write(DMX_Values[3], 17, 1); - - // Cursor - LCD_Col_Pos = 8; // posicion de cursor - LCD_Row_Pos = 2; // posicion e cursor - - // configuracion de cursor - Cursor_Conf_Clear(); // limpiar array - - // Cursores - Cursor_Conf[2][8] = 1; // Channel - Cursor_Conf[3][8] = 1; // Value - Cursor_Conf[2][13] = 1; // Control - Cursor_Conf[3][13] = 1; // Memory - - // navegar - -Navegacion: - - GUI_Navegar(0, 0); - - // Acciones - //Channel - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) - { - Numerico_Write(Canal_Actual, 9, 2); - Num_Row_Pos = 2; - Num_Col_Pos = 9; - Num_Val = Canal_Actual; // para dejar el numero que estaba si no se cambia - Numerico_Calc (0); + if (valor_Bin [4] == 1) + { + valor = valor + 8; + } - if (Num_Val > 512) - { - Num_Val = 512; - Numerico_Write (512, 9, 2); - } + if (valor_Bin [5] == 1) + { + valor = valor + 16; + } - if (Num_Val < 1) - { - Num_Val = 1; - Numerico_Write (1, 9, 2); - } + if (valor_Bin [6] == 1) + { + valor = valor + 32; + } - // mostrar valor actual del canal - Canal_Actual = Num_Val; - Numerico_Write(DMX_Values[Canal_Actual], 9, 3); + if (valor_Bin [7] == 1) + { + valor = valor + 64; + } - // mostrar anterior y siguiente - if (Canal_Actual == 1) - { - Numerico_Write(2, 1, 1); - Numerico_Write(DMX_Values[2], 6, 1); - Numerico_Write(3, 12, 1); - Numerico_Write(DMX_Values[3], 17, 1); - } + if (valor_Bin [8] == 1) + { + valor = valor + 128; + } - if (Canal_Actual == 512) - { - Numerico_Write(510, 1, 1); - Numerico_Write(DMX_Values[510], 6, 1); - Numerico_Write(511, 12, 1); - Numerico_Write(DMX_Values[511], 17, 1); - } + if (valor_Bin [9] == 1) + { + valor = valor + 256; + } - if (Canal_Actual > 1 && Canal_Actual < 512) - { - Numerico_Write(Canal_Actual - 1, 1, 1); - Numerico_Write(DMX_Values[Canal_Actual - 1], 6, 1); - Numerico_Write(Canal_Actual + 1, 12, 1); - Numerico_Write(DMX_Values[Canal_Actual + 1], 17, 1); + // escribir el valor en decimal + Numerico_Write (valor, 5, 3); + lcd.setCursor (cursor, 0); } + } + delay(200); // esperar a estabilidad + lcd.noBlink(); + goto calc; } - - // Value - if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + // Decimal a binario + if (LCD_Col_Pos == 4 && LCD_Row_Pos == 3) { Num_Row_Pos = 3; - Num_Col_Pos = 9; - Num_Val = DMX_Values[Canal_Actual]; // para dejar el numero que estaba si no se cambia - Numerico_Calc (1); - - if (Num_Val == 612) // ubicar - { - Ubicar(); - } - - if (Num_Val == 712) // analogo - { - Encoder_Read(9, 3, 0, 255, 1); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) - goto Navegacion; - } - - if (Num_Val > 255) - { - Num_Val = 255; - Numerico_Write (255, 9, 3); - } - - // Escribr valor en dmx - ArduinoDmx0.TxBuffer[Canal_Actual - 1] = Num_Val; - DMX_Values[Canal_Actual] = Num_Val; - goto Navegacion; - } - - // Memory - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 3) - { - GUI_Memory(); - goto Inicio; - } - - // Control - if (LCD_Col_Pos == 13 && LCD_Row_Pos == 2) - { - GUI_Control_Options(); - } - - goto Navegacion; -} - -void Ubicar() -{ - digitalWrite(Boton_Array_4, LOW); - - while (digitalRead(Boton_Array_C) == HIGH && digitalRead(Boton_Center) == HIGH) - { - ArduinoDmx0.TxBuffer[Canal_Actual - 1] = 255; - Numerico_Write (255, Num_Col_Pos - 2, Num_Row_Pos); - delay (100); - ArduinoDmx0.TxBuffer[Canal_Actual - 1] = 0; - lcd.setCursor (Num_Col_Pos - 2, Num_Row_Pos); - lcd.print (" "); - delay (100); - } - - digitalWrite(Boton_Array_4, HIGH); - delay(300); // rebote de boton enter - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); -} - -void Numerico_Calc(byte value) -{ - // escritura del numero desde el teclado numerico si value es 1 entra opcion de A 255 y B 0 - - int Num_Val_Temp_1 = 0; - int Num_Val_Temp_2 = 0; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - lcd.print("___"); - lcd.blink(); // mostrar cursor - - //Num_Val = 0; - Num_Col_Pos = Num_Col_Pos + 2; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - - // primer numero - Numerico_Read(); // leer boton - if (Boton_Calc <= 9) - { - lcd.print (Boton_Calc); // escribir valor calculado - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - Num_Val = Boton_Calc; // valor calculado - Num_Val_Temp_1 = Boton_Calc; // valor temporal para el acarreo - } + Num_Col_Pos = 5; + Numerico_Calc (0); - if (Boton_Calc == 14) // enter - { - goto Salida; // num val = 0 - } + if (Num_Val == 712) + { + Encoder_Read (5, 3, 0, 511, 8); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + } - if (value == 1) // si es un valor - { - if (Boton_Calc == 10) // 255 + if (Num_Val > 511) { - Num_Val = 255; - goto Salida; + Num_Val = 511; // corregir valor en pantalla + lcd.setCursor (5, 3); + lcd.print ("511"); } - if (Boton_Calc == 11) // 000 - { - Num_Val = 0; - goto Salida; - } + valor = Num_Val; - if (Boton_Calc == 12) // ubicar - { - Num_Val = 612; - goto Salida_Option; - } + // escribir 00000000 en el valor binario para borrar el anterior + lcd.setCursor (5, 0); + lcd.print ("OOOOOOOOO"); + lcd.setCursor (5, 0); - if (Boton_Calc == 13) // analogo + // calcular binario + valor_temp = valor; + for (byte pos = 9; pos >= 1; pos --) { - Num_Val = 712; - goto Salida_Option; + valor_resto = valor_temp % 2; + valor_temp = valor_temp / 2; + valor_Bin [pos] = valor_resto; + if (valor_resto == 0) + { + lcd.print ("O"); + } + else + { + lcd.print ("I"); + } } + goto calc; } - // segundo numero - Numerico_Read(); // leer boton - if (Boton_Calc == 14) // enter - { - Num_Val = Num_Val_Temp_1; - goto Salida; // num val = num val anterior - } - - if (value == 1) // si es un valor - { - if (Boton_Calc == 10) // 255 - { - Num_Val = 255; - goto Salida; - } - - if (Boton_Calc == 11) // 000 - { - Num_Val = 0; - goto Salida; - } +}*/ - if (Boton_Calc == 12) // ubicar - { - Num_Val = 612; - goto Salida_Option; - } +void GUI_Config() +{ + Inicio: - if (Boton_Calc == 13) // analogo - { - Num_Val = 712; - goto Salida_Option; - } - } + byte Back_Light_Value = EEPROM.read(BackLight_Add); + byte Contrast_Value = EEPROM.read(Contrast_Add); + byte Bank_Init_Value = EEPROM.read(Bank_Init_Add); + byte Key_Light_Value = EEPROM.read(Key_Light_Add); - if (Boton_Calc <= 9) - { - // recorrer numero ya impreso - Num_Col_Pos = Num_Col_Pos - 1; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - lcd.print (Num_Val_Temp_1); - - // dibujar numero nuevo - lcd.print (Boton_Calc); - Num_Val_Temp_2 = Boton_Calc; - Num_Col_Pos = Num_Col_Pos + 1; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - } + // GUI + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print (" KeyLight:"); + Numerico_Write(Key_Light_Value, 11, 0); + lcd.setCursor (15, 2); + lcd.print ("About"); + lcd.setCursor (0, 1); + lcd.print ("BackLight:"); + Numerico_Write(Back_Light_Value, 11, 1); + lcd.setCursor (1, 2); + lcd.print ("Contrast:"); + Numerico_Write(Contrast_Value, 11, 2); + lcd.setCursor (15, 3); + lcd.print ("Exit"); - // Tercer numero - Numerico_Read(); // leer boton - if (Boton_Calc == 14) // enter - { - Num_Val = (Num_Val_Temp_1 * 10) + Num_Val_Temp_2; - goto Salida; - } + // Bank + lcd.setCursor (1, 3); + lcd.print ("BankInit:"); - if (value == 1) // si es un valor - { - if (Boton_Calc == 10) // 255 - { - Num_Val = 255; - goto Salida; - } + if (Bank_Init_Value > 8 || Bank_Init_Value < 1) + { + lcd.setCursor (11, 3); + lcd.print ("---"); + } + else + { + Numerico_Write(Bank_Init_Value, 11, 3); + } - if (Boton_Calc == 11) // 000 - { - Num_Val = 0; - goto Salida; - } + // Cursor + LCD_Col_Pos = 10; // posicion de cursor + LCD_Row_Pos = 1; // posicion de cursor - if (Boton_Calc == 12) // ubicar - { - Num_Val = 612; - goto Salida_Option; - } + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array - if (Boton_Calc == 13) // analogo - { - Num_Val = 712; - goto Salida_Option; - } - } + // Cursores + Cursor_Conf[1][10] = 1; // Back Light Value + Cursor_Conf[2][10] = 1; // Contrast Value + Cursor_Conf[3][10] = 1; // Bank init Value + Cursor_Conf[0][10] = 1; // Key Light Value + Cursor_Conf[3][14] = 1; // Exit + Cursor_Conf[2][14] = 1; // About + Navegacion: + GUI_Navegar(0, 0); - if (Boton_Calc <= 9) - { - // recorrer numero ya impreso - Num_Col_Pos = Num_Col_Pos - 2; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - lcd.print (Num_Val_Temp_1); - lcd.print (Num_Val_Temp_2); - - // dibujar numero nuevo - Num_Col_Pos = Num_Col_Pos + 2; - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - lcd.print (Boton_Calc); - Num_Val = Boton_Calc + (Num_Val_Temp_1 * 100) + (Num_Val_Temp_2 * 10); - } + // Acciones + //Back Light Value + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 1) + { + Num_Row_Pos = 1; + Num_Col_Pos = 11; + Numerico_Calc (1); -Salida: + if (Num_Val == 712) + { + digitalWrite(Boton_Array_3, LOW); // lectura linea 3 + while (digitalRead(Boton_Array_D) == HIGH) //&& digitalRead(Boton_Center) == HIGH) // enter y center para paro + { + Encoder_Read (11, 1, 0, 255, 3); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + goto salida; + + } + digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 + delay(300); // retraso para center + } - lcd.noBlink(); + if (Num_Val > 255) + { + Num_Val = 255; + Numerico_Write (255, 11, 1); + } + analogWrite(Back_Light_PWM, Num_Val); - // pintar los ceros antes del numero - Numerico_Write (Num_Val, Num_Col_Pos - 2, Num_Row_Pos); - Num_Col_Pos = Num_Col_Pos - 4; + salida: - // regresar el cursor a su ligar - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + // mecanismo para on off Enable + if (Num_Val == 0) + { + Light_On_Off = 0; + } -Salida_Option: + if (Num_Val > 0) + { + Light_On_Off = 1; + } - lcd.noBlink(); - lcd.setCursor (Num_Col_Pos, Num_Row_Pos); - delay(300); // rebote de boton -} + EEPROM.write(BackLight_Add, Num_Val); // guardar valor nuevo + goto Navegacion; + } -void Numerico_Read() -{ - long Num_Barrido_Time = 5; // tiempo entre barrido de keys - Boton_Calc = 17; // limpiar valor para lectura + //Key Light Value + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 0) + { + Num_Row_Pos = 0; + Num_Col_Pos = 11; + Numerico_Calc (1); + + if (Num_Val == 712) + { + digitalWrite(Boton_Array_3, LOW); // lectura linea 3 + while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Enc_Center) == HIGH) // enter y center para paro + { + Encoder_Read (11, 0, 0, 255, 4); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + goto salida_key; + } + digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 + delay(300); // retraso para center + goto salida_key; + } - while (Boton_Calc == 17) // valor calculado # E * F, 17 sin valor calculado - { - // Barrido - // Linea 1 - digitalWrite(Boton_Array_1, LOW); // lectura linea 1 + if (Num_Val > 255) + { + Num_Val = 255; + Numerico_Write (255, 11, 0); + } - // Lectura 1A = 1 - if (digitalRead(Boton_Array_A) == LOW) - { - Boton_Calc = 1; - delay(Boton_Delay_Teclado); - } + analogWrite(Key_Light_PWM, Num_Val); - delay(Num_Barrido_Time); + salida_key: - // Lectura 1B = 6 - if (digitalRead(Boton_Array_B) == LOW) - { - Boton_Calc = 4; - delay(Boton_Delay_Teclado); - } + // mecanismo para on off Enable + if (Num_Val == 0) + { + Light_On_Off = 0; + } - delay(Num_Barrido_Time); + if (Num_Val > 0) + { + Light_On_Off = 1; + } - // Lectura 1C = 7 - if (digitalRead(Boton_Array_C) == LOW) - { - Boton_Calc = 7; - delay(Boton_Delay_Teclado); - } + EEPROM.write(Key_Light_Add, Num_Val); // guardar valor nuevo + goto Navegacion; + } - delay(Num_Barrido_Time); + //Contrast Value + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 2) + { + Num_Row_Pos = 2; + Num_Col_Pos = 11; + Numerico_Calc (1); - // Lectura 1D = * = 15 - if (digitalRead(Boton_Array_D) == LOW) - { - Boton_Calc = 15; - delay(Boton_Delay_Teclado); - } + // encoder + if (Num_Val == 712) + { + Encoder_Read (11, 2, 0, 255, 2); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + goto salir; + } - delay(Num_Barrido_Time); - digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 + // teclado + if (Num_Val > 255) + { + Num_Val = 255; + Numerico_Write (255, 11, 2); + } - // Linea 2 - digitalWrite(Boton_Array_2, LOW); // lectura linea 2 + if (Num_Val < 150) + { + Num_Val = 150; // limite menor de contraste LCD + Numerico_Write (150, 11, 2); + } - // Lectura 2A = 2 - if (digitalRead(Boton_Array_A) == LOW) - { - Boton_Calc = 2; - delay(Boton_Delay_Teclado); - } + analogWrite(Contrast_PWM, Num_Val); - delay(Num_Barrido_Time); + salir: - // Lectura 2B = 5 - if (digitalRead(Boton_Array_B) == LOW) - { - Boton_Calc = 5; - delay(Boton_Delay_Teclado); - } + EEPROM.write(Contrast_Add, Num_Val); // guardar valor nuevo + goto Navegacion; + } - delay(Num_Barrido_Time); + //Bank init Value + if (LCD_Col_Pos == 10 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 11; + Numerico_Calc (1); + if (Num_Val == 712) + { + Encoder_Read (11, 3, 0, 8, 7); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + if (EEPROM.read(Bank_Init_Add) == 0) + { + lcd.setCursor (11, 3); + lcd.print("---"); + } + goto Navegacion; + } - // Lectura 2C = 8 - if (digitalRead(Boton_Array_C) == LOW) - { - Boton_Calc = 8; - delay(Boton_Delay_Teclado); - } + if (Num_Val > 8) + { + Num_Val = 8; + Numerico_Write (8, 11, 3); + } - delay(Num_Barrido_Time); + if (Num_Val == 0) + { + lcd.setCursor (11, 3); + lcd.print("---"); + } - // Lectura 2D = 0 - if (digitalRead(Boton_Array_D) == LOW) - { - Boton_Calc = 0; - delay(Boton_Delay_Teclado); - } + EEPROM.write(Bank_Init_Add, Num_Val); // guardar valor nuevo + goto Navegacion; + } + // Exit + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) + { + GUI_Control_Options(); + goto Navegacion; + } - delay(Num_Barrido_Time); - digitalWrite(Boton_Array_2, HIGH); // lectura linea 2 + // About + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + GUI_About(); + GUI_Licence(); + goto Inicio; + } - // Linea 3 - digitalWrite(Boton_Array_3, LOW); // lectura linea 3 + goto Navegacion; +} - // Lectura 3A = 3 - if (digitalRead(Boton_Array_A) == LOW) - { - Boton_Calc = 3; - delay(Boton_Delay_Teclado); - } +void GUI_Control_Multiply() +{ + int First_Channel = 1; + long Multiply = 0; + long Quantity = 0; + int Value = 255; + + iniciar: + + // LCD + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print ("b Value"); + lcd.setCursor (1, 0); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + lcd.setCursor (0, 1); + lcd.print ("First CH Exit"); + lcd.setCursor (0, 2); + lcd.print ("Multiply Memory"); + lcd.setCursor (0, 3); + lcd.print ("Quantity Apply"); + Numerico_Write (Value, 9, 0); + Numerico_Write (First_Channel, 9, 1); + Numerico_Write (Multiply, 9, 2); + Numerico_Write (Quantity, 9, 3); + + // Cursor + LCD_Col_Pos = 8; // posicion de cursor + LCD_Row_Pos = 0; + + Siguiente: + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][8] = 1; // first Channel + Cursor_Conf[3][8] = 1; // quantity + Cursor_Conf[2][8] = 1; // Multiply + Cursor_Conf[1][13] = 1; // control + Cursor_Conf[2][13] = 1; // Memory + Cursor_Conf[3][13] = 1; // apply + Cursor_Conf[0][8] = 1; // value + + // navegar + GUI_Navegar(0, 0); - delay(Num_Barrido_Time); + // Acciones + // Exit + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 1) + { + GUI_Control_Options(); + } + + // Memory + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 2) + { + GUI_Memory(); + goto iniciar; + } + + // Apply + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 3) + { + // Validar datos + long valid = Multiply * Quantity; + + if (valid > 512) // si no es valido + { + lcd.setCursor(13, 0); + lcd.print("Error! "); + goto Siguiente; + } + + // calcular + lcd.setCursor(13, 0); + lcd.print(" "); + lcd.setCursor(14, 3); + lcd.print("Calc.."); + long canal; + + for (long conteo = 1; conteo <= Quantity; conteo++) + { + if (conteo == 1) + { + canal = First_Channel; + } + + if (conteo != 1) + { + canal = canal + Multiply; + } + + if (canal > 512) + { + canal = canal - Multiply; + conteo = Quantity; + } + + lcd.setCursor(17, 0); + lcd.print(canal); + delay (5); + ArduinoDmx0.TxBuffer[canal - 1] = Value; + DMX_Values[canal] = Value; + } + + lcd.setCursor(13, 0); + lcd.print("Ok!"); + lcd.setCursor(14, 3); + lcd.print("Apply "); + goto Siguiente; + } + + // First Channel + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) + { + Num_Row_Pos = 1; + Num_Col_Pos = 9; + Num_Val = First_Channel; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + First_Channel = Num_Val; + + if (First_Channel == 0) + { + First_Channel = 1; + Numerico_Write (First_Channel, 9, 1); + } + + if (First_Channel > 512) + { + First_Channel = 512; + Numerico_Write (First_Channel, 9, 1); + } + } + + // Multiply + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + Num_Row_Pos = 2; + Num_Col_Pos = 9; + Num_Val = Multiply; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Multiply = Num_Val; + if (Multiply == 0) + { + Multiply = 1; + Numerico_Write (Multiply, 9, 2); + } + + if (Multiply > 512) + { + Multiply = 512; + Numerico_Write (Multiply, 9, 2); + } + } + + // Quantity + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 9; + Num_Val = Quantity; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Quantity = Num_Val; + + if (Quantity == 0) + { + Quantity = 1; + Numerico_Write (Quantity, 9, 3); + } + + if (Quantity > 512) + { + Quantity = 512; + Numerico_Write (Quantity, 9, 3); + } + } + + // Value + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 0) + { + Num_Row_Pos = 0; + Num_Col_Pos = 9; + Num_Val = Value; // para dejar el numero que estaba si no se cambia + Numerico_Calc(1); + Value = Num_Val; + + if (Value > 255) + { + Value = 255; + Numerico_Write (Value, 9, 0); + } + } + + goto Siguiente; +} - // Lectura 3B = 4 - if (digitalRead(Boton_Array_B) == LOW) - { - Boton_Calc = 6; - delay(Boton_Delay_Teclado); - } +void GUI_Control_Chaser() +{ + long Delay = 1; + long First = 1; + long Final = 0; + + // LCD + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print ("ChaserCH ---"); + lcd.setCursor (3, 1); + lcd.print ("Delay x10=mS"); + lcd.setCursor (0, 2); + lcd.print ("First CH Exit"); + lcd.setCursor (0, 3); + lcd.print ("Final CH Start"); + Numerico_Write (Delay, 9, 1); + Numerico_Write (First, 9, 2); + Numerico_Write (Final, 9, 3); + + // Cursor + LCD_Col_Pos = 8; // posicion de cursor + LCD_Row_Pos = 1; + + Siguiente: + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Acciones + Cursor_Conf[1][8] = 1; // Delay + Cursor_Conf[2][8] = 1; // First + Cursor_Conf[3][8] = 1; // Final + Cursor_Conf[2][14] = 1; // control + Cursor_Conf[3][14] = 1; // Start + + // navegar + GUI_Navegar(0, 0); - delay(Num_Barrido_Time); + // Acciones + // Control + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 2) + { + // regresar el universo a su lugar + for (int Canal = 1; Canal <= 512; Canal ++) + { + ArduinoDmx0.TxBuffer[Canal - 1] = DMX_Values[Canal]; + } + GUI_Control_Options(); + } + + // Start + if (LCD_Col_Pos == 14 && LCD_Row_Pos == 3) + { + long ciclo_longitud = 1300; // numero multiplicador aprox para 1 seg + long ciclo = 0; + long Delay_Cont = 0; + int canal = First; + lcd.setCursor(15, 3); + lcd.print("Stop "); + lcd.blink(); + + // borrar canales previos + for (int Canales = 0; Canales <= 512; Canales ++) + { + ArduinoDmx0.TxBuffer[Canales] = 0; // salida a DMX + } + + while (digitalRead(Enc_Center) == HIGH) // lectura del boton centro + { + ciclo = ciclo + 1; + if (ciclo == ciclo_longitud) + { + Delay_Cont = Delay_Cont + 1; + if (Delay_Cont == Delay) + { + if (canal > Final) + { + canal = First; + } + Numerico_Write (canal, 9, 0); + lcd.setCursor(19, 3); + + // apagar lo anterior + for (long contar = First; contar <= Final; contar ++) + { + ArduinoDmx0.TxBuffer[contar - 1] = 0; + } + // encender el siguiente + ArduinoDmx0.TxBuffer[canal - 1] = 255; + Delay_Cont = 0; + canal = canal + 1; + } + ciclo = 0; + } + } + lcd.noBlink(); + lcd.setCursor(15, 3); + lcd.print("Start"); + delay (300); // evita que le gane la descarga del capacitor + goto Siguiente; + } + + // Delay + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 1) + { + Num_Row_Pos = 1; + Num_Col_Pos = 9; + Num_Val = Delay; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Delay = Num_Val; + } + + // First + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + Num_Row_Pos = 2; + Num_Col_Pos = 9; + Num_Val = First; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + First = Num_Val; + + if (First == 0) + { + First = 1; + Numerico_Write (First, 9, 2); + } + + if (First > 512) + { + First = 512; + Numerico_Write (First, 9, 2); + } + } + + // Final + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 9; + Num_Val = Final; // para dejar el numero que estaba si no se cambia + Numerico_Calc(0); + Final = Num_Val; + + if (Final == 0) + { + Final = 1; + Numerico_Write (Final, 9, 3); + } + + if (Final > 512) + { + Final = 512; + Numerico_Write (Final, 9, 3); + } + } + goto Siguiente; +} - // Lectura 3C = 9 - if (digitalRead(Boton_Array_C) == LOW) - { - Boton_Calc = 9; - delay(Boton_Delay_Teclado); - } +void Numerico_Write (int valor, int col, int row) +{ + // posicionar el valor en los campos 000 - delay(Num_Barrido_Time); + lcd.setCursor (col, row); + lcd.print ("000"); - // Lectura 3D = 14 - if (digitalRead(Boton_Array_D) == LOW) - { - Boton_Calc = 14; - delay(Boton_Delay_Teclado); - } + if (valor < 10) + { + lcd.setCursor (col + 2, row); + } - delay(Num_Barrido_Time); - digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 + if (valor > 9 && valor < 100) + { + lcd.setCursor (col + 1, row); + } - // Linea 4 - digitalWrite(Boton_Array_4, LOW); // lectura linea 4 + if (valor > 99) + { + lcd.setCursor (col, row); + } - // Lectura 4A = 10 - if (digitalRead(Boton_Array_A) == LOW) - { - Boton_Calc = 10; - delay(Boton_Delay_Teclado); - } + lcd.print (valor); +} - delay(Num_Barrido_Time); +void GUI_Control_Unit() +{ - // Lectura 4B = 11 - if (digitalRead(Boton_Array_B) == LOW) - { - Boton_Calc = 11; - delay(Boton_Delay_Teclado); - } + Inicio: - delay(Num_Barrido_Time); + Canal_Actual = 1; + + // GUI + lcd.clear (); + lcd.setCursor (0, 0); + lcd.print ("Unitary Control: b"); + + if (Universo_Actual == 0) + { + lcd.print("-"); + } + else + { + lcd.print(Universo_Actual); + } + + lcd.setCursor (14, 2); + lcd.print ("Exit"); + lcd.setCursor (14, 3); + lcd.print ("Memory"); + lcd.setCursor (0, 2); + lcd.print ("Channel: 001"); + lcd.setCursor (2, 3); + lcd.print ("Value:"); + Numerico_Write(DMX_Values[1], 9, 3); + lcd.setCursor (0, 1); + lcd.print ("c002=v"); + Numerico_Write(DMX_Values[2], 6, 1); + lcd.setCursor (11, 1); + lcd.print ("c003=v"); + Numerico_Write(DMX_Values[3], 17, 1); + + // Cursor + LCD_Col_Pos = 8; // posicion de cursor + LCD_Row_Pos = 2; // posicion e cursor + + // configuracion de cursor + Cursor_Conf_Clear(); // limpiar array + + // Cursores + Cursor_Conf[2][8] = 1; // Channel + Cursor_Conf[3][8] = 1; // Value + Cursor_Conf[2][13] = 1; // Control + Cursor_Conf[3][13] = 1; // Memory + + // navegar + Navegacion: - // Lectura 4C = 12 - if (digitalRead(Boton_Array_C) == LOW) - { - Boton_Calc = 12; - delay(Boton_Delay_Teclado); - } + GUI_Navegar(0, 0); - delay(Num_Barrido_Time); + // Acciones + //Channel + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 2) + { + Numerico_Write(Canal_Actual, 9, 2); + Num_Row_Pos = 2; + Num_Col_Pos = 9; + Num_Val = Canal_Actual; // para dejar el numero que estaba si no se cambia + Numerico_Calc (0); + + if (Num_Val > 512) + { + Num_Val = 512; + Numerico_Write (512, 9, 2); + } + + if (Num_Val < 1) + { + Num_Val = 1; + Numerico_Write (1, 9, 2); + } + + // mostrar valor actual del canal + Canal_Actual = Num_Val; + Numerico_Write(DMX_Values[Canal_Actual], 9, 3); + + // mostrar anterior y siguiente + if (Canal_Actual == 1) + { + Numerico_Write(2, 1, 1); + Numerico_Write(DMX_Values[2], 6, 1); + Numerico_Write(3, 12, 1); + Numerico_Write(DMX_Values[3], 17, 1); + } + + if (Canal_Actual == 512) + { + Numerico_Write(510, 1, 1); + Numerico_Write(DMX_Values[510], 6, 1); + Numerico_Write(511, 12, 1); + Numerico_Write(DMX_Values[511], 17, 1); + } + + if (Canal_Actual > 1 && Canal_Actual < 512) + { + Numerico_Write(Canal_Actual - 1, 1, 1); + Numerico_Write(DMX_Values[Canal_Actual - 1], 6, 1); + Numerico_Write(Canal_Actual + 1, 12, 1); + Numerico_Write(DMX_Values[Canal_Actual + 1], 17, 1); + } + } + + // Value + if (LCD_Col_Pos == 8 && LCD_Row_Pos == 3) + { + Num_Row_Pos = 3; + Num_Col_Pos = 9; + Num_Val = DMX_Values[Canal_Actual]; // para dejar el numero que estaba si no se cambia + Numerico_Calc (1); + + if (Num_Val == 612) // ubicar + { + Ubicar(); + } + + if (Num_Val == 712) // analogo + { + Encoder_Read(9, 3, 0, 255, 1); // Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) + goto Navegacion; + } + + if (Num_Val > 255) + { + Num_Val = 255; + Numerico_Write (255, 9, 3); + } + + // Escribr valor en dmx + ArduinoDmx0.TxBuffer[Canal_Actual - 1] = Num_Val; + DMX_Values[Canal_Actual] = Num_Val; + goto Navegacion; + } + + // Memory + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 3) + { + GUI_Memory(); + goto Inicio; + } + + // Control + if (LCD_Col_Pos == 13 && LCD_Row_Pos == 2) + { + GUI_Control_Options(); + } + + goto Navegacion; +} - // Lectura 4D = 13 - if (digitalRead(Boton_Array_D) == LOW) - { - Boton_Calc = 13; - delay(Boton_Delay_Teclado); - } +void Ubicar() +{ + digitalWrite(Boton_Array_4, LOW); + + while (digitalRead(Boton_Array_C) == HIGH && digitalRead(Enc_Center) == HIGH) + { + ArduinoDmx0.TxBuffer[Canal_Actual - 1] = 255; + Numerico_Write (255, Num_Col_Pos - 2, Num_Row_Pos); + delay (100); + ArduinoDmx0.TxBuffer[Canal_Actual - 1] = 0; + lcd.setCursor (Num_Col_Pos - 2, Num_Row_Pos); + lcd.print (" "); + delay (100); + } + + digitalWrite(Boton_Array_4, HIGH); + delay(300); // rebote de boton enter + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); +} - delay(Num_Barrido_Time); - digitalWrite(Boton_Array_4, HIGH); // lectura linea 4 +void Numerico_Calc(byte value) +{ + // escritura del numero desde el teclado numerico si value es 1 entra opcion de A 255 y B 0 + + int Num_Val_Temp_1 = 0; + int Num_Val_Temp_2 = 0; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + lcd.print("___"); + lcd.blink(); // mostrar cursor + + //Num_Val = 0; + Num_Col_Pos = Num_Col_Pos + 2; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + + // primer numero + Numerico_Read(); // leer boton + if (Boton_Calc <= 9) + { + lcd.print (Boton_Calc); // escribir valor calculado + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + Num_Val = Boton_Calc; // valor calculado + Num_Val_Temp_1 = Boton_Calc; // valor temporal para el acarreo + } + + if (Boton_Calc == 14) // enter + { + goto Salida; // num val = 0 + } + + if (value == 1) // si es un valor + { + if (Boton_Calc == 10) // 255 + { + Num_Val = 255; + goto Salida; + } + + if (Boton_Calc == 11) // 000 + { + Num_Val = 0; + goto Salida; + } + + if (Boton_Calc == 12) // ubicar + { + Num_Val = 612; + goto Salida_Option; + } + + if (Boton_Calc == 13) // analogo + { + Num_Val = 712; + goto Salida_Option; + } + } + // segundo numero + Numerico_Read(); // leer boton + if (Boton_Calc == 14) // enter + { + Num_Val = Num_Val_Temp_1; + goto Salida; // num val = num val anterior + } + + if (value == 1) // si es un valor + { + if (Boton_Calc == 10) // 255 + { + Num_Val = 255; + goto Salida; + } + + if (Boton_Calc == 11) // 000 + { + Num_Val = 0; + goto Salida; + } + + if (Boton_Calc == 12) // ubicar + { + Num_Val = 612; + goto Salida_Option; + } + + if (Boton_Calc == 13) // analogo + { + Num_Val = 712; + goto Salida_Option; + } + } + + if (Boton_Calc <= 9) + { + // recorrer numero ya impreso + Num_Col_Pos = Num_Col_Pos - 1; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + lcd.print (Num_Val_Temp_1); + + // dibujar numero nuevo + lcd.print (Boton_Calc); + Num_Val_Temp_2 = Boton_Calc; + Num_Col_Pos = Num_Col_Pos + 1; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + } + + // Tercer numero + Numerico_Read(); // leer boton + if (Boton_Calc == 14) // enter + { + Num_Val = (Num_Val_Temp_1 * 10) + Num_Val_Temp_2; + goto Salida; + } + + if (value == 1) // si es un valor + { + if (Boton_Calc == 10) // 255 + { + Num_Val = 255; + goto Salida; + } + + if (Boton_Calc == 11) // 000 + { + Num_Val = 0; + goto Salida; + } + + if (Boton_Calc == 12) // ubicar + { + Num_Val = 612; + goto Salida_Option; + } + + if (Boton_Calc == 13) // analogo + { + Num_Val = 712; + goto Salida_Option; + } + } + + if (Boton_Calc <= 9) + { + // recorrer numero ya impreso + Num_Col_Pos = Num_Col_Pos - 2; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + lcd.print (Num_Val_Temp_1); + lcd.print (Num_Val_Temp_2); + + // dibujar numero nuevo + Num_Col_Pos = Num_Col_Pos + 2; + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + lcd.print (Boton_Calc); + Num_Val = Boton_Calc + (Num_Val_Temp_1 * 100) + (Num_Val_Temp_2 * 10); + } + + Salida: + + lcd.noBlink(); + + // pintar los ceros antes del numero + Numerico_Write (Num_Val, Num_Col_Pos - 2, Num_Row_Pos); + Num_Col_Pos = Num_Col_Pos - 4; + + // regresar el cursor a su ligar + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + + Salida_Option: + + lcd.noBlink(); + lcd.setCursor (Num_Col_Pos, Num_Row_Pos); + delay(300); // rebote de boton +} - // Cursor center "enter" - if (digitalRead(Boton_Center) == LOW) - { - Boton_Calc = 14; - delay(Boton_Delay_Teclado); - } - } +void Numerico_Read() +{ + long Num_Barrido_Time = 5; // tiempo entre barrido de keys + Boton_Calc = 17; // limpiar valor para lectura + + while (Boton_Calc == 17) // valor calculado # E * F, 17 sin valor calculado + { + // Barrido + // Linea 1 + digitalWrite(Boton_Array_1, LOW); // lectura linea 1 + + // Lectura 1A = 1 + if (digitalRead(Boton_Array_A) == LOW) + { + Boton_Calc = 1; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 1B = 6 + if (digitalRead(Boton_Array_B) == LOW) + { + Boton_Calc = 4; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 1C = 7 + if (digitalRead(Boton_Array_C) == LOW) + { + Boton_Calc = 7; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 1D = * = 15 + if (digitalRead(Boton_Array_D) == LOW) + { + Boton_Calc = 15; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 + + // Linea 2 + digitalWrite(Boton_Array_2, LOW); // lectura linea 2 + + // Lectura 2A = 2 + if (digitalRead(Boton_Array_A) == LOW) + { + Boton_Calc = 2; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 2B = 5 + if (digitalRead(Boton_Array_B) == LOW) + { + Boton_Calc = 5; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 2C = 8 + if (digitalRead(Boton_Array_C) == LOW) + { + Boton_Calc = 8; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 2D = 0 + if (digitalRead(Boton_Array_D) == LOW) + { + Boton_Calc = 0; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + digitalWrite(Boton_Array_2, HIGH); // lectura linea 2 + + // Linea 3 + digitalWrite(Boton_Array_3, LOW); // lectura linea 3 + + // Lectura 3A = 3 + if (digitalRead(Boton_Array_A) == LOW) + { + Boton_Calc = 3; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 3B = 4 + if (digitalRead(Boton_Array_B) == LOW) + { + Boton_Calc = 6; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 3C = 9 + if (digitalRead(Boton_Array_C) == LOW) + { + Boton_Calc = 9; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 3D = 14 + if (digitalRead(Boton_Array_D) == LOW) + { + Boton_Calc = 14; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 + + // Linea 4 + digitalWrite(Boton_Array_4, LOW); // lectura linea 4 + + // Lectura 4A = 10 + if (digitalRead(Boton_Array_A) == LOW) + { + Boton_Calc = 10; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 4B = 11 + if (digitalRead(Boton_Array_B) == LOW) + { + Boton_Calc = 11; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 4C = 12 + if (digitalRead(Boton_Array_C) == LOW) + { + Boton_Calc = 12; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + + // Lectura 4D = 13 + if (digitalRead(Boton_Array_D) == LOW) + { + Boton_Calc = 13; + delay(Boton_Delay_Teclado); + } + + delay(Num_Barrido_Time); + digitalWrite(Boton_Array_4, HIGH); // lectura linea 4 + + // Cursor center "enter" + if (digitalRead(Enc_Center) == LOW) + { + Boton_Calc = 14; + delay(Boton_Delay_Teclado); + } + } } void Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte control) @@ -3854,7 +3877,7 @@ void Encoder_Read(byte col, byte row, long limit_min, long limit_max, byte contr lcd.blink(); // lectura de teclado - while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Boton_Center) == HIGH) // enter y center para paro + while (digitalRead(Boton_Array_D) == HIGH && digitalRead(Enc_Center) == HIGH) // enter y center para paro { // lectura de encoder read = myEnc.read() / 4; // / 4 porque la libreria muestra 4 numeros en cada paso diff --git a/LCD - EEPROM - Layout.xls b/LCD - EEPROM - Layout.xls new file mode 100644 index 0000000000000000000000000000000000000000..b93ffa2c9256f4f7933e167108940a35cb018e7a GIT binary patch literal 196096 zcmeFa34B%6)i!=|a}yE_^I!xFmk17Lm*)i!aNU#5E2pz34}0DK|o|s5M>e^ zKya>BtJONyvDFqW&eo}FTdUR9vDI2N-x}`P>#mzag#Y_}@6Y!45A5Xb{hU3m{p_{( ze$Kh~9{*jlcMjdv=3Ou9C)>y;dP9}n|j_#h+zEt+S*!4UJNgufB;GV z|IdGb1-^qeu7*Lxu?<3qgMee+073$ULKP@2z?>+gU}zs00`$oI1fS=g!3U}Ll_7l2f`o-gCXQX z$b&Eh!cYjqAPk2v0>T9lMnV_`As@nM2xB0Og)k1ncnA|9OoT8A!ej_jAWVfY4Z?H? zGa$@_Fbl$k5DFm7hEND$4um2Ib0HK%D1k5!LMenY2p2(^51|~w0tgilDj_U{un0mG zglY&lmP_F8QV7c+EQhcH!b%9MAgqS42Etkh>mbxXz_$NSegeQ4p?Lrb3MJrg&wG@9 zlPUQX{628ojm3Yx{P~zwF;F*O26n21_Rj|!RKh>(<*EHN_X06N$RcexncP@)kH2yQ z;$Y;KfK?a3NK}EfMu2ros7;ts4fd}jd!MM>E>J&ohvpBq;Y8O(r@s_Vhy&JD!sufg zilL_JQ*2Lvs9*Yivh}0Az75x(m;kdlKF*67bF4vA=tX?I=e_F%yq^XigWsO_9)y{| zGP@&l!P|*r48=Ey z$pu=J11;tNUCO}yq?-iv$_x@2=EC^epknEA} zbA`27@CUEJc0|`=%Rs9)`@wN({DW6y{oobZKX641EGG5Y^i$|d?;p4V7q9v`_Cq6w z_GtJ6WdvYZ{-IjxAAPJP@q}fh1e0MofUQ7kT58AijvX`3o7qiXrUcJ~jYV<84N*%9x^Y`H8b(vQ zr2WwP@zcn4L7~_TT5B~(B z?0io+J-Ef%-=*Jqg7oW7kba_aZaKmACo2E;Q@s8}?YZLw<(#PepV9R&)0rpE4%eO_ z{hAY`b9?HRv*!fY-*tj?wol!19y!7FSDqmKMD00pg6mJz9_}w5qG%pD`}~B;X)ftk zHEXu_w7sW!LGEu$mtIox%l5x)?*;Fp>*K(KP&r@21@y!Gj00EZpPqh#^sc_?c$o8> z?|2Zj?Z1`UgNH>*e~HdV?cpdu>8IIrh;lk?=;Znkylhe@{YyxtAHKdRyr%M7Rb0dR;pDLuhAIy;!PW`(652skcYC-thG}p!gFmA74^A?)tOs^)6ld6@7jC z6I>rvZ&W!bcEorcShc`LoUlC&Bg?;sRFLrXs}ov!tFa*WGtTRk|7p^igl^s%la3bz zKul>#2S+?y(4GL+`Npt=3e?Sjmz+`t-sGP`4Y8+M10Ew!sY$p+IHe4@mpP>j4Nf%! z4$3LjfYbeyGN3;^r3~mOPbmX>&{N8QuKScS;97M`8PMt0n_*DYd_X4k zEkRnJxDea}{9qx+M%6z$xFDWHA@z?A?&40Okordl&X^}tNd2P&8;p}Fr2f%CRs1Bn zQ~&7TLac>A#I7YgcY0;kKRT$(pF|<`j}9EoPo|LiM+bIFCsRoMqZ2y0Lh2tK*bJOZ zOX?pT*eU&RA$;%U#1pXN$rV!n=%k%oA@z?=r;{tB{?X}ta)s1CI%l0+A@z?=7gq@G zmkxUIwPqiNa|eOiUq4r?qjN>n;&nD$(SQ~&y!M+lo_`^qfBv~Eq(Qjgb?esE;$ntB z2|j6w5oz7M#7nz-326-@(pr5Plbm_wDriu2qq@3A;l>Vse0z5E=+Qcj8aQxZokm5b zNuw|=x>1;>jf&p(o&(LOcV7^lA^lV{bUW1y-A^?G$aUd9;ArCj8pGDzmSn(X>{>Ac z+&-`wgk!(@B$8v%dz+rF5FAbnrdH$*Cf4udd!0-nwFB!fB=ckniC%7^$F(;UqC}|E zow{`H0~vIV4IH@C--xxx_Sd2F|GhaDJt%#hDSRisOz7I07}uz}^yp^_IaquGdenY& zFrtv?+1}ro2W?sBJSiNjtv%)n5f^m#-FMfS?U89R+c7PAwqu&k_UJ|paE(Iqpl2|g zl}7pb#YlG}W{gaeMqyfXqcBYy70tYJp()C|I+m(?^2R3zG($91W7Z^0idqh`AVcuP zXBo76^i++UzPuRV`6jyQ`0N6=1nmj8nyo$SX2^CKd|6SKivuCU59|WThyCSAAfWaj-HEy0o6k4jH{5X_EE2%rsqN-I@WaxsoU2)lK~>p zeT^Q&A*Y&QsL9~dq-aA7gA6}lh*+<<#O{ltn>qYcYaMZNwbs9-yWr#ssef}h^5hDs zf15k%O!<~O}h1lgbdL%|eA@x!+di=-yaINA#bT&oTisEQJwO$!$4!S4kNWC&T zg}Q|X6%`d%RQKGKknion5f1;v1XF4o!P8k8@Kjd_p4({efGA0H7%m6>0P&)uJu%d`=(e}-@#A~ic9|VhmZZMX&GHjpSsm_ucsQ^ zZH22zC@y*Z?_c;=(<-`}zIChVRZlg%f1=(b7MFbY;qU#cX^qwNuAgb`p_<+&!L(ze z?mzY?|7uQ;uEvLH9qXwkl4-|Ay?_6G{?#N$SL4I9v+AiPl4-|Az4oVv{Hr-5x*8v* zol{RWkxV-_>e!>N`&ZK@x*8v*^{A(sNTwYdb>G_`_*c_5x*8v*W!6(oB-4(K`u62} z{Htk))%2~OX(6bl?@2JNSLW`Yy~@>~LxUgZ)6R^p#)oNX^;8qdv|gF7@43pqnw02j ze3;gyo@yeQ)+_VLR}c7C(>}TyAEu?(Q%xk(dS%{q{jdG22}M`q!?cWgs)=M;ugqP~ zzUg00hv;g2nAW?VY9g7|EAyLQ?(nN732vamF2=2!gQC{WGiw{1aIJ)AkJmr!UuZ`y z6c`m-v_7p7urb+1-3*NdUjNykqq&? znz@Jl3+=3h0ym-y?G{yNBp=}U?%RLmU+7s{C@>+q(4J9+MvlJceYIz(U!e)`WIG&a z1{coVl`z1Ld`#QgSa=@2ke&tS6*vwLdZ0hz?g(F_NE!AdP2m|2xLufASYEWGys)~g zvSL@ldRt(ib?s^Ja63M;iVqo=!z+ELxdH7YuuwdMO9d!kQU&qwq(6cvpu~U~B4Y_A zmS|#E2AaSFcyQx0x3suuekixNynI)}x~O)YUfU4bRSKKIB6#dO1h0#sb>-kHwN)ri z(xx!dfl90Jm>=(2#W86W$D~ypyD|{;&Z&v5-IWlsO^J(zN^;>TY<>zH>hkc~^qP3M zwoBBt@$jA)y*32T^=HsC{hX&;O%U>Qj>;3PO@KU0;DO;P+WQvKQ~8{udrbq#(LE|h zgW9AzIc#06ydL=E!I0$(%L^+Ct1GKkgeDd*uilj~%oY{sQ`;2Y)UX^L;l{DApz+5? z?pJ`#Cqi?U(_07dF@B~O4tAJciO@GVoD8e11frg2%Z+JM8-zDW;6wX!!C*>Nlrg0& zs7%Ug43DwEk#l%);oP!{c_BC}L^U+FDOh$mGzht01`VAD4dgQdQ2-`P`w?rnIHY0& zXc;@gD+7(;kP%Th_`c}EoB0&Z{_g~Z*ABetm$-+=!ZRZa2Ok(+cyph^*$dQyDbWR{w|7zbR~xz%Pv|tC(LrH$4AGMl~iG{L&~I==m_{bBzaxb!>FLNW2ef zsqtXABzT7pte~TdmsD33f_sT_%rWi2F^`6Vv8PqQDReAKQWR6AzXw5a4HF(HRpY^Q z%(QKd@u14l!1OA5n+O&awtft})Wd2bJPQm(jIOLM-jy)NmJw(O^99SOhDPDrtnk!B zt{o&0;4GkCLD61RlcolI(=uHG_W>p^!P$+X>L* z74#|}`i{;J-yGBntXKwb?ZOWEUjd#2-mZgp0-!EI9@m~A;T0-n4@7pipyw4Lh zdfsh+^{_^7E+G+t&&t(ST17^FixG3 z0&jaO+3)Syvj^VGSK?*vhXnAUnGp6V#zP>Il;#hCe|FH^BR#ZivFR1A=eecq}FX0=zFO zHQ>Dh*S!*P9ZG56dhG*ufis#5uOXh%6Myx>Uzzx;H~#8_zxv{@e)y|D{u%(kdS>7+ z%+V8b^u!!JF-K3#(Gzp@#2h^_N6!J!iVO(dAmlAs@n22t6V6g3t#-HH0b%lOZgHFdV`t2ty!@fv^M`lYtFc z2w??;4iF|m7z$wmgmDlCL6{Gr1j0NBgCU#`VGe}O5PCr92O$$eZwP%MEP~JCi4*Y!@{%(Z7NpKJGY4|$~{>H-46v1<-MG+)LAAls^lh7_{PeeK-d1FV$2Ju}Z znB2iT@WH|{-@>bQP)ZBLHX@h{Pv$b%f-f9<_^V?#&usszL4WJn z`7gJ;aN9%28$R>Ruf|RJ@ORISTzcoEIoHR>kD2;m$IcJmap#@CdA8^5@rQ4m_~Eq! zvXZYX-_h~Nn+?)#xhMPbN2@NoCUN$C#}ECY+t%}n&hOcLUe<~a9$5W&>!q=`{bfVe zb;I-Sc=?aFRBpYs_r{F=r=?$Ca_iMUd*IUC2SRU7_+nf48BbS@d+z;PmUVb5J@J#f zul}IT#P&`9)oAFu8R@z2{qBoa!-sDBSMmFq&p)!@nx}sC##>!JdV1a;pZa)=cU$e2 z@1N`a#UEZN08`Y$$;=w-=qoq<G{80ckwfuj@;BKVaD=>m)x-Gje83o8vFbWSK~rs)e840)sXoV0Z}U9qU()%N?YJ>#9eqh9<+>+!Gln|;TQo1dxu z*%KMZt{wB(x;xYVJS14r@2XK{f0}dX<{p2X@bJ!?i*J1?<@mk#|Lc|SpeuDdI)BBU z)*GOMTOr`nX4R#|3yOP0{LY6n$h_hzq({=R{Dx12n&!N_=Fqa8zwcM{V3#3t?*8o^ z5B}53J=kW@udjdMx;I|^^B*_#d+rY{Up_Fh(X{k~4H|7NezyCi_kFrL{ie1zzdpR( zQ|aaJ{<_usA1+UR=AO%1{9(k?i^r|$`0~z8Ke_j<&@1@7)V~q+8%&yVibaWY&_@a z-OuiBb;jep_Uv6Tbo}yu@1{Q1FlER+y;^^r@O9_%;(I60C>W8EAA8k%!PgqEkH0MO zfz18KcLry~{W~T0j9YfC>@auE_4}_p_^Zb*Z}QhR9p>Hr+u*rR-hO7yk)8wF?AqKl zCuw9{kJkr1`)%AgGp0=Wv}E*?FEyXO`Hsr(s~$Kwd-YE*n!B}hV#A+&)%GXnoY!ex z?Cgu0z53BV9(Z`=Gr#i|CSQDX^67i$-SEqCpR~+6bLV%zc>2K^^IvI`{r0=R{Q32Z zZ+r2>-ZOsDea|g1zrXIXxNnCpc=)b||N3sDr{6np+SfzpJ^03~uRe{R``JgQef|CJ zS5`jp>$YQ$m9G40%_}i~`)cvuJI#Ik_m^Gpb^N3KE*h}<@{7y6{A}d5eVhmpcnKra@|BYFHe{XJDmsbLxc7E)+why-a&8AM>PJ3qT@lp3~_$o80 zPtU)6_03cF-C2;83*r2=Uw-@b^G$xeqka2<-@N_#=LwbX^sY)QSo7U8pA@XUbnU8t zzI@wR*G>B4(QUQ=dT__uZ$5kRqR_Hf^YYL7oYiqr_SVAfw+vff^vlLMo7unGJn8NS z`~PF`8wW~`_t|#j%hi9lY|BmWr#x}X)D^Trhw z4_$s!!?Px(Z|+}s#}k!>t)`qkVBePGPyOS_#lwefT=Y`g7H8j9`uBvNzMA+=e$sch z_WJn2@;zSCaYms=RFT z?+bqaV#$Q-a?Ag+bL!tdziZZoFaGwaMK{bXx@YUL{XcJd&y8msob=l3yAPiI+CMu# z{@3ZZWRAS8?aQMke0gMd=lQ1}SUlkVhk7?^J+kugxf^Du1bW>0#A5~9F8QKy$=ut& zt0}pVx%Zse_lz%p|5?jB2fQ%->c182 zT)HRpi}%`$e6rQ^|2}72*Ivt0I=!>>?sn7u+WM@K&yPE=w9k|SF%1{J(zx@&iI-eA zB7WT7mHVDdzqsv9V-pYj^QP86yXEs0y=QDHT-)rWcmMgsH)|f7eP@%ogKs@Ez34!j z_a|K&NPl_P?cd*)zwo0WXN-ORvgdAm>h<`vCkEaa2UDQi{!znkeslJD=e)k`pFJy& zuDJ;_R?F)%hpa9^-RIevn$%v{%+Ls|4y7a==RH& z1P9;WzIF147nC)adGo&9(|haJeM=qXm(HFlAZT@E6jKzC4 zpFO|-h+EgR=`g5p;P|^jbDO-r>zPL;?0fl(hktwb+yNc09C!Hxy?%Dlj;A{m=DrpC z>ObC2xjuRPTh&)S)F}DQXTJU7x-S~G8M5-}MISx;(cC}3J%9c?pIp1Tyyu2-YuopY z&40Ic{8Lp~`#!mK&)YjsUv=mFOV{>n|FbqjCe>ujJE!!|#kH4oJ-GO`d(WKz*n2OR z9BP-h==nKQ(;FO4>b`5|_YM9zu%4PI#U zLifvOFT8tO-~GMM`RMi4)h}FlPT!ACyS94dFU~snlRoE-eCT%{eq7c6i>FrHyZnmh zo;&~Jf4zQ3wP8r9J z$4+Q4_S?yaJG}J`9B}Hc!;PNbdEL)p32O_h^jT3$8E-ylO^#TN!<&)(hL2~o-1ybS z%MvOpUwokH6`kL@^!QI+irx69K8^YgOdI#{-x}SKp3r@B;UoLY9^8A)GcAgGz1_3) z);0;}ez<$l)sHQ>|KrPZ#hEj?&yERj>&&Yz2U||Pd|8k_*YBTT>sgDnAK0EJv^uBs+YYp_Kdx{_GjPq zZ?k1ykM^x+eLrr{;@@wI>vH&4$KL69;MP&W-^_U6fhTdp%UzENbc1K5PP8?J%OZY! zHmYMs+5)1tYnmI6QxTiD=#0_ZAI;brw#gCOAl?#1m_NFt=)H)R^rBx$v@?k=Bbo$S z#X)6b3YyJ(K*JqDj7 zbKVZmd-(`#exLBXLvO$b(7@O=f+H|$TLCx@H=)7`8VI|+5FRe!cFFmvJ-cV5hKehSDp8g`KXuZ?q22nY4$N+t)gf<8?!;+h zhlCcEmo2Uijh!@j)QDVo_kWKbgBC6fExT>g-OdSDL77%srSgzB=Q`Nh@U zi>iw8#)0HX%vxLxrOb<{@S@5&d~H^bFxD`!-XhDYix&*4sw!Neg%)BIngki8Q70(l zWIBe$gqsqIY}5&g4EJ<#bzyb!(DK50u32zB8Vt@X*%?_q6A*w@eCV>5abn{>`tUF~e0RL4E$){6p z5PqEQNLn04o&Wr`;RGFX!|@}T6N{J3naCTTg@v#cD=4cdsVv~N*WWLV%^y29Z!BJ$ zTRFFQbm4+xxh`TWb1Eyk+q&qM&Uc4Zuh*`-#Y)VQeF~afb}#rEH-q)`0xt<~rbZQ4 z)Amufd6Hk-%G=NIZpCjM*JUVbPnGC4P*9`WRYjy~OD9$pRxIXcnI_P7lm_5G+W05Y zrHGN3G$Hik7>tQ!mGcV!!>xaUK17(iqOe=}kAVBpvn=8)G&X4eht}dR7iQ|il zs{a$+(Eqm%;y^_>H;BnbH`>G05Ai7_v$r{>Ko&~x)32{hk8n}{`(E%Q4F#*xe>oMR zdsvqXGd2& zJS`A79ypG7PTSqyx~6ti?WmNj(|gCxi|Z2mE!`{~PTywY1zv+&xsZXLRgUpuVFxCB(CU|GW(1YS$$R*Z!aR}bV7z0INX8eMNse!2hctRU~UK}WYW8f=M0`O+A zHT2{w6cL*PxAX%PkAd6!UTn6Dw}P*a>6*x&T7uWNhOdd~nm80P@%15StKc5IF$aI} zezZr8Ob9d$zfPvU)Wqa?n1+!M+({-drU|9t9qH&aG(~h8-h+-#!yD((Y4G%Soiu!+ zHu^faLtiHiZ@oufhffJhn)CzSn(WfNa6ixna-F2%hi^uwp=DY}*`T>k8b0$IeI4F= zk4|gllZFphMqh`Y*BG6KAHNu#hM%SworWKd7@dYspGK$Qrw&G^wU0`R3E-%~GwI%U z_{KyJzq0`zwhqSv^mRZIi-lN>!-5b)ws5{Uh#^ln77sCG2*(;g4BpWajwL`0>trku zV#pDWHG~+lgJY*b40*w^B#2=PIo1eb_-HZ58bb`3!LcR~Lr!q4Da4Qs9BT$KkkI>gNwTAZ!*8SI>u0@-u)ncIM+4OZvSWXP|Je$6piDU5) z>kzI3-&vDQ&$~000I`t65+Q~xVXPsr54r~B%6i8`GRCKsUb)VNpl!lsfUZ9 zmC)O8DaeUb7ekvVhE~dO7+MKGN|y7Xm9##zlCUla9FMFI?V@F(U9>*53u5RcaL%%q zh&NsW*DU2qJoHqp7Y{vE3&q1+P%nWcs+YhwEUTBmN88j(#Df=5FA)#cRWA__Bcfg+ z9=w2hiFja+dI@|_n|g_O@B->3;=v23mxu=osh5ZcFQ8r`9_*oBA|B=zdkM5U`Z4tb z_$Jb9`ua7-a1O!SQfPb{m^svd_#kt=0oWy*zLt&iAs>X(4ZtqyF&cnfbd(zqQ}N?! zIUh1r7>*whm`!gQW(?U8a#tcdG#}0(&4*mkmLXU4%E&o{AKsQtUuK6jpbuA0B$%0z zU}i>wnHdRYW+agB#MO?=L`zI|F|@=K7eh-7a50>-dL>$7n!|9`;M=FUOtgf|y#(My zHhsYzV`vGP3kfu9WS%4d3)Cy%ht#Q8z!ghpKqB>BW@#ezU1n*b>3bseU1n*b>3brr z6q(^xClU+Jb203@)_{GV>afWEB~t&y<0k^=wSS4Gf4I)-yv0>a%fuBx+0&5vfICyP z8T!3Q3|9jgKb#-gUXHsG$4_|OkeIA7?1NaoA^BX*hvO%Hydm*=h$|C&E9+ZB>aB3M zA@%kGcO~+AmWv^;FLW^+TU^7?>*20~y>dP&CXB^j@mWV~LI@p?(d>m?blmt?$NlJR;; z&gWf5>6PfCG=^4^ zGe;9+r6$BBy)x2D@a`H5f)KZ!nD>Wr6$w{dx%{XaUQ)4B3em$}jv=X*~>%$qR`69X0lxCb_ zXeBv)H8nG?sj*U1W2L6VB|N8beUVmbYOK_hR%xsc{W|7gzup`yq#g>tD^q7;bFh#y zuDS8+&A~$I*P9!^-rV^0=Eko#H-5c2jEeg8=Eko#2Mg(L7C(qlceBmGLb{u64i?hg zEPe!~?q>0mB6T<0-1zn8U?JVjHg|poJd*uS3*wQiLOt4}NHZLe?*t!UOr%UV%yWtZQIdMlP_MZJ}l zwSwO2%G8Q_E4$KG)LZFaE9$M-3_n>?&vLC`+;yF5MKeQA(XC+Ib*I#dysX%>6d zME@bD#n#mK0Q|;zf@93{B-zZ9WHV2a%{)mq^8~;7Qs+ssnJ39+o+O)jl5FNlvY98z zW}YOQd4eA!sq-Y+%#&m@Pm;|%NjCE&+02tU$c+ft8YkJpxZBr~Zk^++t+mU<*@X-hql^Hy8xk(?dc zQjcUNwKY9zOFa@xw57SKWk&8I@v}Kq32X~Y%ylQ1wzQ_9m2kA$y3s-%S6A6y9lX=h%=A7;|+mVmb+Hv*niI0i_@@-(pHje9x{jw9|CD0< z6Mp!p`ll4*pHhr}N-_Q^#rUTb+XS;yNGqe5^! z=Zjp&+Z#r;H;ifzR?3Et9g}>hM+i&X6Nh95wkHm0eK=c$QTS=8x(c(xAxlCaC*}qCD59?3-@VkBhB4oIPkIewa$-7%|E0$K9qRfP zLVC;|?*;f?^Ng6(7`#7*mS`1qZwUQGbQ&rZ(P=n`qSKJs(P^mSN2lRjiB3aBKROM4 zUUV9Iu;?_jaC91agXpyGK53{cogQTa^sdoqIESOt(3eN2p+}ES>*JG#UMKoGWLR`s zf1k7gK56Irq~W?3U0#+?8hWzm>u}YIPD6hanTE3{1ZnDrLNxni{R`3T!+kbi8F?BD zkv~@qchQ60m63N0LNxpI%E;4Li2S)?IN!8(oNtOno=ZctIw^*ycdb40{y~WLm3n35 zximy`Q81i2>VrFwCB#c~AWPuR6D`q!{E)0(9mo>mGdhqT(imDoR=o~n3GosgXbl%H z(E%)>`<@Qum9%A%=h6WO{M;6KJ1_Dg7Bk}wYRCJf2q_z*#)JV{-u)Fl^&&<{-uK7)16!@^-tF7 zRPeL8&bq18KiM0kQvbw1r;-nrzNgZ-<7~wh8guXpon}_(G_yjdnH4(Ctk7v@g-$ao zG=2!PuFz>_g-$aobQ;)1SLigeLZ_J(I?b%mX<#8eX{VVLI?b%mX=a5^Gb?nOS)tR+ z3XSW6uF$w5sK@9`?2r-ZOzaT8ccxWXMg%|PSrv8s3;xij%W zMzS-l!otSR(04s;b|!Xc?dTP7R&$x?70?@F4BM-7{VeLkAcvtZlN!#VKFEB=&y>~^ z0e*IYp5D(QPUATpYryr8XB2V_dCwf{YB+|Uq@cF!YB<)_aICB0SXaZbu7+b>4ad3~ zj^T$pE62JTj&(I0>uNaG)o`q<;aFG0v95+=T@A;&8jf`}9K(HqatwWz+9lm^EZuM{ z-Eb`3a4g+$EZuM{oj8UoERI$>aZJWMoj4{Z%XH$HuqvH6Cag-Qou04?{fn}yn_*Qq zYPHnR&9JJQVO2N7s&0l==#!OIxc6aJWf)dv7*=H%R^bOjtEbN}tjaK~$}p_TFs#Zj ztjaK~$}p_TFs#ZjtjaK~$}p_TFs#ZjtjaK~$}p_TFswo!qO8I_pt7nLt#Wb->_wv` z>sl`wEs14Pz8Lt8T*;(-;_)&mpRgm7@`=aGq)`^nl}V#4YfvVQaz9sQhpuVGYQ!>GQ7QGE@g`Wi;zXHx4k6nzb&`Wi;{HH_+O7}eJ>s;^;GU&E-rhEaVD zqj1EOQD{$PRDZCN>I(gdCo+oo0n>a!#Py&*+>^{EHVvQ>gj)ls1mV^IDnUkm0F@xz z8bC}FZsBK1>uNfHm?qpBKz>j5gagQ*NUH`A)3gR;ns93Xc|qaU0AgAQT8ndF05MH5 zTxoM0hAS=ZDEUg%Of-i3Z;71?*C-3o7c&d-jKeIB+IZc z%djxZurSN8Fw3wo%djxZurSN8Fw3wo%djxZurSN8Fw3wo%djxZun@hLvJlUD%ED}7 zjc_QNSR*5xZTu5HzpFd4Y~!D@jep7})(D5Pjep9fwNq<|^iSEwKV=*Llx_S|w((Ec z8(m3pB(s4L%qV;&OIeD0YrWHh&t&QT44=u;{TX@?zMKCl{LN|xAA}r0wdGq-T^fVt zG6&jD?>1xVU{YZC^$YYQat^d7`sr0{V|3bJpR`<`v^<}*AwFq%A3VB_ zVLoYimp}SCR8^zXF7Qbk>613fCoSJ6ZM09?7@xGUkQS}*jPpqw?~^vcCvBon+9aQ} z$v$aQeA1@*q)qopo8gl-(Z zON{s4^)B&X<0%IlPdV6lN}OrxDRGXer_3{}Z60|U@nd=9Wn{I@BQGPXZ60|U*~#UR zmyy*r&#bn2ZQ9{EjKZS%}(n@4^#1g*u<&oirS9{J52hefWod0-b^U-Q5& z8be>AK6ME7U3}^g>btaM2=!f7_aW4GTw|~;L#XefS`DF9Le9MCnUtmIlbD;s3^#`v zZVoft9A>yV%y4s<;pQ;I&0&U{!wffv8Ey_U+#F`OIm~c#nBnFy!_8rao5Kt@hZ$}T zGu#|zxQQN`xruwi;ouGVjwpI*W$6eS8(Ggs(AWq|N6^>^OGnVy2unv0FNLKe%z8e8 zcq#X_Mi4Kx6x;>kNdU)t1o2Wd#1V#myq@rB46#c~LG@brG={vM@M#ROOMK@T!>%#L>y0s9Zw#?Z&Jkmb*BfKJ z9_}*K>*4-FS%y0c<`(WJm{Ai9qb3+eO)!j_U>G&QFlvHf)C9w*35HP<45KC(Moln` znqU|;!7yrqVblb}s0oHq6AYs!7)DJnjGAB=g}W4{)h!9(fpBlH;Lwt*kuy+U93Ba=8x2XJ7S$9lc|5W zdZW!IQ~#vC$<#k-^KKfI5?W#VY!Zh>RC-iQ)A+4N{K^$6Dt zz7j{Xw~L|bAbp=qJrc`LCXXO@5+{>K&?_UKCYu7Ku}8ofrcmE;UFH~`JB4RcsPC;E z7I~Lo3iZ9c!y@m4O)+CTg+>!sJFWryF4mnweV6`Cp}x!BaSDy5*m{a#@)YX3c-Se_ zcg=^q#*xO=bQ=6+KR3xIH)&LFQK-ed+@LfAjU zc!e3%cbP*osPA~+0$V+U`i}R;IELRVs%^n++`-tq`nIaW>VjA zCSt2+Qs2eP&NSmb(~SE}^7zvCnK1799*UVT?zzr?%!F~*`{6UG@3I=qq`u2)FcWO4 zdhtw{0s4Ft>J&QPXOUe{k;PWeq8T7|nMEuR&d(wihzFi!STKw15^|-We-vLf%h+WW z*+o3?ET~h*eHPdyG8V~+S!5SkQ)ZD}P$lJ7<4Pf;GRt_&S%wp{$SyKQ7t*W}W?e|L zN_u-Cl_Fz%A(bNQ&4pBo>`pHv>tYN&Z~^>f4_pA2RZmj@mesjeU_5XESXM`*04%H8 zc7gH01;zsxfMwMK7l38;U8)6OS-lfnU_5Yv@xTSf0~Z(%TmTl*=lTnb2QB~$sbW(A z7SeaA7J!BHx&8v@fnNn~PX&Wdh0lm!t@Ycm8k-Eyy(PoHmZZkw({Oynx86IT%;J-C z_&XV%pM!lQJR3I~>>T}B3WYvtb9~Z@eA4Fnq!s(5mH4F1^GPf9Nh|Y7yT~VPzE4`Y zPuc>Xvfg;0C0Yjq*ip6i~REhOK3wksvl zHy0Y;TnKGZPhCj+TG{;u(~9Ao)8)OXpd%z<&x{>?FcpJVzy2l}Vaug#$q zT2_=fv_i`|I0yQtdzCq~hT!`02-GzPo+HQmTKt|>^iR4T6cOvB??tpGhr<0UqH&is zxroMH7+GY-y@bvY!icH^&Oy7%4-;1d4vQI0bzRUO((fTQUFQT#4 zmPPJPifH}BE71}~&Jq}#>teXJqCe)fwb-n!#b#|SHfw9KSzC+2Lb|pVo3*tVETm8J z6@!IzZ7nuyYcaG;*VbaNklqa`1`FxkkYcm87Mr!T*sQI^W^FAtYiqGtTZ_%wTI|+V z^hvlnsrM=&=HNXj#?W7hS12KW)z4vg+U@CLIBP;KhP$~O7sF@b#0QpuU38~c0xi({ zu_a&^J^7Rv=9GY4bbgh9T{woLTtYf9wiwq{^>OoH%yVJ)3D36q?G)dc*0UMQl)03N~t$8 z|4U78N=24BxvmfB`?NB^`qsq3v3B#$og_(oyO3s zY7F-x8bhzDG4!Knxl+)NiZ?E&*(p1ra^jiHmU6I*&hc`vi=O4niCHoO%E1!4w<{-R z39rkESuz94iCJx3TO!qPJXI(Q7C_(Ci!Xq_s}Ej4URP$^0`j_2-vaWwQr`mdy0Wue z0G!Z0(*p9d(uW1mckROh=zA_Om@U76=9rd=_XTABEudK?`oIF}yOxP6k+u_kk(PMbK}ZCyR`?Tx7iEBI7L=8E?7Bc*{k`TP^}CsG_q7tf1a<5m-UJt7wgu{aqEU(c(L+z)I>LtH3V$EMXPcMbGF}#11VJ zcbzixtH^iCZmEj6g8mU#(<)*I`u-|nhU{vpXpV?~N2Nshu$Z_mC-TL_b!qWp=#8Gp z7ejBPG1RHvcQG+v&eDsiZyG}%pfNmy%RXW;^i5CXi>YsVCHh8

LG) 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 N@ALVe|HIF~zX2cJ3eNxl literal 0 HcmV?d00001 diff --git a/LCD - EEPROM - Layout.xlsx b/LCD - EEPROM - Layout.xlsx deleted file mode 100644 index 818f570e48c559146c7f4d86288f48460ac8908b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65481 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 Date: Sat, 1 Aug 2020 19:09:53 -0500 Subject: [PATCH 2/2] Update README.md --- README.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 62f993a..fc442f8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## **Firmware - LCD 20x4** -[![version](https://img.shields.io/badge/version-1.7_release-brightgreen.svg)](CHANGELOG.md) +[![version](https://img.shields.io/badge/version-1.8_release-brightgreen.svg)](CHANGELOG.md) [![license](https://img.shields.io/badge/licence-GNU_GPL_v3.0-blue)](https://github.com/Arduino-DMX-512-Tester-and-Controller/Arduino-DMX-512-Tester-and-Controller-LCD-20x4-Firmware/blob/master/LICENCE.md) ![GitHub issues](https://img.shields.io/github/issues/Arduino-DMX-512-Tester-and-Controller/Arduino-DMX-512-Tester-and-Controller-LCD-20x4-Firmware) @@ -90,18 +90,28 @@ Herramienta Open Hardware, para pruebas y control de iluminación de espectácul ### ![**Changelog**](CHANGELOG.md) -- **CORREGIDO,** se separa la lectura desde el encoder como función -- **CORREGIDO,** en analogy read "a" cambia por encoder read "e" -- **AGREGADO,** control desde encoder a value de dmx -- **AGREGADO,** control desde encoder a config contraste -- **AGREGADO,** control desde encoder a config backlight -- **AGREGADO,** control desde encoder a config bank init +- **CORREGIR,** cambiar delay por interrupciones de timer +- **CORREGIDO,** Pin Out para hardware v0.7 +- **CORREGIDO,** Pin encoder center al 6 +- **CORREGIDO,** Quitar la programación del potenciómetro +- **CORREGIDO,** Quitar la programación de los cursores +- **CORREGIDO,** pin 6 de encoder center a pull-up +- **CORREGIDO,** pin key light a 11 +- **CORREGIDO,** pin contraste a 12 +- **AGREGAR,** en multiplicador, el valor en tiempo real desde el potenciómetro o teclado +- **AGREGAR,** control chaser desde el potenciómetro, al girar recorre los canales +- **AGREGAR,** EEPROM Default en pin 9 como pull-up +- **AGREGAR,** dimmer para luz led como lámpara en pin 10 +- **AGREGADO,** a EEPROM, espacio para Ext Light +- **AGREGADO,** función para jumper de eeprom default +- **AGREGADO,** dimmer de pantalla al inicio +- **AGREGADO,** índices a posiciones de LCD en el Excel *** ### ![**Hardware**](https://github.com/Arduino-DMX-512-Tester-and-Controller/Arduino-DMX-512-Tester-and-Controller-LCD-20x4-Hardware) -- v0.5 a v0.6 +- v0.7 a v0.8 ***