Go Down

Topic: Orientación para proyecto timer (Read 682 times) previous topic - next topic

JWOLVERINE

Hola Soy novatisimo en arduino y su programación, podrían orientarme como empezar el proyecto en si es uno que vi en youtube (https://www.youtube.com/watch?v=TPEbikC1-SA)  que consiste en  un timer para controlar un relé, al insertar una moneda encendiera el rele por 30 min. y si se insertase otra moneda acumulara otros 30 min. asi como añadir 2 display de 7 segmentos para mirar el timepo restante.

Saludos :)

Jopapa

#1
Aug 04, 2017, 01:53 pm Last Edit: Aug 04, 2017, 01:53 pm by Jopapa
A ver, ¿tu has visto el vídeo? El que hace el montaje ¿a ti te parece que es novatisimo en Arduino y en programación? Pues eso.
Jopapa
www.jopapa.me

IgnoranteAbsoluto

Jopapa, tampoco es para tanto. Lo más complicado es hacer, o hacerse con, un mecanismo que detecte la moneda. Con eso lo demás es "asequible". Un Arduino, un relé, dos display de siete segmentos, un LED, un puñado de resistencias, las conexiones y ya sólo te quedaría por programar el Arduino (que no es nada del otro mundo).

Una vez te has hecho con los materiales, los pruebas por separado y aprendes a manejarlos. Cuando ya los controlas por separado ya sólo te queda hacer el programa final, montarlo todo bien bonito y ya está.

Y te aseguro que el programa no es muy complicado.

Así que no te desanimes JWOLVERINE, ve completando "metas" y, si tienes alguna duda, está San Google y el foro.

JWOLVERINE

Por parte de la electrónica no es el problema, es en el código, tengo 38 años y apenas uno conociendo arduino, puedo hacerlo por medio de un temporizador 555 pero no es exacto y tiene limitadas sus funciones ademas de que si se agregaran los display quedaría una placa monstruo, pero arduino me gusto mas ya que se ve que se le puede agregar el display de 14 segmentos de catodo común en el cual se visualiza el tiempo agregado y el que queda, así como agregar mas tiempo si se ingresara una moneda, Como dicen en mi país Zapatero a tus zapatos mi bisnes es a nivel electrónica, la programación he intentado pero nunca se me dio,  he construido amplificadores de alta potencia, luces de potencia, construí mi propia rockola, creo que no todos nacimos sabiendo o sabemos todo para eso pienso yo que están esta clase de foros, para echarnos la mano, pero si ofendí a alguien con mi post lo siento y muchas gracias por todo.

Saludos.

IgnoranteAbsoluto

JWOLVERINE, no creo que nadie se ofenda por tu pregunta. Como ya he dicho, lo que yo veo más complicado es el sensor de monedas. Para lo demás hay montón de páginas webs que te explican o dan ideas de cómo hacerlo. Si controlas la electrónica ya controlas más del 50% del proyecto. Si logras montar el hardware y conectarlo al Arduino correctamente (la parte de los displays es la única que puede ser complicada, sobre todo si la multiplexas), lo que es el programa para el Arduino es relativamente sencillo, yo mismo te podría guiar, y más gente del foro. Pero creo que sería más fácil si por tu cuenta lo montas y pruebas por partes. Tratando de controlar cada componente por separado y finalmente hacer el programa que lo gestione todo junto.

Resumiendo, busca por Internet cómo conectar dos displays de 7 segmentos, hazte con un Arduino, los displays de 7 segmentos y lo necesario para conectarlos. Trata de mostrar números en el display, y cuando lo tengas, o si en algún momento "te atascas", nos muestras lo que tienes hecho y vuelves a preguntar.

Entiendo que la parte de controlar el tiempo es la que más te preocupa porque es programación y es lo que no controlas, pero para eso nos tienes a nosotros.

rodripelto

Hola,
Para las monedas, necesitaras un monedero electrónico, no son excesivamente caros.
Artículo monedero, te dejo un enlace donde habla de ellos, incluso puedes descargar el programa.

Si pones en Google "cuenta atras arduino" también encontrarás código para hacerlo.

En google " display 7 segmentos arduino" .

Un saludo.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

rodripelto

Hola de nuevo,
Me he entretenido un poco y he hecho una pequeño ejemplo de cuenta a tras, tendrás que modificarlo a tus necesidades, yo he usado el puerto serie para introducir un valor en segundos para la cuenta, tú lo tendrías que cambiar para la señal del monedero, lo mio son segundos tú querrás minutos y yo he utilizado el puerto serie, tu lo tendrás que mostrar por el display de 7 segmentos.

Code: [Select]
/*
 Name: Cuenta_a_Tras.ino
 Created: 05/08/2017 11:52:03
 Author: rodripelto
*/

// Librerias Incluidas


// Definiciones


// Objetos globales

String cadena = "";
unsigned long tiempo = 0;
unsigned long tiempofijado = 0;
unsigned long tiempotrascurrido = 0;

// Configuración de Arduino, solo se ejecuta una vez
void setup()
{
  Serial.begin(115200); // La velocidad del Monitor serie tambien en 115200
}

// Bucle principal del programa
void loop()
{
if (tiempo > tiempotrascurrido)
{
tiempotrascurrido = (millis() - tiempofijado);
Serial.println((tiempo- tiempotrascurrido) /1000);
}
else
{
tiempofijado = millis();
tiempo = 0;
tiempotrascurrido = 0;
}
}

void serialEvent()
{
while (Serial.available())
{
char caracter = (char)Serial.read();
// El terminar serie tiene que estar configurado para que envie fin de carro o salto de linea
if (caracter != '\n' && caracter != '\r')
{
cadena += caracter;
}
else
{
tiempo += cadena.toInt() * 1000;
cadena = "";
}
}

}

Bueno espero que te sirva como ejemplo para empezar y recuerda es un ejemplo no es un programa totalmente funcional.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

IgnoranteAbsoluto

Hola de nuevo,
Yo me he entretenido un poco más que rodripelto  ;)  y he implementado la gestión de la señal de detección de moneda, parpadeo del LED verde que se ve en el vídeo, actuación de un relé y contador de cuenta atrás. Faltaría la parte que muestra el conteo en los displays de 7 segmentos. Por eso, en su lugar, muestro el conteo por el puerto serie.

He configurado el puerto serie a 9600 baudios, así que o configuras el monitor serie a esa velocidad o cambias el 9600 por la velocidad que prefieras.

Como no sé cómo serán las conexiones y señales de los periféricos que vas a poner (relé y esas cosas), para poder hacer pruebas más fácilmente, he definido unas constantes al principio del programa. Las podrás modificar al gusto y según necesidades. Paso a explicar un poco el uso de cada una de ellas.

MINUTOS_POR_MONEDA: tiempo, en minutos, que quieres que se añada cada vez que se introduzca una moneda. Para las pruebas he puesto dos minutos.

MOSTRAR_COMO_SEGUNDOS: si bien el conteo es en minutos, he creído que estaría bien que el último minuto lo mostrase segundo a segundo, así que con esta constante puedes configurar este comportamiento. Le he puesto 60 para que muestre segundo a segundo el último minuto. Si no quieres este comportamiento pon el valor 0. Si quieres que sea una cantidad diferente de segundos puedes poner hasta 99, ya que ese es el valor máximo que se supone que se puede mostrar. Con un 10 mostraría sólo los diez últimos segundos.

PARPADEO_RAPIDO: cuando se están mostrando los minutos restantes el LED parpadea una vez por segundo. Un valor true hace que parpadee más rápido el LED, cuatro veces por segundo, cuando se están mostrando los segundos. El valor false hace que siempre parpadee una vez por segundo.

PIN_LED: pin del Arduino al que está conectado el LED que parpadea. Yo tengo un Arduino uno, y para las pruebas lo he configurado como el pin 13 para que parpadee el LED que trae el Ardunio.

ESTADO_LED_ENCENDIDO: dependiendo del montaje del LED, para encenderlo puede que se necesite que la señal del pin del Arduino esté a nivel alto o bajo. En mi caso, para encenderlo, se necesita una señal a nivel alto (HIGH). En el caso de tener que ser al revés basta con cambiarlo por LOW.

PIN_SENSOR_MONEDA: pin del Arduino al que se conecta el sensor de monedas. Para las pruebas puse un pulsador, normalmente abierto, entre el pin 7 y masa.

ESTADO_SENSOR_HAY_MONEDA: dependiendo de cómo funcione el sensor de moneda, puede ser que la detección de la moneda se notifique con una señal a nivel alto o a nivel bajo. Con esta constante se define cómo es la señal que indica esto (HIGH o LOW). En mis pruebas lo he estado haciendo con señal a nivel bajo, con un pulsador pongo a masa la entrada del Arduino.

PULLUP_SENSOR_MONEDA: se puede configurar la activación de la resistencia pull-up interna del Arduino para ahorrarse tener que poner esa resistencia en el montaje. Yo he puesto true y la he activado, porque así no necesito poner externamente la resistencia pull-up entre el pin de Arduino y los 5V. Poner false si se va a usar resistencia pull-down o si el sensor de moneda ya trae la electrónica que se asegura los niveles de tensión correctos.

PIN_RELE: pin al que se conecta el relé que se quiere controlar. En las pruebas he conectado una resistencia y un LED al pin 12 para ver que se enciende y apaga correctamente.

ESTADO_RELE_SISTEMA_ENCENDIDO: para activar lo que queremos controlar tendremos que poner el pin a nivel alto o bajo, dependiendo del relé o de las características del circuito. Con esta constante se define qué valor es el que "enciende" el sistema. Yo la he configurado como HIGH para las pruebas, porque lo tengo conectado al ánodo del LED, resistencia mediante.

TIEMPO_ANTIRREBOTE_DETECCION_DE_MONEDA: como el sensor de moneda puede ser "demasiado simple" tal vez su señal tenga "rebotes" (como es el caso del pulsador manual o usar un cable para puentear el pin con masa). Así que por ello he implementado un simple control antirrebote. Se puede hacer más o menos "sensible" disminuyendo este tiempo o aumentándolo. Está en milisegundos.

MILISEGUNDOS_POR_MONEDA: no hay que tocar esta constante, se calcula a partir del valor de MINUTOS_POR_MONEDA.


Mediante el monitor serie verás los eventos de detección de moneda, encendido y apagado del "relé" y lo que se debería de mostrar en los displays. Si por un casual "metes monedas" como para tener que contar más de 99 minutos, te mostrará 99 (el máximo que se puede mostrar) y tendrá en cuenta todo el tiempo de más, con lo que finalmente contará el tiempo real.

A la hora de poner el verdadero sensor de moneda, hay que tener en cuenta que el programa no está "todo el tiempo" verificando si hay moneda. Ciertamente lo verifica muy menudo (por ahora, ya que en un futuro tal vez multiplexes los displays y entonces estará menos tiempo verificando la moneda), pero tal vez el sensor mande una señal muy corta y no la detecte. Si es así, habría que modificar el programa un poquito para usar las interrupciones.

Cuando tengas los displays e implementes su control, tal vez deberías de ver si quieres que cuando se muestre el 00 simplemente se apaguen los display.

Un "pequeño detalle": por ejemplo, si está mostrando minutos ¿qué significa ver en los display 01? ¿Que nos queda exactamente un minuto, que nos queda más de un minuto, o que nos queda menos de un minuto? Yo entendería que nos queda un minuto o menos, es decir, que nos queda entre 1 y 60 segundos. Si nos quedasen 61 segundos nos ha de mostrar 02 porque nos queda menos de dos minutos y más de uno. Pues para ello, si llevásemos el control del tiempo en segundos, tendríamos que sumar 59 segundos, dividir por 60 segundos y descartar los decimales para saber en qué minuto "estamos".

Tal vez sea más fácil de ver con un ejemplo de milisegundos y segundos: supongamos que vamos a mostrar los segundos que nos quedan pero llevamos el conteo en milisegundos, deberíamos de mostrar un 01 (un segundo) cuando los milisegundos que quedan están entre 1 y 1000. Pues bien, si a la cantidad de milisegundos que tenemos le sumamos 999, lo dividimos entre 1000 y descartamos los decimales, obtenemos un 1 (que es lo que queríamos, un segundo si lo que queda está entre 1 y 1000 milisegundos). Si realizamos esa misma operación con cualquier otra cantidad de milisegundos, nos daría un valor diferente de uno (1001 nos daría 2, y 0 nos daría 0). Pues con la variable mostrar realizo una conversión similar varias veces: de milisegundos a fracción de segundo, de fracción de segundo a segundos y de segundos a minutos. Todo esto para mostrar el tiempo en el formato que me interese (ten en cuenta que el LED verde está mostrando "a su manera" una parte del tiempo que queda). A esa parte del programa tal vez no le encuentres sentido, pero verás que funciona.

No sé si es esto lo que buscabas o si lo que querías era solucionar tú el problema paso a paso, y por tu cuenta, para ir aprendiendo. Si es así, con no usar mi programa tienes. Aún así, he procurado comentar el código para hacerte un poco más comprensible lo que hace y espero que esto te de ideas y saques algo de provecho de él.

Adjunto programa.

JWOLVERINE

Es exactamente lo que buscaba eres un crack (de los mejores) he aprendido bastante con lo que me explicas en el post, estaba pensando en poner display de 2 dígitos con multiplexores 74HC595 para ahorarse tanto cablerio, pero vi este modulo crees queme sirva?  ModuloTM1637 de verdad que te agradezco que te tomes el timepo en explicarme saludos y muchas gracias :D

surbyte

#9
Aug 07, 2017, 03:26 pm Last Edit: Aug 07, 2017, 03:27 pm by surbyte
Claro que te sirve como el mismo modulo o similar que usa el MAX7219 que es mas conocido.

Módulo de Control de Pantalla Digital Del Tubo MAX7219 8-Digit CWG Rojo Tres IO para Arduino


EDITO: acá hay un tutorial de PROMETEC con el módulo que sugeriste TM1637

albertoG1

EDITO: acá hay un tutorial de PROMETEC con el módulo que sugeriste TM1637
Estaba leyendo los mensajes y me topé con este, que coincide con un timer que estoy terminando y es algo similar a lo que está proyectando JWOLVERINE (es que entre mis variados defectos está el dejar conectado el cautín, con lo que además del consumo eléctrico, algún día carbonizaré mi casa) y ese tutorial me ha resultado muy útil, en lugar de monedas utilizo un pulsador, cada vez que se presiona suma 30 minutos (un relé conecta la corriente al cautín).

En el tutorial de Prometec se crea una función ("CalculaDigitos ()") que vá perfecta, puede utilizarse tanto para hacer un conteo ascendente como descendente (solo cambiando en el bucle "for" en donde se invoca a la función el ++ por el --) pero no entiendo qué significa el siguiente bloque de código:

Code: [Select]
int8_t Digit0 = Num %10 ;
      int8_t Digit1 = (Num % 100) / 10 ;
      int8_t Digit2 = (Num % 1000) / 100 ;
      int8_t Digit3 = Num  / 1000  ;


¿Algún buen samaritano que me lo explique? ¿Surbyte mismo?

surbyte

Este es un truco simple para separar un número en sus partes integrales.

Supongamos que quieres presentar 1234 ya que hablamos de 4 digitos representados por digito0 a 3

Entonces que harías?
Como trabajamos con enteros recuerden que las divisioines dan siempre enteros sin fracciones.

Digito0 = 1234 Módulo 10

Módulo es una función matemática tal que restringimos el campo númerico a lo que expresamos a la derecha.
Nada supera ese número, en este caso 10. Asi que el conjunto de los números Módulo 10 será (0,1,2,3,4,5,6,7,8,9)
El resultado de Digito0 = 1234 Módulo 10 o expresado mejor 1234%10 = 4

Bien ya sabemos que Digito0 = 4
Ahora Digit1 = (Num % 100) / 10

1234 Modulo 100 = 34 o sea todo lo menor a 100
34/10 = 3 sin decimales x trabajar con enteros.
Entonces Digito1 = (1234 % 100)/10 = 3
Tenemos Digito1 = 3

La siguiente debe dar 2 o sea hacemos todo lo necesario para rescatar la centena.
Digit2 = (Num % 1000) / 100 = (1234 % 1000)/100 = 234/100 = 2

Y el ultimo el mas fácil

Digito3 = 1234/1000 = 1



JWOLVERINE

#12
Aug 07, 2017, 11:31 pm Last Edit: Aug 08, 2017, 06:29 am by JWOLVERINE
Hola el programita del amigo Ignoranteabsoluto es lo que hace exactamente, el monedero lo que hace es activar un rele que da el pulso al pin 7 de tierra en tu caso conetaria el pulsador (push button) a tierra y a la pata 7, cada que lo presiones te agregara 30 min. al llegar a 1 minuto el led parpadeara mas rapido que es señal de final del conteo, en ves de rele podrias conectar un triac y un optoacoplador para evitar framasos en los contactos del rele.  ahora para mi el reto esta en conectar un display de leds que marque el tiempo, estoy leyendo y practicando lo que los compañeros me dicen, en este video se muestra como funciona esta programado a 2 min para no esperar tanto y ver que si funciona, saludos :D  

Video

IgnoranteAbsoluto

#13
Aug 08, 2017, 12:25 am Last Edit: Aug 08, 2017, 01:04 am by IgnoranteAbsoluto
JWOLVERINE, si utilizas dos 74595 y lo montas como se ve aquí http://bildr.org/blog/wp-content/uploads/2011/02/74HC595_4.png, usando los displays en lugar de los LEDs sueltos, no necesitas multiplexar, ya que "muestras" los dos a la vez y sería fácil controlarlo en el programa. Además de que sólo necesitas tres pines para controlarlos. (No te olvides de poner las resistencias, de lo contrario puedes quemar los 74595, lo sé por experiencia).

Si utilizas el TM1637, controlando cuatro displays de 7 segmentos y además tienes los dos puntos en medio, podrías mostrar directamente los minutos y segundos restantes, para lo cual habría que modificar un poco el programa que puse. Incluso se podría hacer que, si dispones de una hora o más, muestre horas y minutos. Pasando a mostrar minutos y segundos cuando sea menos de una hora.

Nota: al ir a ver el vídeo me sale el mensaje: "Este vídeo no está disponible.", y no lo puedo ver. El vídeo ya se ve.

JWOLVERINE

#14
Aug 08, 2017, 01:08 am Last Edit: Aug 08, 2017, 04:05 am by surbyte
estaba pensando en que mostrar horas y minutos osea serian 3 display, y ya arregle lo del video es que estaba como privado en youtube xD saludos y gracias.

Go Up