Adaptar código a Arduino
Buena gente.
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#:
Código:
using System;
using System.IO;
namespace LCD_Menu_con_submenus_Consola_01
{
public class NombresReles
{
// Variables.
static int coordenadaX = 0; // Coordenada X del textBox del nombre del Relé.
static int index = 0; // Índice de ATRÁS y GUARDAR.
static int textBox = 0; // 0 para el número de Relé (de 1 al 8) y 1 para el texto del Relé (16 char).
static string[] nombresDeLosReles; // Líneas que al final se van a guardar en Archivo.txt.
static 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.
static readonly char[] roALFANUMERICO = new char[]
{
'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.
static readonly int[][] roINDICE_ARRAY = new int[][]
{
new int[] { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 },
new int[] { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 },
new int[] { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 },
new int[] { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 },
new int[] { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 },
new int[] { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 },
new int[] { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 },
new int[] { 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 }
};
static readonly char[] roNUMERICO = new char[] { '1', '2', '3', '4', '5', '6', '7', '8' };
static int roINDICE_NUMERICO = 0;
public static void NombreReles_Principal()
{
ConsoleKey tecla, tecla2;
int indice = 0;
Inicio();
while (true)
{
Console.CursorVisible = true; // Mostrar cursor.
tecla = Console.ReadKey(true).Key;
// ¿Has pulsado tecla flecha arriba?
if (tecla == ConsoleKey.RightArrow) // Sí.
{
if (textBox == 0)
{
Console.SetCursorPosition(4, 1);
textBox = 1;
}
else // textBox == 1
{
if (coordenadaX < 15)
{
coordenadaX++;
Console.SetCursorPosition(4 + coordenadaX, 1);
}
}
}
// Entonces. ¿Haz pulsado flecha izquierda?
else if (tecla == ConsoleKey.LeftArrow) // Sí.
{
if (textBox == 1)
{
if (coordenadaX > 0)
{
coordenadaX--;
Console.SetCursorPosition(4 + coordenadaX, 1);
}
else
{
Console.SetCursorPosition(2, 1);
textBox = 0;
}
}
}
// Entonces. ¿Haz pulsado flecha abajo?
else if (tecla == ConsoleKey.DownArrow) // Sí.
{
if (textBox == 0)
{
roINDICE_NUMERICO--;
if (roINDICE_NUMERICO < 0)
{
roINDICE_NUMERICO = 7;
}
Console.SetCursorPosition(2, 1);
Console.Write(roNUMERICO[roINDICE_NUMERICO]);
MostrarLineaNombre();
Console.SetCursorPosition(2, 1);
}
else // textBox == 1
{
roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX]--;
if (roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX] < 0)
{
roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX] = 85;
}
Console.Write(roALFANUMERICO[roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX]].ToString());
Console.SetCursorPosition(4 + coordenadaX, 1);
}
}
// Entonces. ¿Haz pulsado flecha arriba?
else if (tecla == ConsoleKey.UpArrow) // Sí.
{
if (textBox == 0)
{
roINDICE_NUMERICO++;
if (roINDICE_NUMERICO >= 8)
{
roINDICE_NUMERICO = 0;
}
Console.SetCursorPosition(2, 1);
Console.Write(roNUMERICO[roINDICE_NUMERICO]);
MostrarLineaNombre();
Console.SetCursorPosition(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;
}
Console.Write(roALFANUMERICO[roINDICE_ARRAY[roINDICE_NUMERICO][coordenadaX]].ToString());
Console.SetCursorPosition(4 + coordenadaX, 1);
}
}
// Entonces. ¿Haz pulsado la tecla Enter?
else if (tecla == ConsoleKey.Enter) // Sí.
{
Console.CursorVisible = false;
Console.SetCursorPosition(0, 3);
Console.Write("> ATRÁS GUARDAR ");
index = 0;
while ((tecla2 = Console.ReadKey(true).Key) != ConsoleKey.Enter)
{
if ((tecla2 == ConsoleKey.RightArrow) || (tecla2 == ConsoleKey.LeftArrow))
{
index = 1 - index; // Si vale 0 valdrá 1, si vale 1 valdrá 0.
Console.SetCursorPosition(0, 3);
if (index == 0)
{
Console.Write("> ATRÁS GUARDAR ");
}
else
{
Console.Write(" 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);
// 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á.
Console.Clear();
Console.SetCursorPosition(2, 1);
Console.Write("Haz guardado:");
Console.SetCursorPosition(2, 3);
Console.Write((indice + 1).ToString());
Console.SetCursorPosition(4, 3);
Console.Write(nombresDeLosReles[indice]);
// Mientras no pulses la tecla Enter, sigue las demás intrucciones.
while ((tecla2 = Console.ReadKey(true).Key) != ConsoleKey.Enter)
{
// ¿Haz pulsado flecha arriba?
if (tecla2 == ConsoleKey.UpArrow) // 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 == ConsoleKey.DownArrow) // Sí.
{
indice++; // Incrementa la variable indice.
// ¿indice es mayor o igual que 8?
if (indice >= 8) // Sí.
{
indice = 0;
}
}
Console.SetCursorPosition(2, 3);
Console.Write((indice + 1).ToString());
Console.SetCursorPosition(4, 3);
Console.Write(nombresDeLosReles[indice]);
}
Inicio();
}
else if (index == 0)
{
break;
}
}
}
}
static void Inicio()
{
Console.SetWindowSize(20, 5); // Establece el ancho y alto de la ventana.
Console.Clear(); // Limpiar ventana.
Console.SetCursorPosition(2, 0); // Posición del cursor.
Console.Write("Nombre de Relés: ");
Console.SetCursorPosition(0, 3);
Console.Write(" ATRÁS GUARDAR ");
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();
Console.SetCursorPosition(2, 1);
Console.Write(roNUMERICO[roINDICE_NUMERICO]);
if (textBox == 0)
{
Console.SetCursorPosition(2, 1);
}
else
{
Console.SetCursorPosition(4 + coordenadaX, 1);
}
}
static void MostrarLineaNombre()
{
Console.SetCursorPosition(4, 1);
for (int a = 0; a < 16; a++)
{
Console.Write(roALFANUMERICO[roINDICE_ARRAY[roINDICE_NUMERICO][a]]);
}
}
}
}
Código C de Arduino:
Código:
// 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]]);
}
}
Falla en el almacenamiento o detección de botones de Arduino que no se como se hace como en C#.
Gracias.
|