Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > ASM y Microcontroladores
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-05-2022
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 454
Poder: 21
REHome Va por buen camino
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.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Adaptar código a FMX Android wilcg FireMonkey 5 11-01-2018 18:11:42
Cargar Arduino UNO mediante Delphi 7 mariano22 ASM y Microcontroladores 7 20-07-2017 14:40:35
Delphi y Arduino REHome OOP 3 14-07-2017 14:14:42
Kit Arduino para Delphi K-ba ASM y Microcontroladores 9 25-03-2017 16:58:01
Comunicar Rad Studio XE8 con Arduino por Bluetooth shadowdark93 Desarrollo en Delphi para Android 2 10-04-2016 03:43:15


La franja horaria es GMT +2. Ahora son las 19:36:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi