Go Down

Topic: problema con reloj digital en display 7 segmentos (Read 960 times) previous topic - next topic

JavierJM

Jun 18, 2019, 10:50 pm Last Edit: Jun 18, 2019, 11:50 pm by surbyte Reason: Visualización de imágen
Hola buen día. Mi nombre es Javier, es mi primer post en el foro, espero sea en el foro correcto.

Llevo algo de tiempo manejando arduino, en cuanto a programación tengo algo de experiencia pero sinceramente me falta bastante, así pues les expongo mi problema.

Al día de hoy luego de casi un mes de informarme y buscando, experimentando, tengo un proyecto escolar entre manos el cual consiste en hacer un reloj digital con un rtc y un display de 4 dígitos 7 segmentos de ánodo común con tiras led rojas el cual no funciona.

De hecho les comento los materiales que tengo:
- Arduino nano.
- modulo ds1307 (rtc, lo uso por comunicación I2C).
- modulo tm1637 (explicaré por que estoy usando este modulo).
- transistores bjt PNP (TIP42C TO-220, BC327 TO-92).
- transistores bjt NPN (TIP31C TO-220).
- Octoclopadlorres (4n35)
- display 4 digitos 7 segmentos ánodo común.
- Tiras led 12v rojas automotrices (no son rgb).


Una disculpa pero de momento no tengo el esquema de como quedaría mi conexión, está en proceso.
Estoy usando el tm1637 para "ahorrarme conexiones" y por la librería que maneja (no sé si fue la mejor idea).

Si yo hago la conexión, tal cual como aparece en la imagen al final con el código, funciona correctamente, pero yo quería hacer es un display grande con tiras led.

Se me ocurrió desoldar el display que venia en el tm1637 realicé mis propias conexiones, los pines del tm1637 que corresponden a la alimentación vcc para el 7seg4dig los estoy usando con un arreglo de octos (4n35) y bjt pnp (ds327), el resto de pines se conectan normal al display lo cuales corresponderian a 0v.
No sé si me expliqué bien, de hecho funciona correctamente como si el display estuviera soldado al módulo.

finalmente, por falta de experiencia, pensé que podría usar todo este arreglo para usarlo con las tiras led, en vez de 5vcc para un display pequeño, pues 12v en los transistores PNP. pero cuando conecto el grande enciende mostrando solo ochos, y nunca hace la función de reloj.

No he logrado hacer que el grande funcione bien y estoy perdido de como hacerlo funcionar, no se si fue buena idea usar este modulo, si había una forma más fácil de hacer este proyecto usando las tiras led.

He encontrado proyectos parecidos pero antiguos en el foro de arduino que al final parece que no llegaron a una solución por lo que me animé a hacer el post y no sé si alguien me podría ayudar con esto.

Por ultimo, en cuanto a la programación, ya que es la primera vez que manejo el RTC logré apoyarme de un código que busqué en internet el cual adjunto con la imagen de la conexión básica y doy crédito a PentiumCadiz ya que me funcionó bastante bien.

Code: [Select]

// Reloj digital mostrado a través de un display de 4 dígitos (digitaltube), y con el tiempo
// proporcionado por un Tiny RTC de Catalex.

// Software programado por PentiumCadiz 7-1-17, basado en el ejemplo de la librería DS1307RTC
// y en el ejemplo de uso del display de Prometec  http://www.prometec.net/display-con-interface/

#include <TM1637.h>

#include <Wire.h>
#include <Time.h>
#include <TimeLib.h> //Esta libreria la agrego para que funcione el "tmElements_t tm"
#include <DS1307RTC.h>

#define CLK 9
#define DIO 8

TM1637 Display1(CLK, DIO);
  int8_t Digitos[] = {0,1,2,3};
  int horas;
  int minutos;
  boolean alterna;

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");

  Display1.set();
  Display1.init();
  
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();

    horas = tm.Hour;
    minutos = tm.Minute;
    CalculaDigitos(horas, minutos);
    if (alterna)
      {
        Display1.point(POINT_OFF);
        alterna = false;
      }
      else
      {
        Display1.point(POINT_ON);
        alterna = true;
      }
    
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

void CalculaDigitos( int hor, int minu)
   {
      int8_t Digit0 = minu %10 ;
      int8_t Digit1 = (minu % 100) / 10 ;
      int8_t Digit2 = hor % 10 ;
      int8_t Digit3 = (hor % 100) / 10 ;

      Digitos[3] = Digit0 ;
      Digitos[2] = Digit1 ;
      Digitos[1] = Digit2 ;
      Digitos[0] = Digit3 ;

      Display1.display(Digitos);
   }


gracias, saludos.
-Javier

surbyte

Te has explicado bastante bien pero.. yo al menos no termino de entender como estan conectados la tira led que mencionas y tampoco has dicho que tipo de tira led. Supongo que será común, y por común me refiero a que son varios leds en serie y punto.

Ahora el circuito que tienes es multiplexado por eso usas el tm1637. Es importante que dibujes lo mejor posible como has conectado las tiras led.

Tu problema seguramente esta asociado con la polarización de los transitores y el que mas afectado debe estar es el PNP.
Un PNP tiene que tener una tensión cercana a los 12V para estar al corte y proxima a 0 para que este saturado.
Ahora como llegas a los 12V? No creo por tu descripción que lo hagas correctamente.

Por eso necesitamos ver el esquema.

Te dejo un esquema de un segmento de alguien que hizo lo mismo


Fuente : link

Este es solo un ejemplo y no digo que lo hagas de este modo. Pero al menos observa como trabaja el PNP.
En este esquema hay un Decodificador 7447 pero eso lo puede hacer el mismo arduino.

JavierJM

#2
Jun 19, 2019, 06:12 am Last Edit: Jun 19, 2019, 12:33 pm by surbyte
Hola de nuevo, antes que nada gracias por la respuesta y el ejemplo si son de ayuda. Bueno luego de un descanso bien merecido, no puedo dormir sin parar de darle vueltas a esto... sin más rollo la verdad quiero aclarar 3 puntos breves.

1.- al principio al ser componentes que no había usado, a pesar de tener desoldado el tm1637 lo descarte e intente hacer un contador de 0 a 9999 usando el ULN2803, el display encendía pero no funcionaba correctamente.

2.- Busqué otra forma de hacer que funcionara, esta vez con transistores pero no logré que siquiera haga el contador.

3.- finalmente siguiendo por el lado de los transistores y luego de matarme mucho la cabeza encontré la programación que compartí y viendo que eran los componentes que yo tenia, lo aproveché y funciono en un display pequeño 4 digitos 7 segmentos de los convencionales de anodo común.

Tomando en cuenta el ultimo punto, la verdad no sé si es lo más correcto, apegarme al uso del tm1637 ya que como bien me dijiste Surbyte, si entiendo bien... el problema aquí es la cuestión de la alimentación y la polarización de los transistores, entonces lo estoy haciendo mal y es donde he estado atorado desde el inicio, no sé como darle solución a esto.

Para el diagrama no tengo arduino en proteus incluido y no logré un buen resultado, por otro lado intente hacer uno en fritzing y no me fue mejor decidí mejor dibujarlo.
La verdad espero se entienda intentaré ser breve al explicarlo.

Básicamente muestro en la parte izquierda simulaciones de los componentes, el RTC, los pines del arduino.
El tm1637 Lo que pasa es que lo dibuje de la misma forma que lo tengo como las fotos de evidencia, quiero que se entienda que los pines son la misma configuración a lo que sería un display de 4 digitos 7 segmentos.

Por ultimo, a la derecha intento dibujar y simular el display "4 sevseg" y cómo estaría la parte de la alimentación con el Octo y el tranistor PNP, ahí le dibujé la alimentación de +12v al PNP pero siendo sincero, al inicio por cuestiones de pruebas le puse los +5vcc del arduino para un display pequeño convencional anodo comun y funcionó correctamente tal cual está dibujado. De verdad disculpas hago lo mejor que puedo en este sentido del dibujo y para darme a explicar.

Dentro de mi falta de experiencia pensé que lo único que debía hacer es replicar esa configuración pero con la fuente de +12v a alas tiras led tal cual el diagrama, las conexiones de A-G directo al negativo de los segmentos de las tiras... Pero al conectar, siempre quedan encendidas en "ochos" no hay nada en corto realmente, todo sigue funcionando.

Entiendo que en algo estoy mal, y lo siento no veo en que es, estaba pensando en cambiar el display de ánodo a cátodo común, de hecho por eso usé al inicio el ULN2803.

Lo siento no tengo la marca o modelo de las tiras led, aclaro por si la duda, las tiras están simulando exactamente lo mismo que in display 4 digitos 7 segmentos de ánodo común, solo que en una escala mayor y alimentación de 12V. Dejo la foto de ejemplo de como estaría quedando el prototipo estas cuentan con una resistencia integrada cada 3 leds a lo que yo le digo que es un segmento y tu las puedes cortar dependiendo los segmentos que quieras usar.

Espero esto sea de ayuda esta información, gracias de nueva cuenta, buenas noches.













surbyte

De que valor es la Resistencia entre el fototransistor y el transistor PNP conecado a +12V. Tienes una R de 10K entre  Emisor y Base y luego en serie otra R sin valor?

Supongo que eso que leo como D1 a D4 son los digitos del tm1637.

Bien.. ahora entiendo mas o menos por donde van los tiros.

Has quitado el display del TM1637 (cosa que habías dicho pero no te había entendido) y lo reemplazaste por tiras LED que digamos son comunes. O sea son 6 diodos LED por segmento.

Todo lo que tienes trabaja a 5V asi que debes lograr comandar los segmentos y los displays con 5V como siempre y digo como siempre porque con Arduino hacemos lo mismo.

Bueno lo único que te has ahorrado es la interfaz que simplifica cables y conexiones.

Okay.

A titulo indicativo pondré un esquema que vamos a estudiar para tu caso porque me faltan algunos datos.



En este esqema ves un transistor 2N2222 que comanda el PNP que no importa si es diferente al tuyo, ya lo haremos funcionar con el tuyo. Y otro 2N2222 que cierra el esquema contra GND.

Esto en principio debería funcionar si respetamos las corrientes de tus 6 leds x segmento que no se cual es.

Asi que en este esquema que te propongo, la R de 100 ohms esta por verse, pero tendrá un valor que limite la corriente por segmento para los 6 leds.

Con esto te digo que necesitas tanto 2n2222 y PNP por digito o sea 4 para el comando COMUN mas 7 2N2222 por segmento para el comando de los segmentos multiplexados.

11 transitores 2N2222 y 4 PNP suponiendo ANODO COMUN conectado a los PNP





firius2010

Para el diagrama no tengo arduino en proteus incluido y no logré un buen resultado, por otro lado intente hacer uno en fritzing y no me fue mejor decidí mejor dibujarlo.
La verdad espero se entienda intentaré ser breve al explicarlo.

Por lo que comentas da a entender que tienes experiencia con proteus asi que te dejo la siguiente liga para que veas como instalar la libreria para ayudarte a hacer diagramas con mas facilidad:

https://www.youtube.com/watch?v=ZR69mG6qCyU

JavierJM

#5
Jun 21, 2019, 09:46 am Last Edit: Jun 21, 2019, 10:29 am by JavierJM
Hola de nuevo, lo siento por la demora de alguna respuesta.

@firius2010 Gracias por el aporte lo tenia pendiente y me lo recordaste, solo que, hago el comentario, no termina de ser útil ese vídeo en especifico...

De acuerdo, primero ayer (19/06), fue un día "productivo" ya que hice otro prototipo display, con tiras de diodos led más pequeño pero con 2 dígitos y de cátodo común ya que quería hacer varias pruebas, desafortunadamente no contaba con esa cantidad de transistores que se me mencionó por parte de surbyte, entonces no podía hacer mucho más que alguna que otra prueba y analizar el diagrama e información que se me compartió.

quería retomar el tema hasta realmente tener algo,tener alguna prueba hecha y no solo decir "ah ok yo lo verifico" o algo por el estilo.

Entonces, @surbyte el amperaje que esta manejando por segmento es aproximadamente 620mA (lo siento, no entendí bien si ese es el dato importante, si era por cada dígito o de manera globa) y efectivamente no me di cuenta la resistencia que no dibujé no le puse el valor, le tenía puesto una de 1k ohms.


Quote
En este esqema ves un transistor 2N2222 que comanda el PNP que no importa si es diferente al tuyo, ya lo haremos funcionar con el tuyo. Y otro 2N2222 que cierra el esquema contra GND.
Analicé el diagrama, lo que me comentaste lo agradezco ya que está muy bien explicado, lo que ayuda a entender bastantes cosas, solo no entiendo para que se usa el segundo 2N2222 cerrando a tierra.

Quote
Con esto te digo que necesitas tanto 2n2222 y PNP por digito o sea 4 para el comando COMUN mas 7 2N2222 por segmento para el comando de los segmentos multiplexados.

11 transitores 2N2222 y 4 PNP suponiendo ANODO COMUN conectado a los PNP
Aquí no me salieron bien las cuentas, pero está claro que se deben usar tanto NPN como PNP para esa configuración con el display de ánodo común.

En fin. a falta de transistores que hoy logre conseguir aparte de optocopladores (que estoy necio que quiero usar), con la información que tenia ayer y hoy quise ingeniármelas con lo que me explicaste y gracias a eso, entendí que se tiene que poner los transistores en todos los segmentos, y en la alimentación del display, no como yo lo estaba haciendo, que solo ponía el arreglo a la alimentación.

vallamos al grano, debido a los recursos que tenia, luego de leer la información, pensé que sería bueno usar un display de cátodo común, con únicamente transistores NPN, dentro de mi teoría que pensé que funcionaría, pero al final obtuve el mismo resultado, únicamente "ochos" que parecen más ruido que otra cosa, comparto el esquema de lo que hice de conexión.



Importante:
Las tiras tienen una resistencia de 10k cada 3 leds, estás no aparecen en el esquema.
Las conexiones están siendo representadas por transistores NPN, sin embargo, use los optocopladores 4N35 para los segmentos de la A-E, el resto si sin transistores TIP31C (NPN).
Solo muestro un ejemplo de como está conectado un dígito, pero como está multiplexado, lo unico que se le agregaría serían otros 3 displays y de igual forma otros 3 transistores para la alimentación, tal como explico surbyte.

Ahora lo que sigue debido al éxito no obtenido, es seguir informándome y ya con todos los componentes empezar a hacer conexiones para las pruebas siguiente la logíca del esquema propuesto.

Aclaro, use el display de cátodo común (sigo teniendo el de ánodo) por la lógica de los transistores, el deseo de evitar usar tantos componentes y de no tener todos los necesarios, por el tiempo que tengo al día primero hice pruebas y luego pude comprar los componentes.

Me sigo insistiendo, "esta será la forma más fácil para hacer este proyecto?" Aun si no lo es, la verdad ya es incluso algo personal y quiero que funcione jaja gracias por la ayuda!
Saludos.
-Javier.

surbyte

Larga respuesta asi que a medida que leo iré dando las mía también

Quote
Analicé el diagrama, lo que me comentaste lo agradezco ya que está muy bien explicado, lo que ayuda a entender bastantes cosas, solo no entiendo para que se usa el segundo 2N2222 cerrando a tierra.
Si no estoy equivocado te basaste en un módulo multiplexado. El modo de lograr que las cosas funcionen es que todo el arreglo de transistores conmute cuando recibe las órdenes y lo haga suficientemente rápido como para que el ojo no vea los cambios. Puede hacerse de muchos modos pero si la corriente es importante y aunque no tenía el dato que ahora me has dado de 650mA ya me habiá imaginado que estaría por encima de las capacidades del Arduino.
Por eso las ramas se cierran en ambos lados. Un lado PNP comanda segmentos o anodos de un display ANODO COMUN y la otra rama NPN comanda segmentos o CATODOS de un DISPLAY CATODO COMUN.
El arreglo sirve para cualquier situación, asi que de un lado habra tantos transitores como DISPLAYS y del otro claro habran 7 transistores para los segmentos.


Quote
pero al final obtuve el mismo resultado, únicamente "ochos" que parecen más ruido que otra cosa, comparto el esquema de lo que hice de conexión.
No hay ruido posible, lo que si hay es que ALGO no puede manejar la corriente que pides.
LO QUE NO VES (lo resalto para que enfoques acá) es que el lado en el que la corriente no puede fluir como pretendes es porque una rama esta alimentada con 12V y la otra cierra con el TM1637 que opera a 5V. Por eso te puse un doble driver con transitores para que repliques las conexiones al TM1637 que todo lo maneja a 5V y puedas comandar los LEDs con los 12V sin problemas.

comprendes?




tauro0221

#7
Jun 21, 2019, 05:26 pm Last Edit: Jun 21, 2019, 05:32 pm by tauro0221
Hi,
Tengo una sugerencia es de si haz considerado usar un 7447 para energizar los leds. Puedes usar 4 o solamentente uno y lo usas como multiplezers anadiendole  en la K un transistor npn  para suplir el  ground a determinado tiempo. Adjunto foto que demuestra lo arriba explicado. Este chip trabaja a un voltaje max de 30 voltios y 40ma. Ya se que haz dedicado mucho tratando hacerlo de cierta manera pero a veces hay maneras mas facil de hacerlo. El 7447 esta disenado para esta aplicacion. Solamente es una sugerencia.






JavierJM

#8
Jun 23, 2019, 04:24 am Last Edit: Jun 23, 2019, 04:32 am by JavierJM
Hola de nuevo!

Siento la demora al contestar, la verdad muchas gracias a todos por brindarme su ayuda. Y si, me excedí con mi post anterior pero bueno.

@tauro0221 lamentablemente no tengo ese integrado, si me gustaría usarlo y probablemente lo haga en otro momento, es una buena idea espero poder usarlo pronto a ver que tal.

@surbyte de hecho ya tenia la idea de que tendría que hacer eso al final de todo sin embargo insisto, con el esquema y la explicación que me diste me ayudo a asentar las ideas y al tener todos los componentes necesarios ya pude hacer el armado final de prototipo.

Es como mencionas y voy a compartir con un esquema de como quedó la conexión final. Entonces de verdad muchas gracias que si se logró.

Entonces para la persona que quiera hacer por algún motivo lo mismo que yo con el modulo del tm1637 para el arduino con tiras led esto debe hacer:



Lo que se tiene que tener en cuenta es:
La conexión de la izquierda hay que repetirla 7 veces más para cada segmento, y la conexión de la derecha se repiten dependiendo cuantos dígitos tengas, si son 8 dígitos pues 8 veces se repiten. claro teniendo en cuenta que el display es de ánodo común.
Quizá me falto una resistencia al menos de 220ohm entre los transistores a la izquierda...

La única diferencia es con el esquema que compartió Surbyte es que le faltaba un transistor más en la parte que se dirige a tierra conectado al tm1637.


En total se usaron 24 transistores, 12 NPN y 12 PNP más todos los módulos mencionados al inicio con sus respectivas conexiones y la programación solo para la hora.
Y pues nada esto es el resultado, ya tengo proyecto escolar :D



Ya está solucionado, lo que ya es tema aparte es que ahora quiero que con un dht11 muestre temperatura y humedad pero ya eso es cuestión de programación y como dije es otra cosa je.

No se si se cerrará el post ya que está solucionado y no sé que más decir más que muchas gracias de nuevo a todos.
Saludos!
-Javier.

surbyte

Algunos comentarios.

1. No se porque usas transitores TIP31 y TIP42 para invertir señal, deberian ser transitores de señal como un 2N2222 y otro complementario (PNP)

TIP31 es un transistor NPN de 3A y el TIP42 es un PNP de 6A. usarlos en la etapa previa es exagerado.
Un 2n2222 en lugar del TIP31 y un 2n2906 para reemplazar el TIP42 solo en la etapa inversora. Los transitores que van conectados a los LEDs son los que usaste.

2. también pudiste usar algun modulo tipo ULN2803 o transitores MOSFET.

3. El transitor inversor extra que usaste se debe a que el tm1637 evidentemente envia un control HIGH en una rama (digamos segmentos) y otro LOW en selección del display. Algo que no tuve en cuenta. Solo te di la idea y por lo viste te manejaste muy bien.

Felicidades.


NOTA: respecto a lo que comentas del DHT11 te aconsejo que sigas aquí porque todo tiene mas coherencia como parte integral del trabajo que realizas.

Go Up