Tengo una función de consola C# y quiero adaptarlo a Arduino, lo tengo a medias pero me fallan cosas. Sobre todo la pulsaciones de teclas y botones.
Espero tener ualguna ayuda.
Código C de Arduino:
Código:
Falla en el almacenamiento o detección de botones de Arduino que no se como se hace como en C#.// Variables. int coordenadaX = 0; // Coordenada X del textBox del nombre del Relé. int index = 0; // Índice de ATRÁS y GUARDAR. int textBox = 0; // 0 para el número de Relé (de 1 al 8) y 1 para el texto del Relé (16 char). String nombresDeLosReles[8]; // Líneas que al final se van a guardar en Archivo.txt. bool cargado = false; // Vale false si todavía no se cargaron los nombres del Archivo, si no true, para no repetir. // Caracteres alfanuméricos en el array. char roALFANUMERICO[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '-', '_', ':', ';', '¿', '?', '(', ')', '[', ']', '{', '}', '<', '>', '=', '$', '&', '@', '\\', '/', '\"', ' ' }; // Índices de los caracteres de los 8 Relés para el array alfanumérico. // Hay un total de 86 caracteres. Se cuenta desde el 0 al 85. int roINDICE_ARRAY[][16] = { { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 }, { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 }, { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 }, { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 }, { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 }, { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 }, { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 }, { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 } }; char roNUMERICO[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; int roINDICE_NUMERICO = 0; void NombreReles_Principal() { ConsoleKey tecla, tecla2; int indice = 0; Inicio(); while (true) { lcd.cursor(); // Mostrar cursor. lcd.blink(); // Cursosr parpadeando. tecla = Console.ReadKey(true).Key; // ¿Has pulsado tecla flecha arriba? if (tecla == digitalRead(A1)) // Sí. { if (textBox == 0) { lcd.setCursor(4, 1); textBox = 1; } else // textBox == 1 { if (coordenadaX < 15) { coordenadaX++; lcd.setCursor(4 + coordenadaX, 1); } } } // Entonces. ¿Haz pulsado flecha izquierda? else if (tecla == digitalRead(A3)) // Sí. { if (textBox == 1) { if (coordenadaX > 0) { coordenadaX--; lcd.setCursor(4 + coordenadaX, 1); } else { lcd.setCursor(2, 1); textBox = 0; } } } // Entonces. ¿Haz pulsado flecha abajo? else if (tecla == digitalRead(A2)) // Sí. { if (textBox == 0) { roINDICE_NUMERICO--; if (roINDICE_NUMERICO < 0) { roINDICE_NUMERICO = 7; } lcd.setCursor(2, 1); lcd.print(roNUMERICO[roINDICE_NUMERICO]); MostrarLineaNombre(); lcd.setCursor(2, 1); } else // textBox == 1 { roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX]--; if (roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX] < 0) { roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX] = 85; } lcd.print(roALFANUMERICO[roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX]].ToString()); lcd.setCursor(4 + coordenadaX, 1); } } // Entonces. ¿Haz pulsado flecha arriba? else if (tecla == digitalRead(A1)) // Sí. { if (textBox == 0) { roINDICE_NUMERICO++; if (roINDICE_NUMERICO >= 8) { roINDICE_NUMERICO = 0; } lcd.setCursor(2, 1); lcd.print(roNUMERICO[roINDICE_NUMERICO]); MostrarLineaNombre(); lcd.setCursor(2, 1); } else // textBox == 1 { roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX]++; if (roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX] > 85) // Acá es > 85 (o >= 86) porque 86 es la cantidad { // total y al alcanzarla ahí paso al comienzo (0) roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX] = 0; } lcd.print(roALFANUMERICO[roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX]].ToString()); lcd.setCursor(4 + coordenadaX, 1); } } // Entonces. ¿Haz pulsado la tecla Enter? else if (tecla == digitalRead(A5)) // Sí. { lcd.cursor(); // Ocultar cursor. lcd.noBlink(); // Sin parpadeos el cursor. lcd.setCursor(0, 3); lcd.print("> ATRÁS GUARDAR "); index = 0; while ((tecla2 = Console.ReadKey(true).Key) != digitalRead(A5)) { if ((tecla2 == digitalRead(A4)) || (tecla2 == digitalRead(A3))) { index = 1 - index; // Si vale 0 valdrá 1, si vale 1 valdrá 0. lcd.setCursor(0, 3); if (index == 0) { lcd.print("> ATRÁS GUARDAR "); } else { lcd.print(" ATRÁS > GUARDAR "); } } } if (index == 1) // Se pulsó Enter en Guardar. { nombresDeLosReles = new String[8]; for (int a = 0; a < 8; a++) { for (int b = 0; b < 16; b++) { nombresDeLosReles[a] += roALFANUMERICO[roINDICE_ARRAY[a][b]].ToString(); } } // Guardar archivo de texto con los nombres de los relés. //File.WriteAllLines("NombresReles.txt", nombresDeLosReles); // En esta parte, justo arriba se hace con el lenguaje de C#, aquí hay que usar la // EEPROM interna de Arduino que haré más adelante. // Puede que los nombres contengan espacios al final, que no se verán pero no // hay que borrarlos porque al principio leerá 16 char y si faltan, fallará. lcd.clear(); lcd.setCursor(2, 1); lcd.print("Haz guardado:"); lcd.setCursor(2, 3); lcd.print((indice + 1).ToString()); lcd.setCursor(4, 3); lcd.print(nombresDeLosReles[indice]); // Mientras no pulses la tecla Enter, sigue las demás intrucciones. while ((tecla2 = Console.ReadKey(true).Key) != digitalRead(A5)) { // ¿Haz pulsado flecha arriba? if (tecla2 == digitalRead(A1)) // Sí. Ejecuta código dentro de ella. { indice--; // Decrementa la variable indice. // ¿indice es menor que 0? if (indice < 0) // Sí. { indice = 7; } } // Entonces. ¿Haz pulsado flecha abajo? else if (tecla2 == digitalRead(A2)) // Sí. { indice++; // Incrementa la variable indice. // ¿indice es mayor o igual que 8? if (indice >= 8) // Sí. { indice = 0; } } lcd.setCursor(2, 3); lcd.print((indice + 1).ToString()); lcd.setCursor(4, 3); lcd.print(nombresDeLosReles[indice]); } Inicio(); } else if (index == 0) { break; } } } } void Inicio() { //Console.SetWindowSize(20, 5); // Establece el ancho y alto de la ventana. lcd.clear(); // Limpiar ventana. lcd.setCursor(2, 0); // Posición del cursor. lcd.print("Nombre de Relés: "); lcd.setCursor(0, 3); lcd.print(" ATRÁS GUARDAR "); //######################################################################################### // Este código es de C#, ya lo pasaré a Arduino con su EEPROM interna o una tarjeta SD // que también se puede leer archivo de texto tipo *.txt. /* if (cargado == false) { // ¿Existe el archivo de texto? if (File.Exists("NombresReles.txt")) { // Supone un archivo con 8 lineas de 16 char completas aunque sea con espacios. nombresDeLosReles = File.ReadAllLines("NombresReles.txt"); int a, b, c; for (a = 0; a < 8; a++) { for (b = 0; b < 16; b++) { for (c = 0; nombresDeLosReles[a][b] != roALFANUMERICO[c]; c++) { ; } roINDICE_ARRAY[a][b] = c; } } } cargado = true; } */ //######################################################################################### MostrarLineaNombre(); lcd.setCursor(2, 1); lcd.print(roNUMERICO[roINDICE_NUMERICO]); if (textBox == 0) { lcd.setCursor(2, 1); } else { lcd.setCursor(4 + coordenadaX, 1); } } void MostrarLineaNombre() { lcd.setCursor(4, 1); for (int a = 0; a < 16; a++) { lcd.print(roALFANUMERICO[roINDICE_ARRAY[roINDICE_NUMERICO][a]]); } }
Gracias.