El caso es que quería aprovechar su código ya que no me interesa poner transistores en los displays y veo que el método de multiplexado a alta velocidad es interesante lo único que le pondría 4 resistencias en cada display para limitar la corriente que veo que en el esquema no lo tiene.
Lo que me gustaría usar a mi es 2 pulsadores (no lo que tiene el que cuando abre uno cierra otro)
Estos son lo que quiero usar:
¿Como debería modificar el circuito y el código?
Os dejo el proteus que hice con su archivo hex del código de la página.
Primero quería probar lo mas básico que es que me funcionarán los dispalys pero viendo que uno no se enciende lo de poner estos interruptores que digo y hacer el diseño imagino que sera bastante complicado.
Ha pasado mucha agua bajo el puente desde códigos como ese que presentas que ya estan en muy desactualizados.
Esto
analogWrite(A0,ANALOG_LOW); // A0 common annode display 1
analogWrite(A1,ANALOG_LOW); // A1 common annode display 1
analogWrite(A2,ANALOG_LOW); // A2 common annode display 2
analogWrite(A3,ANALOG_LOW); // A3 common annode display 2
analogWrite(A4,ANALOG_LOW); // A4 common annode display 2
analogWrite(A5,ANALOG_LOW); // A5 common annode display 2
para usarlo luego como salida digital no lo habia visto nunca.
Define los pines A0 a A5 como salidas y luego usa digitalWrite(A0, HIGH) o digitalWrite(A0, LOW) en este caso para comandar su salida.
Pero lo mas importante es que hoy existen librerías que simplifican tu trabajo.
Esta librería SevSeg.h es ideal para tu caso.
Simplifica casi todo tu código a solo lo que quieres mostrar.
El código del instructables me parece PESIMO. Pero es mi opinión.
Hecho por alguien que no tenía mucha idea de arduino.
Sin documentación y muy redundante y hasta con muchas variables definidas que luego no usa.
No veo en el código como lleva el tiempo, tal vez con esos pequeños delay acumulados.
En fin. Para mi lo haría de nuevo usando SevSeg comandando todo y haciendo bien las cosas.
surbyte:
El código del instructables me parece PESIMO. Pero es mi opinión.
Hecho por alguien que no tenía mucha idea de arduino.
Sin documentación y muy redundante y hasta con muchas variables definidas que luego no usa.
No veo en el código como lleva el tiempo, tal vez con esos pequeños delay acumulados.
En fin. Para mi lo haría de nuevo usando SevSeg comandando todo y haciendo bien las cosas.
probare a ver a intentarlo hacer de nuevo a ver que sale
surbyte:
El código del instructables me parece PESIMO. Pero es mi opinión.
Hecho por alguien que no tenía mucha idea de arduino.
Sin documentación y muy redundante y hasta con muchas variables definidas que luego no usa.
No veo en el código como lleva el tiempo, tal vez con esos pequeños delay acumulados.
En fin. Para mi lo haría de nuevo usando SevSeg comandando todo y haciendo bien las cosas.
Hola de nuevo.
He probado el código que me has dicho con el ejemplo de prueba y un solo display y no se muestra correctamente.
Solo se muestra bien el digito de mas a la izquierda lo otro salen todo el rato rayitas y simbolos raros.
No se si sera algun rebote o velocidad del refresh pero no se me ocurre que cambiar.
He adjuntado la libreria correctamente y este es el codigo que he usado para la prueba.
/* SevSeg Counter Example
Copyright 2014 Dean Reading
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
This example demonstrates a very simple use of the SevSeg library with a 4
digit display. It displays a counter that counts up, showing deci-seconds.
*/
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(90);
}
void loop() {
static unsigned long timer = millis();
static int deciSeconds = 0;
if (millis() >= timer) {
deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond
timer += 100;
if (deciSeconds == 10000) { // Reset to 0 after counting for 1000 seconds.
deciSeconds=0;
}
sevseg.setNumber(deciSeconds, 1);
}
sevseg.refreshDisplay(); // Must run repeatedly
}
/// END ///
Si. Es cierto. por alguna razó que desconozco presenta mal los datos en Proteus.
Te aseguro que la librería funciona bien. Ya muchos la han usado con exito.
Modifica tu programa para que se adapta a lo que ya tienes cableado y pruebalo.
surbyte:
Si. Es cierto. por alguna razó que desconozco presenta mal los datos en Proteus.
Te aseguro que la librería funciona bien. Ya muchos la han usado con exito.
Modifica tu programa para que se adapta a lo que ya tienes cableado y pruebalo.
No que yo sepa.
Pero funciona. Sino busca en este foro SevSeg y solo verás lo bien que funciona.
Por cierto, si bajas la velocidad a 1 seg o sea edita y en lugar de timer += 100 pones timer += 1000;
veras que lo muestra bien.
surbyte:
No que yo sepa.
Pero funciona. Sino busca en este foro SevSeg y solo verás lo bien que funciona.
Por cierto, si bajas la velocidad a 1 seg o sea edita y en lugar de timer += 100 pones timer += 1000;
veras que lo muestra bien.
he probado en el ejemplo ese a a cambiar el valor pero sigue saliendo a saltos de todas formas,
Veo complicado con esa libreria hacer lo que pretendo ya que habria que declarar dos displays y controlarlos en paralelo con una misma placa de arduino.
es decir los segmentos de los dos displays conectados en paralelo pero mostrando distinta información.
lo unico que iria en patilla distintas serian los digitos de cada display.
Y cual es el problema.
Son 7 segmentos multiplexados y 8 digitos separados de a dos
manejas con una variable el primero display y con otra el segundo display.
Le envias todo de este modo
display1 tiene el número hasta 9999
display2 tiene el otro número hasta 9999
numero = display2*1000+display1
asunto resuelto.
Una cosa no tiene que ver con la otra.
Un problema es si la librería funciona y te aseguro que si funciona.
El otro tema es que con algo de imaginación puedes resolver cosas como esta.
Tienes la alternativa de usar MAX7219 que es un chip dedicado a estos menesteres. Maneja 8 digitos asi que igualmente puedes hacer lo mismo. El tema es el punto decimal que no lo tuve en cuenta para dos paneles.
surbyte:
Y cual es el problema.
Son 7 segmentos multiplexados y 8 digitos separados de a dos
manejas con una variable el primero display y con otra el segundo display.
Le envias todo de este modo
display1 tiene el número hasta 9999
display2 tiene el otro número hasta 9999
numero = display2*1000+display1
asunto resuelto.
Una cosa no tiene que ver con la otra.
Un problema es si la librería funciona y te aseguro que si funciona.
El otro tema es que con algo de imaginación puedes resolver cosas como esta.
Tienes la alternativa de usar MAX7219 que es un chip dedicado a estos menesteres. Maneja 8 digitos asi que igualmente puedes hacer lo mismo. El tema es el punto decimal que no lo tuve en cuenta para dos paneles.
gracias por la ayuda.
Realmente lo que quiero es un contador decreciente.
Con varios modos de juego.
Nada más arrancarlo poder seleccionar con un pulsador el modo.
1º-Modo 1: tiempo máximo por jugada: Regulable máximo a 05:00 (5 min) cada vez que el jugador pulse vuelve a 5 o a lo que se regule.
2º-Modo 2: tiempo total de juego por jugador. Es decir en un display MM:SS (MAXIMO 99MIN : 60 s) por jugador.
3ºMODO: Modalidad TIEMPO AÑADIDO.
EN ESTE MODO cada jugador comienza en el marcador con 05:00(min) 05:00(min) y cada vez que haga una jugada y toque el pulsador se le suman 3 segundos por jugada.
Imagino que hacer esto sin usar ningun modulo controlador solamente el arduino y los diplays es una tarea complicada para alguien novato.
Ya que cuando paras el tiempo y sigue corriendo el del contrario imagino que habra que guardar los valores y demas en alguna variable y eso sin contar la multiplexacion y que el tiempo se asemeje a un reloj real.
Aqui se puede hacer una hoja de ruta para que alguien ayude con el código?
Bueno, me ha llevado unas cuantas horas pero acá tienes algo con que comenzar.
Te aclaro.. hasta acá te ayudo. Porque quedan cosas por hacer, pero te he resuelto creo yo el mayor porcentaje.
Si tiene fallas, por favor ponle esfuerzo y resuelvelas por tu cuenta.
Adjunto imagen del esquema usando MAX7219.
Pude hacerlas con 74595 pero preferí por esta vía por simplicidad.
surbyte:
Bueno, me ha llevado unas cuantas horas pero acá tienes algo con que comenzar.
Te aclaro.. hasta acá te ayudo. Porque quedan cosas por hacer, pero te he resuelto creo yo el mayor porcentaje.
Si tiene fallas, por favor ponle esfuerzo y resuelvelas por tu cuenta.
Adjunto imagen del esquema usando MAX7219.
Pude hacerlas con 74595 pero preferí por esta vía por simplicidad.
gracias surbyte veo que de este modo se simplifica bastante la cosa y es muy interesante.
Lo único que no dispongo de los integrados max.
Voy a pedirlos por internet y mientras tanto voy a intentar conseguir solucionar el otro que con el código del otro programa haciendo pequeñas modificaciones he conseguido que el tiempo de la izquierda sean minutos MM.SS y los otros dos digitos segudos. Solo me falta que cuando de a un pulsador me salte de uno a otro.
Te lo dejo por aqui.
Si lo se es un lio de código pero va bastante fino en el conteo.
Se que lo de los pulsadores seguramente sea cambiar 2 chorradas en el código pero no lo he conseguido.
Creo que no te lo expliqué, pero cada boton controla el tiempo de cada jugador, obvio hasta ahi.
Si presionas los dos, se activa el modo AJUSTE TIEMPO, deberíamos agregar un led para indicarlo.
El boton player1 disminuye hasta 5 min y el player2 aumenta hasta 95.
Con eso tienes un buen arranque.
Como dije puedes hacerlo con 74595 pero cambia la programación que use para el MAX7219 específico.
También habria que agregar uno extra... para los digitos. Pero preferí con el MAX7219 que esta diseñado para esto.