Go Down

Topic: contador de 4 digitos (Read 8962 times) previous topic - next topic

Hcorniel

Solo eso.. lo k pasa es k lo voy a añadif a otro codigo para el proyecto en k trabajo.. solo necesito  eso k marque almenos 2 digitos al precionar... claro con un shift register..

surbyte

#16
Mar 23, 2015, 01:46 am Last Edit: Mar 23, 2015, 03:28 am by surbyte
Ok. Entendido. Lo corrijo y lo subo.

Viendo el esquema electrónico no entiendo porque usas un ShifRegister 595 en lugar de un decodificador de 7 segmentos. No tiene ningún sentido.
Yo voy a cambiarlo porque se trata de un display multiplexado pero usar un shiftRegister ahi me resulta un despropósito.

Hcorniel

disculpe, como le dije no se mucho de los microcontroladores, soy nuevo en arduino, los ejemplos k vi eran con shift register y eran los k tenia a manos para las practicas pero si me puedes decir cual usar seria perfecto. realmente necesito los menos posible el uso de pines de arduino.

surbyte

#18
Mar 24, 2015, 03:12 am Last Edit: Mar 24, 2015, 03:18 am by surbyte
Bueno debido a tu consulta y la de otros inicio una serie de contadores de 4 digitos Multiplexados

1) sin integrados,
2) con 74HC47 y
3) con 74HC595.

1) SIN USAR INTEGRADOS. Con Arduino Solamente
Aca el primero sin integrados directametne con el Arduino comandando tu mismo display.

Los archivos estan hechos con un programa que permite Nombres con espacios. Si no puedes compilarlo con el IDE, edita el nombre o le quitas el espacio.
Solo agregué los botones UP y DOWN


NOTA: lo mas importante. El código corresponde al Sr. Nick Gammon y lo encuentran aca

LED multiplexing with Arduino alone

Hcorniel

cool  , gracias me quedo a la espera de los que usan los integrados.

surbyte

Ese ya funciona, porque no lo pruebas?

Hcorniel

si ese lo se usar pero es sin multiplexear o shift register y para lo k necesito  hacer, necesito salvar muchos pins...

este k tengo lo limpie un poco y funciona en un 90% lo unico es k blink una minima cosa.. lo subire a proteus y lo puedes ver, pero recuerda k al proteus no estar a la velocidad real se ben como separados pero en realidad se ven 90% estables...

Hcorniel

el codigo es este ...
Code: [Select]
const int latchPin= A1;
const int clockPin = A2; ///// shift register 74HC595
const int dataPin = A0;

#define CA1 4   //// digito 1
#define CA2 5   //// digito 2
#define CA3 6   //// digito 3
#define CA4 7   //// digito 4

int botonUp = 3;   ///// boton acender
int botonDown = 2; ////  boton bajar
int cambio = 0;
int botonPress ;
int boton_No_Press ;
int botonPress2 ;
int boton_No_Press2 ;

const int energisarTiempo = 10;

boolean energisar ( int pin ){
boolean contador = 0;
boolean Press;
boolean NoPress;

do {
Press =digitalRead ( pin);
if ( Press != NoPress) {
  contador = 0;
 NoPress = Press;
}
else
{
contador = contador + 1;
}
delay (1);
}
while ( contador < energisarTiempo);

return Press;
}

 void actualizar ()
{
switch ( cambio ) {
 
case 10:   ////////////////// ( 50 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010 );

      digitalWrite(CA3, LOW);
      digitalWrite(CA4, HIGH);
      numberToDisplay%10;
      digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110);

     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;
 
  case 9:   ////////////////// ( 45 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11001100);

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);

 shiftOut(dataPin, clockPin, MSBFIRST, B11011010);
 
     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;

case 8:    ////////////////// ( 40 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11001100);

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110);

     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;

case 7:    ////////////////// ( 35 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B10011110);

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010);

    digitalWrite(CA3, HIGH);
    digitalWrite(CA4, LOW);
    numberToDisplay/10%10;
    digitalWrite(latchPin, LOW);
 }
break;

case 6:     ////////////////// ( 30 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B10011110);
    //take the latch pin high so the LEDs will light up:
      digitalWrite(CA3, LOW);
      digitalWrite(CA4, HIGH);
      numberToDisplay%10;
      digitalWrite(latchPin, LOW);
 }
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
    //take the latch pin high so the LEDs will light up:
    digitalWrite(CA3, HIGH);
    digitalWrite(CA4, LOW);
    numberToDisplay/10%10;
    digitalWrite(latchPin, LOW);
 }
break;

case 5:     ////////////////// ( 25 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B10110110);
 
    digitalWrite(CA3, LOW);
    digitalWrite(CA4, HIGH);
    numberToDisplay%10;
    digitalWrite(latchPin, LOW);
 }
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010);
 
    digitalWrite(CA3, HIGH);
    digitalWrite(CA4, LOW);
    numberToDisplay/10%10;
    digitalWrite(latchPin, LOW);
 }
 break;

case 4:     ////////////////// ( 20 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B10110110);

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110);

    digitalWrite(CA3, HIGH);
    digitalWrite(CA4, LOW);
    numberToDisplay/10%10;
    digitalWrite(latchPin, LOW);
 }
break;

case 3:    ////////////////// ( 15 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B00001100);

     digitalWrite(CA3, LOW);
     digitalWrite(CA4, HIGH);
     numberToDisplay%10;
     digitalWrite(latchPin, LOW);
 }
  for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);   
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010);

     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;

case 2:     ////////////////// ( 10 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B00001100);
    //take the latch pin high so the LEDs will light up:
      digitalWrite(CA3, LOW);
      digitalWrite(CA4, HIGH);
      numberToDisplay%10;
      digitalWrite(latchPin, LOW);
 }
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
   
     digitalWrite(CA3, HIGH);
     digitalWrite(CA4, LOW);
     numberToDisplay/10%10;
     digitalWrite(latchPin, LOW);
 }
break;

case 1:    ////////////////// ( 05 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
   
      digitalWrite(CA3, LOW);   
      digitalWrite(CA4, HIGH);
      numberToDisplay%10;
      digitalWrite(latchPin, LOW);
 }
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B11011010);
    //take the latch pin high so the LEDs will light up:
      digitalWrite(CA3, HIGH);
      digitalWrite(CA4, LOW);
      numberToDisplay/10%10;
      digitalWrite(latchPin, LOW);
 }
break;

case 0:     ////////////////// ( 00 )/////////////////
 for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
 
 shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
 
   digitalWrite(CA1, HIGH);
   digitalWrite(CA2, HIGH);
   digitalWrite(CA3, LOW);
   digitalWrite(CA4, LOW);
   digitalWrite(latchPin, LOW);
 }
break;
  }
}
 
void setup ()
{
  Serial.begin ( 9600);
pinMode ( botonUp, INPUT);
pinMode ( botonDown, INPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
 
   pinMode(CA1, OUTPUT);
  pinMode(CA2, OUTPUT);
   pinMode(CA3, OUTPUT);
  pinMode(CA4, OUTPUT);
}

void loop ()
{
botonPress = digitalRead ( botonUp );
if ( botonPress != boton_No_Press) {
if ( energisar ( botonUp) ){
cambio ++;
if ( cambio > 10 ) {
  cambio = 10;
}
}
}
boton_No_Press  = botonPress;
////////////////////////////////////////////////
botonPress2 = digitalRead ( botonDown );
if ( botonPress2 != boton_No_Press2) {
if ( energisar ( botonDown) ){
cambio --;
if ( cambio < 0 ) {
  cambio = 0;
}
}
}
boton_No_Press2  = botonPress2;

actualizar ();

}

surbyte

#23
Mar 25, 2015, 03:55 am Last Edit: Mar 25, 2015, 04:15 am by surbyte
Que te parece usar dos 595 y no consumir 4 pines mas para comandar los LED?
O sea con 3 pines comandas todo?
Te queda todo el Arduino para lo que gustes?

Ahora te lo dibujo y te lo posteo en Proteus.


Hcorniel

Y k codigo usaria el mismo k tengo o como..

surbyte

#25
Mar 25, 2015, 05:08 am Last Edit: Mar 25, 2015, 05:10 am by surbyte
Bueno acá esta el segundo caso.

Ya que Hcorniel requiere mínimo uso de pines esta versión también de Nick Gammon me pareció muy interesante.

Simulaicón y sketch adjuntados

falta agregar los dos pulsadores y eliminar la parte del código que actua como contador de segundos que para Hcorniel no tienes sentido.
Es igual al caso anterior respetando lo que aquí esta.

A ver si puedes con la tarea.

Explico algo del programa.
Todo el trabajo lo hace la rutina del timer.
Solo debes actuar sobre now que es la variable que luego el programa presenta en los 4 LEDs

Si pones los 2 pulsadores y haces que now suba o baje tienes lo que quieres


Hcorniel

tengo un problema los archivos no se abren , cuando lo intento abrir en proteus sale bien pero cuando le doy a iniciar me da este error




y el codigo tambien me da este error.



lo de proteus no es muy importante lo puedo hacer yo, pero necesito conocer el codigo.

gracias.

surbyte

Pero debes recompilar el archivo Arduino, y poner la ruta en el Arduino UNO del Proteus, por eso te da error. Es obvio que mi ruta no es la tuya.

Hcorniel

Si pero no pueso abrir  el codigo  no se abre para recopilarlo

surbyte

Como no se abre, edita el nombre y ponlo sin espacios. Ponle el nombre que gustes.

Go Up