Problema con case 3:

Al pulsar el pulsador correspondiente del case 3:, me descuenta 1 en setJuego…pero a su vez me incrementa 1 en localMarcador que no lo debe hacer.

#include "TimerOne.h"  // libreria
int localMarcador=0;// Variable equipo local
int visitanteMarcador=0;// Variable equipo visitante
int setJuego=0;// Variable set que se juega

//Conectar pins del 2 al 7 a pulsadores
//El otro pin de los pulsadores a GND

// funcion de los pulsadores
//  2 + set
//  3 - set
//  4 +1 Local
//  5 -1 Local
//  6 +1 Visitante
//  7 -1 Visitante


void setup()
{
  int n;
  for (n=2;n<9;n++)
    pinMode(n,INPUT_PULLUP); 
  Serial.begin(9600); 
  Timer1.initialize();
  Timer1.attachInterrupt(updateTimeline);
}

//establecido por la rutina de interrupción para señalar la necesidad de actualizar la pantalla
bool timeUpdated=true;
void loop()
{
int n;
  bool debounce=false;

// Ver como están las entradas
  for (n=2;n<9;n++)
    if(digitalRead(n)==LOW)
    {
      debounce=true;
      switch(n)
      {
      case 2:// + setJuego
         setJuego++;
        break;
        case 3:// - setJuego
        if(setJuego>0) 
          setJuego--;
        case 4:// +1 Local
        localMarcador++;
        break;
      case 5://-1 Local
        if(localMarcador>0) 
          localMarcador--;
        break;
      case 6:// +1 Visitante
        visitanteMarcador++;
        break;
      case 7:// -1 Visitante
        if(visitanteMarcador>0) 
          visitanteMarcador--;
        break;  
 }
    } //Ahora actualizar la pantalla (pero sólo si UPDATETIME ha ejecutado desde la última vez)
  if(timeUpdated)
    updateDisplay();
  if(debounce) 
    delay(400);
}
void updateDisplay()
{
  char timeString[6];
  Serial.println(timeString);
  char scoreline[30];
  sprintf(scoreline,"Local %d:%d Visitante: %d setJuego:",localMarcador,visitanteMarcador,setJuego);
  Serial.println(scoreline);
  timeUpdated=false;
}
void updateTimeline()
{
timeUpdated=true;
}

Le he dado varias vueltas y sigo sin comprender.
Me pueden explicar (para aprender) como se representaría en 5 display de 7 seg. con 74HC595.
Gracias

En case 3, te falta el break

Muchas gracias...lo mire y remire pasando por alto....lo mas importante......me pasan cosas increíbles. Me queda, si pueden explicar ( para aprender.....) como visualizar la informacin en 5 displays de 7 seg con 74HC595.´ Salu2

...como visualizar la informacion en 5 displays de 7 seg con 74HC595...

Sobre ese tema hay sobrada información buscando en Google. No vamos a volver a inventar la rueda.

Muchas gracias. Voy al google de nuevo. Ruego alguna pequeña explicación para encaminarme ... Salu2

francisco2v tu no lees mas que tus propios hilos? Hay en este momento al menos 3 hilos incluído este que estan por el mismo camino. Mira en hardware, mira en Proyectos, además de tu propio post.

Yo ya lo he hecho para 3/4/5 LEDs.

He leído tus posts...como siempre de gran ayuda. Los que he visto en el foro son para cronómetros y relojes.Todos los he leído y releído.....pero su aplicación es :

void display(unsigned long numero){

    decenas    = numero/10000;
    numero    %= 10000;
    unidades   = numero/1000;
    numero    %= 1000;
    decimas    = numero/100;
    numero    %= 100;
    centesimas = numero/10;
    numero    %= 10;
    milesimas = numero;

    digitalWrite(pinLatch, LOW);
    shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[milesimas]);    //digitOne milesimas
    shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[centesimas]);   //digitOne centesimas
    shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decimas]);      //digitOne decimas
    shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[unidades]);     // digitOne unidades
    shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decenas]);      //digitOne decenas
    digitalWrite(pinLatch, HIGH);
}

Pero para representar los dígitos de las tres funciones que tengo: que son: dos dígitos para Local, dos dígitos para Visitante y un dígito para Set....me pierdo....y no veo la forma. Gracias.

Y cual es la diferencia, cronometros y relojes solo visualizarn algo de un modo. Pero el control de los 595s es el mismo.

Mira tienes localMarcador, visitanteMarcador, SetJuego Solo debes armar un gran número con ellos y presentarlos define

unsigned long numDisplay ;

numDisplay = localMarcador*10000+visitanteMarcador*100+setJuego;

y luego presentas este numDisplay con display(numDisplay);

Voy logrando un poco de luz....me puedes ampliar un poco mas.....sería de agradecer....como siempre. Gracias.

He acá el dilema francisco2v con el cual siempre yo choco contigo.

Te pones a hacer un proyecto complejo y una y otra vez no puedes dar un paso sin que te lo hagan. Ya te di la solución. defines esto como global.

unsigned long numDisplay ;

Y cuando tienes resuelto localMarcador, visitanteMarcador y setJuego, calculas esto

numDisplay = localMarcador*10000+visitanteMarcador*100+setJuego;

y luego haces

display(numDisplay);

esta servido en bandeja.

Muchas gracias...de nuevo.... Salu2

Francisco, pon esas lineas en el sketch y postealo para ver si me entendiste.

Tengo que desistir...todos los ejemplos que veo ....tienen distintas formas y no se aplicarlas con las agradecidas explicaciones de surbyte. Salu2

Ok.

#include "TimerOne.h"  // libreria

// Definiciones de los 74HC595

int pinLatch	= 10;	//Pin para el latch de los 74CH495
int pinDatos	= 11;	//Pin para Datos serie del 74CH495
int pinReloj	= 12;	//Pin para reloj del 74CH495

byte digitOne[10]= {
	// Codificación hexadecimal de los dígitos decimales en el display de 7 segmentos
	//0xEE, 0x82, 0xDC, 0xD6, 0xB2, 0x76, 0x7E, 0xC2, 0xFE, 0xF6};
	// Codificacion del autor del Hilo
	
	0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xb6, 0x3E, 0xE0, 0xFE, 0xF6};
	// con esta codificación los leds encienden correctamente


int localMarcador=0;// Variable equipo local
int visitanteMarcador=0;// Variable equipo visitante
int setJuego=0;// Variable set que se juega
unsigned long numDisplay;

//Conectar pins del 2 al 7 a pulsadores
//El otro pin de los pulsadores a GND

// funcion de los pulsadores
//  2 + set
//  3 - set
//  4 +1 Local
//  5 -1 Local
//  6 +1 Visitante
//  7 -1 Visitante


void setup()
{
  int n;
  for (n=2;n<9;n++)
    pinMode(n,INPUT_PULLUP); 
  Serial.begin(9600); 
  Timer1.initialize();
  Timer1.attachInterrupt(updateTimeline);
  pinMode(pinLatch, OUTPUT);
  pinMode(pinDatos, OUTPUT);
  pinMode(pinReloj, OUTPUT);
  display(0);
}

//establecido por la rutina de interrupción para señalar la necesidad de actualizar la pantalla
bool timeUpdated=true;
void loop()
{
int n;
  bool debounce=false;

// Ver como están las entradas
  for (n=2;n<9;n++)
    if(digitalRead(n)==LOW)
    {
      debounce=true;
      switch(n)
      {
      case 2:// + setJuego
         setJuego++;
        break;
        case 3:// - setJuego
        if(setJuego>0) 
          setJuego--;
        case 4:// +1 Local
        localMarcador++;
        break;
      case 5://-1 Local
        if(localMarcador>0) 
          localMarcador--;
        break;
      case 6:// +1 Visitante
        visitanteMarcador++;
        break;
      case 7:// -1 Visitante
        if(visitanteMarcador>0) 
          visitanteMarcador--;
        break;  
 }
    } //Ahora actualizar la pantalla (pero sólo si UPDATETIME ha ejecutado desde la última vez)
  if(timeUpdated)
    updateDisplay();
  if(debounce) 
    delay(400);
}
void updateDisplay()
{
  char timeString[6];
  Serial.println(timeString);
  char scoreline[30];
  sprintf(scoreline,"Local %d:%d Visitante: %d setJuego:",localMarcador,visitanteMarcador,setJuego);
  Serial.println(scoreline);
  numDisplay = localMarcador*10000+visitanteMarcador*100+setJuego;
  display(numDisplay);
  timeUpdated=false;
}
void updateTimeline()
{
timeUpdated=true;
}

void display(unsigned long numero){

	int decenas    = numero/10000;
	numero    %= 10000;
	int unidades   = numero/1000;
	numero    %= 1000;
	int decimas	   = numero/100;
	numero	  %= 100;
	int centesimas = numero/10;
	numero    %= 10;
	int milesimas = numero;
	
	digitalWrite(pinLatch, LOW);
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[milesimas]);	//digitOne milesimas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[centesimas]);	//digitOne centesimas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decimas]);		//digitOne decimas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[unidades]);		// digitOne unidades
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decenas]);		//digitOne decenas
	digitalWrite(pinLatch, HIGH);
}

no se si no dará algun error, lo úni acá mismo.

Cuando pulso -setJuego…me pone un 1 en localMarcador.
Añadí esta linea:

if(setJuego>9)
setJuego=0;

pero sigue haciendo lo mismo. Adjunto simulación…
+localMarcador y +visitanteMarcador…cuando pasan de 9 a 10 los displays suman mal y hacen cosas raras…?

Salu2

#include "TimerOne.h"  // libreria

// Definiciones de los 74HC595

int pinLatch	= 11;	//Pin para el latch de los 74CH495
int pinDatos	= 12;	//Pin para Datos serie del 74CH495
int pinReloj	= 13;	//Pin para reloj del 74CH495

byte digitOne[10]= {
	// Codificación hexadecimal de los dígitos decimales en el display de 7 segmentos
	//0xEE, 0x82, 0xDC, 0xD6, 0xB2, 0x76, 0x7E, 0xC2, 0xFE, 0xF6};
	// Codificacion del autor del Hilo
	
	0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xb6, 0x3E, 0xE0, 0xFE, 0xF6};
	// con esta codificación los leds encienden correctamente


int localMarcador=0;// Variable equipo local
int visitanteMarcador=0;// Variable equipo visitante
int setJuego=0;// Variable set que se juega
unsigned long numDisplay;

//Conectar pins del 2 al 7 a pulsadores
//El otro pin de los pulsadores a GND

// funcion de los pulsadores
//  2 + set
//  3 - set
//  4 +1 Local
//  5 -1 Local
//  6 +1 Visitante
//  7 -1 Visitante


void setup()
{
  int n;
  for (n=2;n<9;n++)
    pinMode(n,INPUT_PULLUP); 
  Serial.begin(9600); 
  Timer1.initialize();
  Timer1.attachInterrupt(updateTimeline);
  pinMode(pinLatch, OUTPUT);
  pinMode(pinDatos, OUTPUT);
  pinMode(pinReloj, OUTPUT);
  display(0);
}

//establecido por la rutina de interrupción para señalar la necesidad de actualizar la pantalla
bool timeUpdated=true;
void loop()
{
int n;
  bool debounce=false;

// Ver como están las entradas
  for (n=2;n<9;n++)
    if(digitalRead(n)==LOW)
    {
      debounce=true;
      switch(n)
      {
      case 2:// + setJuego
         setJuego++;
        break;
        case 3:// - setJuego
        if(setJuego>0) 
          setJuego--;
        case 4:// +1 Local
        localMarcador++;
        break;
      case 5://-1 Local
        if(localMarcador>0) 
          localMarcador--;
        break;
      case 6:// +1 Visitante
        visitanteMarcador++;
        break;
      case 7:// -1 Visitante
        if(visitanteMarcador>0) 
          visitanteMarcador--;
        break;  
 }
    } //Ahora actualizar la pantalla (pero sólo si UPDATETIME ha ejecutado desde la última vez)
  if(timeUpdated)
    updateDisplay();
  if(debounce) 
    delay(400);
     if(setJuego>9) 
        setJuego=0;
        
}
void updateDisplay()
{
  char timeString[6];
  Serial.println(timeString);
  char scoreline[30];
  sprintf(scoreline,"Local %d:%d Visitante: %d setJuego:",localMarcador,visitanteMarcador,setJuego);
  Serial.println(scoreline);
  numDisplay = localMarcador*10000+visitanteMarcador*100+setJuego;
  display(numDisplay);
  timeUpdated=false;
}
void updateTimeline()
{
timeUpdated=true;
}

void display(unsigned long numero){

	int decenas    = numero/10000;
	numero    %= 10000;
	int unidades   = numero/1000;
	numero    %= 1000;
	int decimas	   = numero/100;
	numero	  %= 100;
	int centesimas = numero/10;
	numero    %= 10;
	int milesimas = numero;
	
	digitalWrite(pinLatch, LOW);
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[milesimas]);	//digitOne milesimas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[centesimas]);	//digitOne centesimas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decimas]);	//digitOne decimas
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[unidades]);	// digitOne unidades
	shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decenas]);	//digitOne decenas
	digitalWrite(pinLatch, HIGH);
}

FINALmarcador.zip (19.9 KB)

Yo supuse que tu código estaba bien y solo agregué los displays.

No había visto tu código mas que para agregar lo que agregué!!

Quien puso esto en el código?

if(debounce) 
    delay(400);

o ya venía. Si venía no entiendo como usan librería e interrupciones para el timer y arruinan todo con un delay. Espero tu respuesta.

Parte del código de la red . Intente adaptarlo haciendo distintas pruebas cortando y pegando ....pero solo lograba ver el resultado por serial. ( Entendí o mal entendí ....que era adecuado por lo de los rebotes en los pulsadores). Salu2

los rebotes con 20mseg esta bien, pero usas una rutina con TIMER, usar timer y delay son dos cosas opuestas.

Gracias por la aclaración... Salu2

Los display siguen funcionando mal pasa del 9 visitante y suma 1 al Local y visititante queda a 0. Local paso de 3 y hacen cosas raras todos.... -set si estan a 0 tambien cosas rara en display......? Cuando puedas agradecería de tus consejos pera ver si se encuentra una solución. Saludos