Hola buenas, soy nuevo en este foro y en el mundillo del arduino ... tengo un problema ... tengo un contador de creditos (como si fuese un contador normal olvidense de los creditos xD) cuando le doy a un switch la cuenta aumenta a 4 cada vez que le de (por ahora hasta 8 porque nose poner otro display para que funcione ... ._.) después hay otro pulsador que "gasta creditos" (baja de 1 en 1 cada vez que le das) cuando llega a 0 un relé se activa abriendo un circuito para que no funcione sin meterle mas creditos. Ahora el problema .... necesito desbloquear y bloquear ese pulsador de "gastar creditos" con otro pulsador como lo haria? e pensado en usar un relé pero no tengo ni idea de como hacerlo ni código ni nada ...
Muchas gracias de antemano
A ver si he entendido... quieres "deshabilitar" un pulsador cuando se aprieta otro? o quieres que se deshabilite al quedarte sin créditos?
A nivel de programación ambas opciones son muy simples, únicamente tienes que tener unos contadores (o variable booleana si es el primer caso), y en función del valor que tengan, ignorar la pulsación o no.
WeSo escribió:A ver si he entendido... quieres "deshabilitar" un pulsador cuando se aprieta otro? o quieres que se deshabilite al quedarte sin créditos?
A nivel de programación ambas opciones son muy simples, únicamente tienes que tener unos contadores (o variable booleana si es el primer caso), y en función del valor que tengan, ignorar la pulsación o no.
Quiero deshabilitar y habilitar un pulsador pulsando otro simples claro que puede ser para alguien que sabe pero yo ... XD fuera de automatismos industriales no se nada
Has hecho algo de lecturas digitales con Arduino? Te podría poner un código sin probar, pero creo que lo mejor de Arduino es hacerlo uno mismo para aprender
La idea es la siguiente en pseudocodigo:
Código: estadoAnteriorPulsador = abierto
deshabilitado = falso
bucle principal
estado = leerPulsadorDeshabilitar
si estado != estadoAnteriorPulsador && estado = cerrado // hay pulsación
deshabilitado = !deshabilitado // Habilitados o deshabilitamos en cada pulsación
estadoAnteriorPulsador = estado
si deshabilitado
ignoramos pulsacionCreditos
no deshabilitado
operamos pulsacionCreditos
Más o menos sería algo así, simplemente tener en cuenta las pulsaciones, que sólo te cuente la primera (por si dejas el pulsador apretado), y en función del booleano "deshabilitado", pues ignoras las pulsaciones del botón de créditos o no.
Lo suyo sería hacerlo con interrupciones y tal, pero bueno, con arduino se suele hacer más "a lo bruto" :elrisas:
Tendria que indicar un pin de entrada y un pin de salida para ese pulsador no? si le pongo una función antirebote evitaria el problema de mantener pulsado y que se vuelva loco no? xD (otra cosa que no viene a cuento ... WeSo ... me encanta tu prusa pronto me pillaré la mia a ver si hay suerte jajaja estoy trabajando en un taller enfrente de Createc3D y cada vez que paso al lado babeo xD)
Pin de entrada para cada uno de los pulsadores... y de salida si quieres que éstos hagan alguna acción.
Para evitar rebotes puedes hacerlo por software o por hardware. En el primer caso suele bastar con poner un delay de unos milisegundos al detectar una pulsación, para que ignore dichos rebotes; en el segundo caso, el compañero @ Jorge diseñó unas plaquitas pequeñas con el pulsador y su sistema antirebotes.
Mi prusa no es de las más bonitas del foro, pero sí que estoy orgulloso de la calidad que me saca Ten cuidado que ésto es un vicio!!
Menudo lio a ver ... te pongo el codigo que estoy usando (ya algunas cosas son chapuceras como la salida 11 para un relé xD en codigo esta copiado con unas modificaciones que necesitaba.
Código: /* se declaran las contantes para identificar cada led*/
const int r = 11;
const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 8;
const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
const int tiempoAntirebote =10;
int cuenta =0; //lleva la cuenta
int estadoBtnIncremento;
int estadoBtnIncrementoAnterior;
int estadoBtnDecremento;
int estadoBtnDecrementoAnterior;
boolean antirebote (int pin ) {
int contador =0;
boolean estado; // guarda el estado del boton
boolean estadoAnterior; // guarda el ultimo estado del boton
do {
estado = digitalRead (pin);
if (estado != estadoAnterior ){ // comparamos el estado actual
contador =0; // reiniciamos el contador
estadoAnterior= estado;
}
else{
contador = contador +1; // aumentamos el contador en 1
}
delay (1);
}
while (contador < tiempoAntirebote);
return estado;
}
/* Metodo para elegir que numero mostrar en el display*/
void actualizarNumero(){
switch (cuenta) {
case 0:
/*Bloque para mostrar un 0*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(r, HIGH);
break;
case 1:
/*Bloque para mostrar un 1*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 2:
/*Bloque para mostrar un 2*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 3:
/*Bloque para mostrar un 3*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 4:
/*Bloque para mostrar un 4*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 5:
/*Bloque para mostrar un 5*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 6:
/*Bloque para mostrar un 6*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 7:
/*Bloque para mostrar un 7*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 8:
/*Bloque para mostrar un 8*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 9:
/*Bloque para mostrar un 9*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
}
}
void setup(){
/*Declaramos los segmetos del display como salidas*/
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(r, OUTPUT);
/*Declaramos los botones como entradas*/
pinMode(BtnIncremento, INPUT);
pinMode(BtnDecremento, INPUT);
}
void loop() {
estadoBtnIncremento = digitalRead(BtnIncremento);
if (estadoBtnIncremento != estadoBtnIncrementoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnIncremento)){ //checamos si esta preionado y si lo esta
cuenta = cuenta + 4; //aumentamos la cuenta
if (cuenta > 9){
cuenta = 9;
}
}
}
estadoBtnIncrementoAnterior = estadoBtnIncremento; // guardamos el estado del boton
estadoBtnDecremento = digitalRead(BtnDecremento); //leemos el estado del boton
if (estadoBtnDecremento != estadoBtnDecrementoAnterior) { // si hay cambio con respeto al estado anterior
if (antirebote (BtnDecremento)){ //si el boton esta presionado disminuimos la cuenta
cuenta--;
if (cuenta<0){
cuenta = 0;
}
}
}
estadoBtnDecrementoAnterior = estadoBtnDecremento; //guardamos el estado del boton
actualizarNumero(); //desplegamos la cuenta en el display
}
Como lo harias? estoy perdido hasta tanto no llego x.x me quedan libres los pines 12 y 13.
Es similar la idea a lo que yo te puse is1: Utiliza una función antirebote con un bucle de X loops con un delay de 1ms, en lugar de poner directamente un delay mayor. Y luego en el loop pues lo mismo, comprueba los botones y modifica los estados. Lo que te falta añadir sería lo de deshabilitar el botón de decrementar (entendí que es ese) con un tercer pulsador.
Sería algo así, reutilizando tu código y estructura (utilizando el pin 12):
Código: /* se declaran las contantes para identificar cada led*/
const int r = 11;
const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 8;
const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
const int BtnBloqueo = 12; // boton de bloqueo conectado al pin 12
const int tiempoAntirebote =10;
int cuenta =0; //lleva la cuenta
int estadoBtnIncremento;
int estadoBtnIncrementoAnterior;
int estadoBtnDecremento;
int estadoBtnDecrementoAnterior;
int estadoBtnBloqueo;
int estadoBtnBloqueoAnterior;
boolean bloqueo = false; // De inicio está desbloqueado, también se podría hacer con el estado
boolean antirebote (int pin ) {
int contador =0;
boolean estado; // guarda el estado del boton
boolean estadoAnterior; // guarda el ultimo estado del boton
do {
estado = digitalRead (pin);
if (estado != estadoAnterior ){ // comparamos el estado actual
contador =0; // reiniciamos el contador
estadoAnterior= estado;
}
else{
contador = contador +1; // aumentamos el contador en 1
}
delay (1);
}
while (contador < tiempoAntirebote);
return estado;
}
/* Metodo para elegir que numero mostrar en el display*/
void actualizarNumero(){
switch (cuenta) {
case 0:
/*Bloque para mostrar un 0*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(r, HIGH);
break;
case 1:
/*Bloque para mostrar un 1*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 2:
/*Bloque para mostrar un 2*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 3:
/*Bloque para mostrar un 3*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 4:
/*Bloque para mostrar un 4*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 5:
/*Bloque para mostrar un 5*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 6:
/*Bloque para mostrar un 6*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 7:
/*Bloque para mostrar un 7*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 8:
/*Bloque para mostrar un 8*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 9:
/*Bloque para mostrar un 9*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
}
}
void setup(){
/*Declaramos los segmetos del display como salidas*/
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(r, OUTPUT);
/*Declaramos los botones como entradas*/
pinMode(BtnIncremento, INPUT);
pinMode(BtnDecremento, INPUT);
pinMode(BtnBloqueo, INPUT);
}
void loop() {
estadoBtnBloqueo = digitalRead(BtnBloqueo);
if (estadoBtnBloqueo != estadoBtnBloqueoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnBloqueo)){ //checamos si esta preionado y si lo esta
bloqueo = !bloqueo;
}
}
estadoBtnIncrementoAnterior = estadoBtnIncremento; // guardamos el estado del boton
estadoBtnIncremento = digitalRead(BtnIncremento);
if (estadoBtnIncremento != estadoBtnIncrementoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnIncremento)){ //checamos si esta preionado y si lo esta
cuenta = cuenta + 4; //aumentamos la cuenta
if (cuenta > 9){
cuenta = 9;
}
}
}
estadoBtnIncrementoAnterior = estadoBtnIncremento; // guardamos el estado del boton
if (!bloqueo) { // Si está bloqueado, lo ignoramos, y en otro caso, lo leemos
estadoBtnDecremento = digitalRead(BtnDecremento); //leemos el estado del boton
if (estadoBtnDecremento != estadoBtnDecrementoAnterior) { // si hay cambio con respeto al estado anterior
if (antirebote (BtnDecremento)){ //si el boton esta presionado disminuimos la cuenta
cuenta--;
if (cuenta<0){
cuenta = 0;
}
}
}
estadoBtnDecrementoAnterior = estadoBtnDecremento; //guardamos el estado del boton
}
actualizarNumero(); //desplegamos la cuenta en el display
}
Por otro lado, con un integrado podrías ahorrarte utilizar 8 pines para manejar el 7 segementos. Por ejemplo con el CD4511, únicamente necesitarías 4 salidas. Pero vamos, ésto ya es algo opcional y como dato por si necesitas pines.
Voy a probar a ver si consigo hacerlo yo XD en ese código que me has pasado ya esta todo incluido? solo tendria que poner el pulsado en el pin 12?
Ese código si pones el pulsador al pin 12, cada vez que lo pulses, habilitará o deshabilitará el pulsador de decremento. No lo he probado, pero la teoría es esa xDD He comentado las lineas que he añadido, que son pocas y no tiene complicación
Pues no va ._. o soy yo (que no seria raro xD) meti por un lado del pulsador 5 v y la salida del pulsador al pin 12
Qué malo soy para ésto del copy&paste :elrisas:
Prueba ésto, que no cambié el nombre de un par de variables :roto2:
Código: /* se declaran las contantes para identificar cada led*/
const int r = 11;
const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 8;
const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
const int BtnBloqueo = 12; // boton de bloqueo conectado al pin 12
const int tiempoAntirebote =10;
int cuenta =0; //lleva la cuenta
int estadoBtnIncremento;
int estadoBtnIncrementoAnterior;
int estadoBtnDecremento;
int estadoBtnDecrementoAnterior;
int estadoBtnBloqueo;
int estadoBtnBloqueoAnterior;
boolean bloqueo = false; // De inicio está desbloqueado, también se podría hacer con el estado
boolean antirebote (int pin ) {
int contador =0;
boolean estado; // guarda el estado del boton
boolean estadoAnterior; // guarda el ultimo estado del boton
do {
estado = digitalRead (pin);
if (estado != estadoAnterior ){ // comparamos el estado actual
contador =0; // reiniciamos el contador
estadoAnterior= estado;
}
else{
contador = contador +1; // aumentamos el contador en 1
}
delay (1);
}
while (contador < tiempoAntirebote);
return estado;
}
/* Metodo para elegir que numero mostrar en el display*/
void actualizarNumero(){
switch (cuenta) {
case 0:
/*Bloque para mostrar un 0*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(r, HIGH);
break;
case 1:
/*Bloque para mostrar un 1*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 2:
/*Bloque para mostrar un 2*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 3:
/*Bloque para mostrar un 3*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 4:
/*Bloque para mostrar un 4*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 5:
/*Bloque para mostrar un 5*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 6:
/*Bloque para mostrar un 6*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 7:
/*Bloque para mostrar un 7*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 8:
/*Bloque para mostrar un 8*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 9:
/*Bloque para mostrar un 9*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
}
}
void setup(){
/*Declaramos los segmetos del display como salidas*/
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(r, OUTPUT);
/*Declaramos los botones como entradas*/
pinMode(BtnIncremento, INPUT);
pinMode(BtnDecremento, INPUT);
pinMode(BtnBloqueo, INPUT);
}
void loop() {
estadoBtnBloqueo = digitalRead(BtnBloqueo);
if (estadoBtnBloqueo != estadoBtnBloqueoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnBloqueo)){ //checamos si esta preionado y si lo esta
bloqueo = !bloqueo;
}
}
estadoBtnBloqueoAnterior = estadoBtnBloqueo; // guardamos el estado del boton
estadoBtnIncremento = digitalRead(BtnIncremento);
if (estadoBtnIncremento != estadoBtnIncrementoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnIncremento)){ //checamos si esta preionado y si lo esta
cuenta = cuenta + 4; //aumentamos la cuenta
if (cuenta > 9){
cuenta = 9;
}
}
}
estadoBtnIncrementoAnterior = estadoBtnIncremento; // guardamos el estado del boton
if (!bloqueo) { // Si está bloqueado, lo ignoramos, y en otro caso, lo leemos
estadoBtnDecremento = digitalRead(BtnDecremento); //leemos el estado del boton
if (estadoBtnDecremento != estadoBtnDecrementoAnterior) { // si hay cambio con respeto al estado anterior
if (antirebote (BtnDecremento)){ //si el boton esta presionado disminuimos la cuenta
cuenta--;
if (cuenta<0){
cuenta = 0;
}
}
}
estadoBtnDecrementoAnterior = estadoBtnDecremento; //guardamos el estado del boton
}
actualizarNumero(); //desplegamos la cuenta en el display
}
Aún así, te funciona todo de normal, sin el bloqueo, no?
Sigue sin ir, si ... funciona todo menos el bloqueo, lo e copiado tal como lo has puesto y tampoco va.
Pero qué no va exactamente? no compila? al darle al botón de bloqueo no lo bloquea? no va nada? un poco más de info vendría bien
Habría que ver si "bloqueo" cambia de valor o está siempre a false. Para depurar en Arduino te puedes hacer un Serial y conectar por ejemplo con Putty al puerto para leer valores:
Código: /* se declaran las contantes para identificar cada led*/
const int r = 11;
const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 8;
const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
const int BtnBloqueo = 12; // boton de bloqueo conectado al pin 12
const int tiempoAntirebote =10;
int cuenta =0; //lleva la cuenta
int estadoBtnIncremento;
int estadoBtnIncrementoAnterior;
int estadoBtnDecremento;
int estadoBtnDecrementoAnterior;
int estadoBtnBloqueo;
int estadoBtnBloqueoAnterior;
boolean bloqueo = false; // De inicio está desbloqueado, también se podría hacer con el estado
boolean antirebote (int pin ) {
int contador =0;
boolean estado; // guarda el estado del boton
boolean estadoAnterior; // guarda el ultimo estado del boton
do {
estado = digitalRead (pin);
if (estado != estadoAnterior ){ // comparamos el estado actual
contador =0; // reiniciamos el contador
estadoAnterior= estado;
}
else{
contador = contador +1; // aumentamos el contador en 1
}
delay (1);
}
while (contador < tiempoAntirebote);
return estado;
}
/* Metodo para elegir que numero mostrar en el display*/
void actualizarNumero(){
switch (cuenta) {
case 0:
/*Bloque para mostrar un 0*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(r, HIGH);
break;
case 1:
/*Bloque para mostrar un 1*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 2:
/*Bloque para mostrar un 2*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 3:
/*Bloque para mostrar un 3*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 4:
/*Bloque para mostrar un 4*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 5:
/*Bloque para mostrar un 5*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 6:
/*Bloque para mostrar un 6*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 7:
/*Bloque para mostrar un 7*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 8:
/*Bloque para mostrar un 8*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 9:
/*Bloque para mostrar un 9*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
}
}
void setup(){
/*Declaramos los segmetos del display como salidas*/
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(r, OUTPUT);
/*Declaramos los botones como entradas*/
pinMode(BtnIncremento, INPUT);
pinMode(BtnDecremento, INPUT);
pinMode(BtnBloqueo, INPUT);
Serial.begin(9600);
}
void loop() {
estadoBtnBloqueo = digitalRead(BtnBloqueo);
if (estadoBtnBloqueo != estadoBtnBloqueoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnBloqueo)){ //checamos si esta preionado y si lo esta
bloqueo = !bloqueo;
Serial.println("Entra en bloqueo");
}
}
estadoBtnBloqueoAnterior = estadoBtnBloqueo; // guardamos el estado del boton
estadoBtnIncremento = digitalRead(BtnIncremento);
if (estadoBtnIncremento != estadoBtnIncrementoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnIncremento)){ //checamos si esta preionado y si lo esta
cuenta = cuenta + 4; //aumentamos la cuenta
if (cuenta > 9){
cuenta = 9;
}
}
}
estadoBtnIncrementoAnterior = estadoBtnIncremento; // guardamos el estado del boton
if (!bloqueo) { // Si está bloqueado, lo ignoramos, y en otro caso, lo leemos
estadoBtnDecremento = digitalRead(BtnDecremento); //leemos el estado del boton
if (estadoBtnDecremento != estadoBtnDecrementoAnterior) { // si hay cambio con respeto al estado anterior
if (antirebote (BtnDecremento)){ //si el boton esta presionado disminuimos la cuenta
cuenta--;
if (cuenta<0){
cuenta = 0;
}
}
}
estadoBtnDecrementoAnterior = estadoBtnDecremento; //guardamos el estado del boton
}
actualizarNumero(); //desplegamos la cuenta en el display
}
No bloquea, cuando abro el monitor serial empieza a espamear "entra en bloqueo"
Es decir, que aunque no pulses entra. La función antirebote devuelve HIGH o LOW, asi que prueba a igulalarlo en el IF a HIGH (le metes 5v):
Código: /* se declaran las contantes para identificar cada led*/
const int r = 11;
const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 8;
const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10
const int BtnBloqueo = 12; // boton de bloqueo conectado al pin 12
const int tiempoAntirebote =10;
int cuenta =0; //lleva la cuenta
int estadoBtnIncremento;
int estadoBtnIncrementoAnterior;
int estadoBtnDecremento;
int estadoBtnDecrementoAnterior;
int estadoBtnBloqueo;
int estadoBtnBloqueoAnterior;
boolean bloqueo = false; // De inicio está desbloqueado, también se podría hacer con el estado
boolean antirebote (int pin ) {
int contador =0;
boolean estado; // guarda el estado del boton
boolean estadoAnterior; // guarda el ultimo estado del boton
do {
estado = digitalRead (pin);
if (estado != estadoAnterior ){ // comparamos el estado actual
contador =0; // reiniciamos el contador
estadoAnterior= estado;
}
else{
contador = contador +1; // aumentamos el contador en 1
}
delay (1);
}
while (contador < tiempoAntirebote);
return estado;
}
/* Metodo para elegir que numero mostrar en el display*/
void actualizarNumero(){
switch (cuenta) {
case 0:
/*Bloque para mostrar un 0*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(r, HIGH);
break;
case 1:
/*Bloque para mostrar un 1*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 2:
/*Bloque para mostrar un 2*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 3:
/*Bloque para mostrar un 3*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 4:
/*Bloque para mostrar un 4*/
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 5:
/*Bloque para mostrar un 5*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 6:
/*Bloque para mostrar un 6*/
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 7:
/*Bloque para mostrar un 7*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(r, LOW);
break;
case 8:
/*Bloque para mostrar un 8*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
break;
case 9:
/*Bloque para mostrar un 9*/
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(r, LOW);
}
}
void setup(){
/*Declaramos los segmetos del display como salidas*/
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(r, OUTPUT);
/*Declaramos los botones como entradas*/
pinMode(BtnIncremento, INPUT);
pinMode(BtnDecremento, INPUT);
pinMode(BtnBloqueo, INPUT);
Serial.begin(9600);
}
void loop() {
estadoBtnBloqueo = digitalRead(BtnBloqueo);
if (estadoBtnBloqueo != estadoBtnBloqueoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnBloqueo) == HIGH){ //checamos si esta preionado y si lo esta
bloqueo = !bloqueo;
Serial.println("Entra en bloqueo");
}
}
estadoBtnBloqueoAnterior = estadoBtnBloqueo; // guardamos el estado del boton
estadoBtnIncremento = digitalRead(BtnIncremento);
if (estadoBtnIncremento != estadoBtnIncrementoAnterior) { // si hay cambio con respeto al estado
if (antirebote (BtnIncremento)){ //checamos si esta preionado y si lo esta
cuenta = cuenta + 4; //aumentamos la cuenta
if (cuenta > 9){
cuenta = 9;
}
}
}
estadoBtnIncrementoAnterior = estadoBtnIncremento; // guardamos el estado del boton
if (!bloqueo) { // Si está bloqueado, lo ignoramos, y en otro caso, lo leemos
estadoBtnDecremento = digitalRead(BtnDecremento); //leemos el estado del boton
if (estadoBtnDecremento != estadoBtnDecrementoAnterior) { // si hay cambio con respeto al estado anterior
if (antirebote (BtnDecremento)){ //si el boton esta presionado disminuimos la cuenta
cuenta--;
if (cuenta<0){
cuenta = 0;
}
}
}
estadoBtnDecrementoAnterior = estadoBtnDecremento; //guardamos el estado del boton
}
actualizarNumero(); //desplegamos la cuenta en el display
}
No recuerdo el valor de HIGH, pero si es un 1, en C al meterlo en un if debería ser cierto...
Doy por hecho que está bien conectado y tal.
Diria que esta bien conectado ... no tengo ningún esquema pero bueno XD bueno si tengo un esquema del circuito del relé y del display y el boton de bloqueo va de los 5v del arduino al pulsador y del pulsador al pin 12 ._.
Pd. Con el codigo que me acabas de pasar sigue sin ir ._.
Has probado el último código? Si spammea el mensaje sin pulsar, es que está entrando, por lo que yo diría que no está bien conectado...
Esto es muy raro XD abro el monitor serial y sale esto http://prntscr.com/626u52 cuando pulso el de incremento ya se vuelve loco y solo sale entra en bloqueo
Es decir, no te está leyendo bien la entrada... cómo es el esquema? le has puesto alguna resistencia?
|