Problemas contador de pulsos (Solucionado)

Bueno estoy generando un proyecto simple con arduino (En realidad es un Seeeduino trabaja igual que arduino uno), es un contador de pulsos aca esta el código

/*
 --------------------------------------------- 
  Contador de pulsos
 ---------------------------------------------
 
  Programa que muestra por pantalla (consola serial) el número 
   de veces que el pulsador ha sido presionado, se realiza un 
   proceso que de acuerdo al número de pulsaciones se enciende 
   un LED,
 
 Cosas de Mecatrónica y Tienda de Robótica
 
*/
 
//--------------------------------------------------
//Declara puertos de entradas y salidas y variables
//--------------------------------------------------
int conta = 0;  //Variable para guardar el conteo de los pulsos
 
//------------------------------------
//Funcion principal
//------------------------------------
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
  Serial.begin(9600);   //Inicia comunicación serial
  pinMode(2,INPUT);     //Configura el pin 2 como una entrada, pulsador
  pinMode(13,OUTPUT);   //Configura el pin 13 como una salida, LED
}
 
//------------------------------------
//Funcion ciclicla
//------------------------------------
void loop() // Esta funcion se mantiene ejecutando
{           //  cuando este energizado el Arduino
 
  // Si el pulsador esta oprimido
  if ( digitalRead(2) == HIGH ) 
  {
      // Si el pulsador no esta oprimido, flanco de bajada
      if ( digitalRead(2) == LOW )
      {
         conta++;               //Incrementa el contador
         Serial.println(conta); //Imprime el valor por consola
         delay (100);           // Retardo
      }
  }
 
  // Si el valor del contador es 5
  if (conta==5)
  {
    digitalWrite(13,HIGH);  //Enciende el LED
  }
 
  // Si el valor del contador es 8
  if (conta==8)
  {
    digitalWrite(13,LOW);  // Apaga el LED
  }
 
}

Acá este el link del proyecto para mas entendimiento

http://www.cosasdemecatronica.com/tutoriales/arduino/296-arduino-basico-t17ab-contador-de-pulsos

Como pudieron observar el código genera el conteo de pulsos imprimiéndolos por salida serial

Problema

El problema esta en que cuando se presiona el pulsador muy rápido o de repente al ir pulsando hay pulsos que no son contabilizados ni impresos, me gustaría saber si hay alguna solución para eso , de ante mano muchas gracias

Has pensado usar interrupciones? es justo lo que necesitas.

http://arduino.cc/en/Reference/AttachInterrupt
http://tronixstuff.wordpress.com/2010/04/20/getting-started-with-arduino-chapter-three/

Con ese código necesitas que el muestreo coincida con la pulsación, con interrupciones las cazas fijo.

aero_yo:
Has pensado usar interrupciones? es justo lo que necesitas.

attachInterrupt() - Arduino Reference
http://tronixstuff.wordpress.com/2010/04/20/getting-started-with-arduino-chapter-three/

Con ese código necesitas que el muestreo coincida con la pulsación, con interrupciones las cazas fijo.

Leí lo de los links pero no supe como aplicarlo a mi código si podrías indicarme como se puede aplicar estaría muy agradecido

yo tengo hecho el proyecto del boton de facebook que cuenta los pulsos, al principio tenia los mísmos problemas que tu, (confieso que no he leido tu código) pero este funciona, solo tienes que implementar el led y quitar la pantalla

#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int boton = 8; 
int valor=0;
int contador=0;
int estadoanteriorboton=0;
void setup() {
  pinMode(boton,INPUT);
  digitalWrite(boton,HIGH);
  lcd.begin(16, 2);
  lcd.setCursor(0, 1);
  lcd.print("People like this!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print("People like this!");
  valor=digitalRead(boton);
  if(valor!=estadoanteriorboton){
  if(valor==1){
  contador++;
  lcd.setCursor(5 , 0);
  lcd.print(contador);
  lcd.print("!!");
  }
  }
  estadoanteriorboton=valor;
  
}

Ya he leido tu codigo, el problema es que no compruebas el estado anterior del pin, así que si tu loop{ } tarda en completarse 5 milisegundos te va a contar pulsaciones a patadas...

de todas maneras el contador es un ejemplo que está en el playground si no me equivoco

Zid_:
yo tengo hecho el proyecto del boton de facebook que cuenta los pulsos, al principio tenia los mísmos problemas que tu, (confieso que no he leido tu código) pero este funciona, solo tienes que implementar el led y quitar la pantalla

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int boton = 8;
int valor=0;
int contador=0;
int estadoanteriorboton=0;
void setup() {
 pinMode(boton,INPUT);
 digitalWrite(boton,HIGH);
 lcd.begin(16, 2);
 lcd.setCursor(0, 1);
 lcd.print("People like this!");
}

void loop() {
 lcd.setCursor(0, 1);
 lcd.print("People like this!");
 valor=digitalRead(boton);
 if(valor!=estadoanteriorboton){
 if(valor==1){
 contador++;
 lcd.setCursor(5 , 0);
 lcd.print(contador);
 lcd.print("!!");
 }
 }
 estadoanteriorboton=valor;
 
}




Ya he leido tu codigo, el problema es que no compruebas el estado anterior del pin, así que si tu loop{ } tarda en completarse 5 milisegundos te va a contar pulsaciones a patad
de todas maneras el contador es un ejemplo que está en el playground si no me equivoco

Tenias toda la razón tenia que comprobar el estado anteriores muchas gracias solucione mi problema :slight_smile:

También lo de las interrupciones me funco pero con algunos problemas, gracias por su ayuda se les agradece :slight_smile:

Hola a todos los que comparten este foro, me parece excelente la idea de poder ayudar y ser ayudado.
Yo soy estudiante de ITI y estoy con un proyecto de un robot movil con una tarjeta arduino mega 2560. No he programado nunca algo similar y me he leido mil y un foro, pero no consigo adelantar mis sketch, si alguien me pudiese ayudar.
El primer problema que me surge es que quiero leer la entrada de unos microswitch de 8 canales de tal manera que me muestre el valor decimal que corresponde en cada momento, la actualizacion la realizo mediante un pulsador. Al pulsar la primera vez me debería dar angulos y a la segunda distancias y así sucesivamente, pero con el codigo que he elaborado me da distancias y despues angulos y nunca mas se vuelve a repetir el ciclo.

Este es mi codigo:

//* TEST DE MICROSWTCH //
//Este test se realiza para interepretar la configuración de un microswitch de 8 canales gobernado por //
//otro interruptor que marcará la diferencia entre interpretación de ángulos y de distancias //
//Se asignan los pines de conexión de cada canal de los microswitch //
int Sel=40;
int sw1=46;
int sw2=47;
int sw3=48;
int sw4=49;
int sw5=50;
int sw6=51;
int sw7=52;
int sw8=53;
//Se crea una variable que dependiendo de su valor interpretará ángulos en grados o distancia en ctms. //
//El identificador de dicha variable será AngDis. AngDis=1-->ángulos; AngDis=2-->distancia //
int AngDis=0;
int Switch1;
int Switch2;
int Switch3;
int Switch4;
int Switch5;
int Switch6;
int Switch7;
int Switch8;
int Unid;
int Dec;
int Total;
int TotalG;
int TotalC;
int sel=1;
void setup ()
{
Serial.begin (9600);
Serial.println("!Test de Interpretacion Microswitchs!");
pinMode (Sel,INPUT);
pinMode (sw1,INPUT);
pinMode (sw2,INPUT);
pinMode (sw3,INPUT);
pinMode (sw4,INPUT);
pinMode (sw5,INPUT);
pinMode (sw6,INPUT);
pinMode (sw7,INPUT);
pinMode (sw8,INPUT);
}
void loop ()
{
if (sel==0);
{
while (digitalRead(Sel)==0);
{
sel=sel+1;
Switch1= digitalRead(sw1);
Switch2= digitalRead(sw2);
Switch3= digitalRead(sw3);
Switch4= digitalRead(sw4);
Switch5= digitalRead(sw5);
Switch6= digitalRead(sw6);
Switch7= digitalRead(sw7);
Switch8= digitalRead(sw8);
Unid = Switch1
1+Switch22+Switch34+Switch48;
Dec = Switch5
1+Switch62+Switch74+Switch88;
Total = Unid + Dec
10;
while(sel==1)
{
TotalG=Total;
Serial.print("Angulo =");
// delay(100);
Serial.print( TotalG);
// delay(100);
Serial.println(" grados");
// delay;
while (digitalRead(Sel)==1)
{
sel=sel+1;
}
}
}
while(sel==2)
{
TotalC=Total;
Serial.print("Distancia =");
// delay(100);
Serial.print(TotalC);
// delay(100);
Serial.println(" centimetros");
while (digitalRead(Sel)==HIGH);
{
sel=sel-2;
}
}
}
}

Hola a todos,

Me acaba de llegar el arduino y viendo lo del contador de pulsos me he tomado la libertad de "fusionar" las implementaciones que habéis puesto aquí (la primera y la segunda) para aprovechar la escritura en el monitor serie del valor del contador y a la vez encender un led en cada pulsación.

Espero que sea útil a alguien.

Un saludo!!

/*

Contador de pulsos

Programa que muestra por pantalla (consola serial) el número
de veces que el pulsador ha sido presionado. Además, cada vez
que aumenta la cuenta, se enciende un LED.

*/

//--------------------------------------------------
//Declara puertos de entradas y salidas y variables
//--------------------------------------------------
const int boton = 2; //Le ponemos nombre al pin 2
const int led = 13; //Le ponemos nombre al pin 13
int contador = 0; //Variable para guardar la cuenta de pulsaciones
int estadoAnteriorBoton = 0; //Declaramos e inicializamos la variable
int valorBoton = 0; //Declaramos e inicializamos la variable
//------------------------------------
//Funcion principal
//------------------------------------
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
Serial.begin(9600); //Inicia comunicación serie
pinMode(boton,INPUT); //Configura el pin 2 como una entrada, pulsador
pinMode(led,OUTPUT); //Configura el pin 13 como una salida, LED
}

//------------------------------------
//Funcion ciclica
//------------------------------------
void loop() // Esta funcion se mantiene ejecutando
{ // cuando este alimentado el Arduino

valorBoton=digitalRead(boton); //Leemos el estado del pulsador

if(valorBoton!=estadoAnteriorBoton){ //Si hay un cambio de estado, entramos en el if

if(valorBoton==1){
contador++; //Aumentamos en una unidad la cuenta
Serial.println(contador); //Imprime el valor por consola
digitalWrite(led,HIGH); //Encendemos el led
}
if(valorBoton==0){
digitalWrite(led,LOW); //Apagamos el led
}
}
estadoAnteriorBoton=valorBoton; //guardamos el estado actual del pulsador para la siguiente iteración
}

//Fin programa

Pues yo tenia el mismo problema, con varios pulsores me mandaba mas pulsos de los que eran, la forma en que yo lo resolví fue evaluando la diferencia en milisegundos entre cada pulso así los pulsos que tienen de diferencia menos de 300 milisegundos los descarta, así tuve un conteo confiable.