Ver Mensaje Individual
  #3  
Antiguo 26-05-2022
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 454
Reputación: 21
REHome Va por buen camino
Lo tendré en cuenta. Por ahora solo hice ahorrar RAM.

Código:
// Variables.
byte coordenadaX = 0;          // Coordenada X del textBox del nombre del Relé.
byte index = 0;                // Índice de ATRAS y GUARDAR.
byte 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.
const char ALFANUMERICO[] PROGMEM =
{
  '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.
byte indiceArray[][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 }
};

const char NUMERICO[] PROGMEM = { '1', '2', '3', '4', '5', '6', '7', '8' };
byte indiceNumerico = 0;

void MostrarLineaNombre()
{
  lcd.setCursor(4, 1);
  for (byte a = 0; a < 16; a++)
  {
    lcd.print(ALFANUMERICO[indiceArray[indiceNumerico][a]]);
  }
}

void Inicio()
{
  lcd.clear();                        // Limpiar ventana.
  lcd.setCursor(2, 0);                // Posición del cursor.
  lcd.print(F("Nombre de Reles:    "));
  lcd.setCursor(0, 3);
  lcd.print(F("  ATRAS     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] != ALFANUMERICO[c]; c++)
            {
              ;
            }
            indiceArray[a][b] = c;
          }
        }
      }
      cargado = true;
    }
  */

  if (cargado == false)
  {
      // Supone un archivo con 8 lineas de 16 char completas aunque sea con espacios.
//      nombresDeLosReles = File.ReadAllLines("NombresReles.txt");
      byte a, b, c;
      for (a = 0; a < 8; a++)
      {
        for (b = 0; b < 16; b++)
        {
          for (c = 0; nombresDeLosReles[a][b] != ALFANUMERICO[c]; c++)
          {
            ;
          }
          indiceArray[a][b] = c;
        }
      }
    cargado = true;
  }
  //#########################################################################################

  MostrarLineaNombre();
  lcd.setCursor(2, 1);
  lcd.print(NUMERICO[indiceNumerico]);
  if (textBox == 0)
  {
    lcd.setCursor(2, 1);
  }
  else
  {
    lcd.setCursor(4 + coordenadaX, 1);
  }
}

void NombreReles_Principal()
{
  //  ConsoleKey tecla, tecla2;
  byte indice = 0;

  Inicio();

  while (true)
  {
    lcd.cursor(); // Mostrar cursor.
    lcd.blink();  // Cursosr parpadeando.
    //tecla = Console.ReadKey(true).Key;

    // ¿Has pulsado tecla flecha arriba?
    if (HIGH == 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 (HIGH == 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 (HIGH == digitalRead(A2)) // Sí.
    {
      if (textBox == 0)
      {
        indiceNumerico--;
        if (indiceNumerico < 0)
        {
          indiceNumerico = 7;
        }
        lcd.setCursor(2, 1);
        lcd.print(NUMERICO[indiceNumerico]);
        MostrarLineaNombre();
        lcd.setCursor(2, 1);
      }
      else // textBox == 1
      {
        indiceArray[indiceNumerico][coordenadaX]--;
        if (indiceArray[indiceNumerico][coordenadaX] < 0)
        {
          indiceArray[indiceNumerico][coordenadaX] = 85;
        }
        lcd.print(ALFANUMERICO[indiceArray[indiceNumerico][coordenadaX]]);
        lcd.setCursor(4 + coordenadaX, 1);
      }
    }
    // Entonces. ¿Haz pulsado flecha arriba?
    else if (HIGH == digitalRead(A1)) // Sí.
    {
      if (textBox == 0)
      {
        indiceNumerico++;
        if (indiceNumerico >= 8)
        {
          indiceNumerico = 0;
        }
        lcd.setCursor(2, 1);
        lcd.print(NUMERICO[indiceNumerico]);
        MostrarLineaNombre();
        lcd.setCursor(2, 1);
      }
      else // textBox == 1
      {
        indiceArray[indiceNumerico][coordenadaX]++;
        if (indiceArray[indiceNumerico][coordenadaX] > 85)  // Aquí es > 85 (o >= 86) porque 86 es la cantidad
        { // total y al alcanzarla ahí paso al comienzo (0).
          indiceArray[indiceNumerico][coordenadaX] = 0;
        }
        lcd.print(ALFANUMERICO[indiceArray[indiceNumerico][coordenadaX]]);
        lcd.setCursor(4 + coordenadaX, 1);
      }
    }
    // Entonces. ¿Haz pulsado la tecla Enter?
    else if (HIGH == digitalRead(A5)) // Sí.
    {
      lcd.cursor();   // Ocultar cursor.
      lcd.noBlink();  // Sin parpadeos el cursor.
      lcd.setCursor(0, 3);
      lcd.print("> ATRAS     GUARDAR ");
      index = 0;
      while (digitalRead(A5))
      {
        if ((HIGH == digitalRead(A4)) || (HIGH == digitalRead(A3)))
        {
          index = 1 - index;  // Si vale 0 valdrá 1, si vale 1 valdrá 0.
          lcd.setCursor(0, 3);
          if (index == 0)
          {
            lcd.print(F("> ATRAS     GUARDAR "));
          }
          else
          {
            lcd.print(F("  ATRAS   > GUARDAR "));
          }
        }
      }
      if (index == 1)  // Se pulsó Enter en Guardar.
      {
        nombresDeLosReles[8];
        for (byte a = 0; a < 8; a++)
        {
          for (byte b = 0; b < 16; b++)
          {
            //            nombresDeLosReles[a] += ALFANUMERICO[indiceArray[a][b]];
          }
        }

        // 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(F("Haz guardado:"));
        lcd.setCursor(2, 3);
        lcd.print((indice + 1));
        lcd.setCursor(4, 3);
        //lcd.print(nombresDeLosReles[indice]);

        // Mientras no pulses la tecla Enter, sigue las demás intrucciones.
        while (HIGH == digitalRead(A5))
        {
          // ¿Haz pulsado flecha arriba?
          if (HIGH == 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 (HIGH == 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));
          lcd.setCursor(4, 3);
          lcd.print(nombresDeLosReles[indice]);
        }
        Inicio();
      }
      else if (index == 0)
      {
        break;
      }
    }
  }
}
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita