[SOLUCIONADO] Apagar display de 7 segmentos

Buenas noches,

¿Es posible apagar, luego de x cantidad de tiempo, un display (*) de 7 segmentos (sin componente físico adicional, relay por ejemplo) solo con instrucciones en el código?
He googleado y no encuentro al respecto.

(*) dos displays de un digito conectados cada uno a un 74HC595

Gracias por la atención.

Todos los segmentos se encienden por combinación de 1 y 0. Asi que si apagas a todos, tendras un Display apagado.

Un 0 como es, todos los segmetos menos el g apagados, pues apaga el g también y tienes display apagado.

Conclusión, define un dígito especial que sea apagar.

hola surbyte, gracias por la respuesta.

Mira, estoy trabajando con esto:

byte numero[] = {B00011000, B01111011, B00101100, B00101001, B01001011, B10001001, B10001000, B00111011, B00001000, B00001001};

    void mostrar_numero(int x) {
    shiftOut(dataPIN, clockPIN, MSBFIRST, numero[x]);
}

      void display7seg(int x) {
      digitalWrite (latchPIN, LOW);
      mostrar_numero(x/100);  //se cambió el orden (DIFERENTE AL CONTADOR DE 0 A 99) para que aparezca primero las UNIDADES    
      mostrar_numero(x%10);
      mostrar_numero((x/10)%10);
      digitalWrite (latchPIN, HIGH);
}

y empezando con lo siguiente:

void loop() {

  display7seg(0); //para que el display muestre el 00

Luego de un minuto de duración del juego, donde el puntaje aumenta y disminuye se muestra:

display7seg(aciertos);

El puntaje (aciertos) queda durante quince segundos después de haber acabado el juego y luego se pone el display en 00 (CERO-CERO) y se queda allí hasta resetear la Arduino para empezar el juego nuevamente.

Lo que busco es que después de un período de inactividad (tres minutos por ejemplo), el display se apague y se encienda nuevamente si se resetea para iniciar el juego.

He probado con varias formas y no encuentro la solución. Probé al inicio con un byte numero[] = {B11111111}; y se inicia con el display apagado. lo hice para probar si con lo mismo puedo apagarlo al final, pero no lo logré.

Me das una mano con esto por favor.

Gracias!!!

He probado con varias formas y no encuentro la solución. Probé al inicio con un
Code: [Select]
byte numero = {B11111111};
y se inicia con el display apagado. lo hice para probar si con lo mismo puedo apagarlo al final, pero no lo logré.

porque no lo has logrado?
Si eso apaga tu display eso es lo que debes usar.

Veamos tu problema.

byte numero[] = {B00011000, B01111011, B00101100, B00101001, B01001011, B10001001, B10001000, B00111011, B00001000, B00001001, B11111111}; // el 10mo digito es el que apaga

si solo pones

mostrar_numero(10);

ya debería funcionar.

He probado (es el 11avo) aumentando un 12avo para que se apaguen los dos displays (solo se apagaba uno):

byte numero[] = {B00011000, B01111011, B00101100, B00101001, B01001011, B10001001, B10001000, B00111011, B00001000, B00001001, B11111111, B11111111}; // el 11avo y 12avo digitos son los que apagan ambos displays

Esto funciona si lo pruebo independientemente:

mostrar_numero(11);
mostrar_numero(12);

Mas no funciona cuando lo pongo aquí, dónde si funciona todo lo demás:

  if (!fin) {
    tone(BEEP, 400);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 800);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 3000);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 1500);
    delay(200);
    noTone(BEEP);
    Serial.println("FIN DEL JUEGO");
    myservo2.write(0); // termina el tiempo de millis programado y el servo regresa a CERO grados
    myservo3.write(0); // termina el tiempo de millis programado y el servo regresa a CERO grados
    myservo4.write(0); // termina el tiempo de millis programado y el servo regresa a CERO grados
    myservo5.write(0); // termina el tiempo de millis programado y el servo regresa a CERO grados
    digitalWrite(LEDVERDE, LOW); // termina el tiempo de millis programado y el LED verde se apaga
    digitalWrite(LEDROJO, HIGH); // termina el tiempo de millis programado y el LED rojo se enciende
    delay(5000);
    digitalWrite(LEDROJO, LOW); // termina el delay anterior y el LED rojo se apaga 
    Serial.println("DEBEN APAGARSE DISPLAYS DESPUES DE 5000");
    delay(5000);
    mostrar_numero(11); //NO FUNCIONA
    mostrar_numero(12); //NO FUNCIONA
    Serial.println("DISPLAYS APAGADOS");
    delay(5000);

    fin = 1;
  }

En realidad deberías hacer una rutina simil a esta

     void display7seg(int x) {
      digitalWrite (latchPIN, LOW);
      mostrar_numero(x/100);  //se cambió el orden (DIFERENTE AL CONTADOR DE 0 A 99) para que aparezca primero las UNIDADES   
      mostrar_numero(x%10);
      mostrar_numero((x/10)%10);
      digitalWrite (latchPIN, HIGH);
}

que solo coloque eso que hemos conversado

algo asi

     void apagar7seg(int x) {
      digitalWrite (latchPIN, LOW);
      mostrar_numero(10);  
      mostrar_numero(11);
      digitalWrite (latchPIN, HIGH);
  }

Tienes que imitar lo mismo que haces cuando accionas un número.

Ok
He incluido el nuevo void y dado la instrucción :

apagar7seg(11);
apagar7seg(12);

Pero solo se apaga el display de Unidades, el de Decenas se encienden todos los 8 segmentos (el Punto incluido). Sucede con ambas instrucciones juntas (11) y (12), y también si sólo pongo cualquiera de ellas unitariamente.

A ver para que el de decenas se apague sigue la lógica que usabas antes.

porque lo haces con 11 y 12 y yo te estoy hablando de 10 y corrige 11
Los números en un vector empiezan en 0 y en tu caso termina en 11

Perfecto surbyte, muchas gracias. Siempre tan amable y gentil.
Solucionado el problema.
Saludos