No me funciona el Virtual Terminal con Arduino [SOLUCIONADO]

Buenas:

Estoy usando el Proteus 8.12 SP0 simulando Arduino UNO, LCD 20x2 y el Virtual Terminal RS232, precisamente ahí debe motrar por ejemplo este mensaje al pulsar un pulsador.

Serial.print (F("Esta es la pulsación DERECHA nº: "));

Código cómpleto de Arduino hasta ahora este este ejemplo.

// Include el código de la librería.
#include <LiquidCrystal.h>

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
//LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Pin 10 para saber que es luz de fondo.
//const byte LuzFondo = 10;

// Variables.
// Pulsador Arriba.
byte estadoActualArriba1 = 0;
byte estadoActualArriba2 = 0;
byte estadoUltimoArriba = 0;
int contadorArriba = 0;

// Pulsador Abajo.
byte estadoActualAbajo1 = 0;
byte estadoActualAbajo2 = 0;
byte estadoUltimoAbajo = 0;
int contadorAbajo = 0;

// Pulsador Izquierda.
byte estadoActualIzquierda1 = 0;
byte estadoActualIzquierda2 = 0;
byte estadoUltimoIzquierda = 0;
int contadorIzquierda = 0;

// Pulsador Derecha.
byte estadoActualDerecha1 = 0;
byte estadoActualDerecha2 = 0;
byte estadoUltimoDerecha = 0;
int contadorDerecha = 0;

// Pulsador Ok / Enter.
byte estadoActualEnter1 = 0;
byte estadoActualEnter2 = 0;
byte estadoUltimoEnter = 0;
int contadorEnter = 0;

void setup()
{
  Serial.begin(115200); // 115200

  // La pantalla es de 20 caracteres y 4 filas.
  lcd.begin(20, 4);

  // Indicar luz de fondo como salida.
  // pinMode(LuzFondo, OUTPUT);

  // Configuración de pines como salidas digitales.
  pinMode(13, OUTPUT);

  // Configuración de pines como entradas digitales.
  pinMode(A1, INPUT); // Arriba.
  pinMode(A2, INPUT); // Abajo.
  pinMode(A3, INPUT); // Izquierda.
  pinMode(A4, INPUT); // Derecha.
  pinMode(A5, INPUT); // Ok / Enter.

  lcd.clear();                          // Borra la pantalla y su posición superior izquierda.
  lcd.setCursor(0, 1);                  // Línea 2 del LCD.
  lcd.print(F(" Pantalla principal ")); // Muestra título en la LCD.
}

void loop()
{
  // Pulsador Arriba.
  estadoActualArriba1 = digitalRead(A1);
  delay(10);
  estadoActualArriba2 = digitalRead(A1);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualArriba1 == estadoActualArriba2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualArriba1 != estadoUltimoArriba)
    {
      if (estadoActualArriba1 == HIGH)
      {
        contadorArriba = contadorArriba + 1;
        Serial.print (F("Esta es la pulsación ARRIBA nº: "));
        Serial.println(contadorArriba);
      }
    }
  }
  estadoUltimoArriba = estadoActualArriba1;

  if (contadorArriba % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }

  // Pulsador Abajo.
  estadoActualAbajo1 = digitalRead(A2);
  delay(10);
  estadoActualAbajo2 = digitalRead(A2);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualAbajo1 == estadoActualAbajo2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualAbajo1 != estadoUltimoAbajo)
    {
      if (estadoActualAbajo1 == HIGH)
      {
        contadorAbajo = contadorAbajo + 1;
        Serial.print (F("Esta es la pulsación ABAJO nº: "));
        Serial.println(contadorAbajo);
      }
    }
  }
    estadoUltimoAbajo = estadoActualAbajo1;

  if (contadorAbajo % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }

  // Pulsador Izquierda.
  estadoActualIzquierda1 = digitalRead(A3);
  delay(10);
  estadoActualIzquierda2 = digitalRead(A3);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualIzquierda1 == estadoActualIzquierda2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualIzquierda1 != estadoUltimoIzquierda)
    {
      if (estadoActualIzquierda1 == HIGH)
      {
        contadorIzquierda = contadorIzquierda + 1;
        Serial.print (F("Esta es la pulsación IZQUIERDA nº: "));
        Serial.println(contadorIzquierda);
      }
    }
  }
  estadoUltimoIzquierda = estadoActualIzquierda1;

  if (contadorIzquierda % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }
  
  // Pulsador Derecha.
  estadoActualDerecha1 = digitalRead(A4);
  delay(10);
  estadoActualDerecha2 = digitalRead(A4);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualDerecha1 == estadoActualDerecha2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualDerecha1 != estadoUltimoDerecha)
    {
      if (estadoActualDerecha1 == HIGH)
      {
        contadorDerecha = contadorDerecha + 1;
        Serial.print (F("Esta es la pulsación DERECHA nº: "));
        Serial.println(contadorDerecha);
      }
    }
  }
  estadoUltimoDerecha = estadoActualDerecha1;

  if (contadorDerecha % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }
  
  // Pulsador OK / Enter.
  estadoActualEnter1 = digitalRead(A5);
  delay(10);
  estadoActualEnter2 = digitalRead(A5);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualEnter1 == estadoActualEnter2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualEnter1 != estadoUltimoEnter)
    {
      if (estadoActualEnter1 == HIGH)
      {
        contadorEnter = contadorEnter + 1;
        Serial.print (F("Esta es la pulsación OK / ENTER nº: "));
        Serial.println(contadorEnter);
      }
    }
  }
    estadoUltimoEnter = estadoActualEnter1;

  if (contadorEnter % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }
}

Dejo esquema simulador Arduino y hex para que puedan probar.

LCD_Menu_y_submenu_01.zip (231.3 KB)

Tal y como has montado el circuito no te va detectar las entradas correctamente. Tienes que activar la resistencia interna de los pines para que tenga siempre un nivel alto cuando no pulses ningun botón.

  // Configuración de pines como entradas digitales.
  pinMode(A1, INPUT_PULLUP); // Arriba.
  pinMode(A2, INPUT_PULLUP); // Abajo.
  pinMode(A3, INPUT_PULLUP); // Izquierda.
  pinMode(A4, INPUT_PULLUP); // Derecha.
  pinMode(A5, INPUT_PULLUP); // Ok / Enter.

Una vez hecho esto la simulación ya funciona y te muestra cosas por el virtual terminal. Es más, dado que se usa la resistencia interna, las resistencias R1 a R5 sobran.


captura2

Una ultima recomendación: no uses tildes en el programa de arduino. Si no obtendras código extraños en lo que te muestra en el virtual terminal.

Muchas gracias por la explicación. Una pena que no se pueda meter caracteres UTF-0 o especiales como la ñ o tildes.

Aquí se nota que han comentado en su tiempo.
https://forum.arduino.cc/t/n-y-letras-con-tilde-en-arduino/502952

Voy a seguir haciendo menú con submenú de este LCD.

Saludos.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.