enviando datos a arduino desde teclado para iniciar y detener conteo

hola...llevo poco tiempo en arduino, y esta vez intento hacer un contador de objetos que inicie el conteo luego de haberle enviado '1' desde teclado a arduino, despues detener y resetear el conteo enviando '0' ( mando el codigo adjunto)...el problema que tengo es que una vez mandado el '1' a arduino y se ve que el led de tx(arduino) enciende...pero por mas que mande senales para que arduino lo vaya contando, no me muestra nada en el monitor serial alguien que me pueda ayudar con este problema por favor ahhh las senales que le mando a arduino es por medio de un pulsador

char mensaje;
int cont=0;
void setup()
{
  pinMode(7,INPUT);
  Serial.begin(9600);  
}
void loop()
{
  if(Serial.available()>0)
  {
    mensaje=Serial.read();
    if(mensaje=='1')
    {
      if(digitalRead(7)==1)
        {
            cont++;
            Serial.println(cont);
            delay(500);
        }   
    }
    else
    {
      if(mensaje=='0')
      {
        cont=0;
      }
    }
  }
}

Me deje mis placas arduino en el trabajo y no lo puedo probar. Pero proba este código.

char mensaje;
int cont=0;
void setup()
{
 pinMode(7,INPUT);
 Serial.begin(9600);  
}
void loop()
{
 while(Serial.available()>0)
 {
   mensaje=Serial.read();
   
 }
 
 if(mensaje=='1')
   {
     if(digitalRead(7)==1)
       {
           cont++;
           Serial.println(cont);
           delay(500);
       }   
   }
   else
   {
     if(mensaje=='0')
     {
       cont=0;
     }
   }
}

La idea es en el Serial.available(), solo leer el dato y ejecutar la acción después.

ok lov voy a probar...gracias de antemano

gracias JuanBorja me funciono muy bien !!!

Tu problema no es el código (visto por encima) sino el delay(500) que retrasa cualquier accionar que quieras darle luego. Cuando haces algo que debe reaccionar a algo como una señal de control no puedes DETENER el programa 500 mseg para hacer NADA. Eso es lo que ocurre cuando pones el delay(500). No hace nada por 500 mseg.

Tú código y el que sugirieron dice: si le envío una orden '1' y el pin 7 esta en HIGH cuenta indefinidamente de a 1 hasta que baje a LOW el pin 7. Entonces no responde a nada. Tu debes hacer otra cosa. En lugar de delay(500) debes usar millis() convenientemente. El reemplazo no es directo.

Prueba esto

char mensaje;
int cont          = 0;
byte estado       = 0;
unsigned long start;

void setup() {
  pinMode(7,INPUT);
  Serial.begin(9600);  
}

void loop() {
  while(Serial.available()>0) {
    mensaje = Serial.read();
    switch (mensaje) {
        case '1': start = millis();
                  estado = 1;
                  break; 
        case '0': estado = 0;
                  cont = 0;
                  break;
    }
  }
  
  if (estado)  {
      if (digitalRead(7) == HIGH && millis() - start > 500UL)  {
          cont++;
          Serial.println(cont);
          start = millis();
      }   
  }
}

NOTA:: JuanBorja, lee las normas y coloca el código como el post inicial y el mío. En las normas explica cómo.