Controlar display mediante array multidimensional

Buenas a todos,

Estos días estuve remenando con un display que me encontré por casa y haciendo pruebas para ir viendo como funcionaba y eso. Una vez supe qué hacía cada pin me puse con el código, pero no consigo que funcione.

Tengo que decir que programando en C no sé casi nada, soy programador en PHP y JavaScript, así que se me escapan muchas cosas.

// Dibujar un número
// number = número a dibujar
// segment = número del display en el cual dibujarlo (el display es doble) 
void printNumber(int number, int segment) {

  // a, b, c, d, e, f, g corresponden a los diferentes segmentos del display
  const int segmentos_numeros[][7] = {
    {a, b, c, d, e, f},     // 0
    {c, d},                 // 1
    {b, c, f, e, g},        // 2
    {b, c, d, e, g},        // 3
    {a, g, c, d},           // 4
    {a, b, d, e, g},        // 5
    {a, b, d, e, f, g},     // 6
    {b, c, d},              // 7
    {a, b, c, d, e, f, g},  // 8
    {a, b, c, d, g}         // 9
  };

  // Poner el número del display en GND para encender los segmentos de ése
  digitalWrite(segment, LOW);
  // Por cada segmento del array anterior, encenderlo
  for (int pos = 0; pos <= sizeof(segmentos_numeros[number]); pos++) {
    digitalWrite(segmentos_numeros[number][pos], HIGH);
  }
}

Antes lo tenía con funciones, tipo

void print1() {
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
}

Pero quedaba un código monstruoso y creo que debe de haber alguna forma de automatizar un poco el proceso digo yo…

Saludos y muchas gracias!

Si buscas en los tutoriales de este foro, en Search de este foro encontrarás muchos modos similares.
Activas los bits que encenderan los segumentos y creas un array.
Busca contadores 7 segmentos

este es el array para display cátodo común

const byte digito[10] = { 
                          0b0111111, // 0
                          0b0000110, // 1
                          0b1011011, // 2
                          0b1001111, // 3
                          0b1100110, // 4
                          0b1101101, // 5
                          0b1111101, // 6
                          0b0000111, // 7
                          0b1111111, // 8
                          0b1101111};// 9

Si necesitas ánodo común lo inviertes.

surbyte:
Si buscas en los tutoriales de este foro, en Search de este foro encontrarás muchos modos similares.
Activas los bits que encenderan los segumentos y creas un array.
Busca contadores 7 segmentos

este es el array para display cátodo común

const byte digito[10] = { 

0b0111111, // 0
                         0b0000110, // 1
                         0b1011011, // 2
                         0b1001111, // 3
                         0b1100110, // 4
                         0b1101101, // 5
                         0b1111101, // 6
                         0b0000111, // 7
                         0b1111111, // 8
                         0b1101111};// 9





Si necesitas ánodo común lo inviertes.

Gracias por la respuesta surbyte.

No entiendo muy bien lo que quieres decir. Esos "0b1101111" hacen referencia al número 9 por ejemplo? O hace referencia a los pines que son necesarios para que aparezca el número 9 en el display?

En caso de que haga referencia al número 9, quiere decir que yo tengo que buscar los bytes correspondientes a los que uso yo? (a, b, c, d, e, f, g).

Lo que pasa es que depende del número que quiero encender, tengo que encender más o menos segmentos, de ahí el problema con el array multidimensional, ya que no todos los sub-arrays son de la misma longitud y me da un error...

EDIT: Vale, por lo que he podido encontrar aquí, lo que funciona mejor es decir a TODOS los pines lo que tienen que hacer, ya sea encenderse o apagarse. Lo que yo hacía era apagarlos todos y luego encender los que necesitaba. En el ejemplo de esa web lo que hacen es poner todos los pines por orden desde el 2 y ir sumando el contador, yo tendré que hacerlo en otro array ya que al tener los pines digitales ocupados con otras cosas (estoy ampliando un proyecto existente) los pines de los segmentos los tengo en los analogicos. Esta noche hago la prueba :slight_smile:

Gracias por la orientación surbyte!

Intentaré responder pero tu también intenta ser mas específico. Por específico te pido que describas el hardware que estas considerando en tu proyecto.
Puedes comandar un dsiplay directamente desde Arduino.
Puedes hacerlo via integrados BCD to 7 segmentos como el 74LS47 o 48. Solo 4 bits controlan los 7 segmentos y un decodificador ilumina sea Anodo Comun 74LS47 o cátodo común 74LS48.
Puedes hacer via shift registers como el 74LS595
o puedes usar el MAX7219 que tiene capacidad de comandar 8 displays multiplexados usando solo 3 pines SPI.

Por supuesto hay otras opciones I2C y SPI.

Asi que dime como quieres comandar ese display y podemos seguir conversando.

Disculpa la demora surbyte, he andado algo liado últimamente.

surbyte:
Intentaré responder pero tu también intenta ser mas específico. Por específico te pido que describas el hardware que estas considerando en tu proyecto.
Puedes comandar un dsiplay directamente desde Arduino.
Puedes hacerlo via integrados BCD to 7 segmentos como el 74LS47 o 48. Solo 4 bits controlan los 7 segmentos y un decodificador ilumina sea Anodo Comun 74LS47 o cátodo común 74LS48.
Puedes hacer via shift registers como el 74LS595
o puedes usar el MAX7219 que tiene capacidad de comandar 8 displays multiplexados usando solo 3 pines SPI.

Por supuesto hay otras opciones I2C y SPI.

La verdad es que todo eso que me comentas me suena a chino. Yo me encontré una pieza de electrónico en el garage de mi padre y desoldé las partes que me parecieron que podría usar (Desde mi ignorancia de arduino claro).

El display es este:


Que a su vez, estaba conectado con este componente:

y que ambos estaban en este circuito impreso (el cual ya no tengo por desgracia):

Este es el esquema de las patas del display que conseguí hacer un día con dos cables:

surbyte:
Asi que dime como quieres comandar ese display y podemos seguir conversando.

Me gustaría controlarlo con el menor número de pines de arduino posibles (ahora mismo gasto 9) y, a su vez, gastando el menor número de resistencias. Según me han dicho cada segmento debería tener una de 220Ohm, pero sólo tengo una, me tiene que llegar un pack de 50...

Muchas gracias!

Ahhh tu eres el de los componentes que tenia tu padre.
Bueno. todo gira en torno al display y al driver que pones patas arriba pero no dices que código tiene. Si lo hiciste en el otro post no lo leí aún.
Asi que responde que código tiene el integrado y vemos como seguir.
No vale la pena sugerirte otra cosa cuando tienes una plaqueta que obviamente quieres usar.
Asi que hay que deducir como usar la plaqueta y no al revés.
A menos que no quieras usar la plaqueta?

Hola surbyte,

Bueno, usar la plaqueta o no… Si me tiene que dejar libres pines del arduino por mi estupendo :slight_smile:

En la plaqueta, en la parte de abajo pone lo siguiente:

“106INH”
una redonda que dentro pone: “g h3”
(esta parte no se ve muy bien) pero parece que ponga “BOI”
y luego más alejado a la derecha “e3”

Si tiene que ser muy complicada la plaqueta buscamos otra sin ningún problema.

Manejémosnos de este modo.
Toma una buena foto con zoom con tu Android o Iphone y luego la subes usando www.tinypic.com
Del lado componentes (serigrafía) y del lado cobre.

surbyte:
Manejémosnos de este modo.
Toma una buena foto con zoom con tu Android o Iphone y luego la subes usando www.tinypic.com
Del lado componentes (serigrafía) y del lado cobre.

Las fotos las subía a mi dropbox antes, supongo que debe ser lo mismo, estas las subo a tinypic por si acaso.

No sé a que te refieres con lado componentes y lado cobres, he hecho por encima y por debajo por si acaso

Cuesta de ver la H al final de 106INH

Gracias

No hablábamos de la plaqueta? Del componente si tu no ves el código yo en esas fotos no leo nada.

surbyte:
No hablábamos de la plaqueta? Del componente si tu no ves el código yo en esas fotos no leo nada.

Por plaqueta te refieres al plástico dónde venían soldados el display y el componente? Esa plaqueta ya no la tengo desgraciadamente. Tan sólo tengo la foto que puse más arriba, que la hice para ver dónde iban las pistas :frowning:

Para accionar el display con minimos componentes o bien usas dos 74HC595 o un MAX7219.
Hay numeras guias en documentación y en internet al respecto.

Gracias por la respuesta surbyte.

Creo que buscaré información sobre el MAX7219 y algún tutorial o algo similar en castellano a ver si lo veo claro y me pongo a ello :slight_smile:

Esta por todos lados, es un caballito de batalla.
En documentación o en Google: Arduino Max7219 conexionado o en este foro, busca en Search arriba a la derecha y pones MAX7219.
Maneja 8 digitos ánodo o cátodo común. Control de brillo digital o analógico.
usas 3 pines.