Pretendo conectar un emisor de impulsos Reed a mi Arduino para contabilizar los pulsos y cuando tengo 100 pulsos activar dos salidas de arduino durante 500 ms para contabilidad que han pasado 100 pulsos.
El emisor es un Elster emeris PR7 1:100 2925M1263:
http://www.homewizard.nl/media/kb/Montagehandleiding_Falcon.pdf
Los cables empleados del emisor para contabilizar son el amarillo CH1P y negro GND.
El datasheet me indica que todas las salidas del emisor es de colector abierto. Las salidas de pulsos activas son de nivel bajo. Las salidas pueden conectarse vía resistencia pull-up hasta 30V. Por lo tanto yo configuro la entrada D2 de Arduino como pull-up, utilizando la resistencia interna que lleva Arduino que es de mas o menos 20-50 Kohm.
Este sensor está a una distancia de +-30mts del arduino. El cable no lleva malla :(, pero por el conducto por el que pasa solo va este cable que es de 2x 1,5mm. ¿puede ser esto un problema?. Tengo que detectar 0v= 0 o 1=5v.
(NO FUNCIONA) Primero probé este código. Que en la mesa de practica me funcionaba perfectamente. Pero a la hora de conectarlo a este emisor me proporcionaba mas impulsos de los que llegaba, y en el periodo de 100 pulsos, no los realizaba en el mismo tiempo. Debiendo ser en el mismo tiempo ya que el caudal no variaba:
/*Entrada digital 2 cuenta impulsos entra del emisor impulsos
Se utiliza resistencia PullUp de Arduino.
Al Contar 100 sera equivalente a 1m3. Activa una salida durante
1 seg en estado alto y luego vuelve a estado bajo. Volviendo
el contador a 0.
*/
int Pulsos=100; //Numero de pulsos para la activación del Relé
int conta = 0; //Variable para guardar el conteo de los pulsos
//--------------------------------------------------
// Constantes y variales de tiempo
//-------------------------------------------
unsigned long InicioMillis=0; //inicia tiempo
unsigned long FinMillis=0; //Finaliza tiempo
const long intervalo=1000; //Tiempo de cerrado del contacto del relé
int EnTiempo=0; //1= en tiempo de intervalo, 0= no intervalo.
//------------------------------------
void setup()
{
Serial.begin(9600); //Inicia comunicación serial
pinMode(2,INPUT_PULLUP); //Configura el pin 2 como una entrada, pulsador Con resistencia Pullup
pinMode(13,OUTPUT); //Configura el pin 13 como una salida, Relé
}
void loop()
{
//Si pulsador pulsado.
if ( digitalRead(2) == HIGH )
{
delay(20); //tiempo anti-rebore.
// Si el pulsador no esta oprimido, flanco de bajada.Para
//saber que a terminado el pulso.
if ( digitalRead(2) == LOW )
{
conta++; //Incrementa el contador
Serial.println(conta); //Imprime el valor por consola
delay (20); // Tiempo anti-rebote
}
}
// Si el valor del contador es 100 tenemos 1 m3 y mandamos
//Un estado en alto en la salida 13 de 1 seg. Volviendo luego a
//Estado bajo.
if (conta==Pulsos)
{
digitalWrite(13,HIGH);
Serial.println("PRENDE");
InicioMillis=millis();//inicia el tiempo de 1 seg de retardo.
EnTiempo=1; //1= en tiempo de intervalo.
conta=0; //Volvemos contador a 0 para que vuelva a contar.
}
if(millis()-InicioMillis>=intervalo&&EnTiempo==1){//si transcurre 1 seg hace esto o en tiempo de intervalo hace esto
digitalWrite(13,LOW);
Serial.println("OFF");
EnTiempo=0; //0= desactivamos intervalo.
}
}
Navegando y buscando por el foro encontré este post:
https://forum.arduino.cc/index.php?topic=73341.0
Donde vi que tenia el mismo problema, tenia que comprobar el estado anteriores.
Ahora he modificado el código que es el:
/*Entrada digital 2 cuenta impulsos entra del emisor impulsos
Se utiliza resistencia PullUp de Arduino.
Al Contar 100 sera equivalente a 1m3. Activa una salida durante
1 seg en estado alto y luego vuelve a estado bajo. Volviendo
el contador a 0.
*/
int Pulsos=100; //Numero de pulsos para la activación del Relé.
const int boton = 2; //Entrada emisor impulsos
const int Rele = 13; //Salida rele
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
// Constantes y variales de tiempo
//-------------------------------------------
unsigned long InicioMillis=0; //inicia tiempo
unsigned long FinMillis=0; //Finaliza tiempo
const long intervalo=100; //Tiempo de cerrado del contacto del relé
int EnTiempo=0; //1= en tiempo de intervalo, 0= no intervalo.
//------------------------------------
//Funcion principal
//------------------------------------
void setup()
{
Serial.begin(9600); //Inicia comunicación serie
pinMode(boton,INPUT_PULLUP); //Configura el pin 2 como una entrada, con resistencia pullup
pinMode(Rele,OUTPUT); //Configura el pin 13 como una salida, LED
}
//------------------------------------
//Funcion ciclica
//------------------------------------
void loop()
{
valorBoton=digitalRead(boton); //Leemos el estado del interruptor emisor
if(valorBoton!=estadoAnteriorBoton){ //Si hay un cambio de estado, entramos en el if
if(valorBoton==0){
contador++; //Aumentamos en una unidad la cuenta
Serial.println(contador); //Imprime el valor por consola
}
}
if(contador==Pulsos)
{
digitalWrite(Rele,HIGH);
Serial.println("PRENDE");
InicioMillis=millis();//inicia el tiempo de 1 seg de retardo.
EnTiempo=1; //1= en tiempo de intervalo.
contador=0; //Volvemos contador a 0 para que vuelva a contar.
}
if(millis()-InicioMillis>=intervalo&&EnTiempo==1){//si transcurre 1 seg hace esto o en tiempo de intervalo hace esto
digitalWrite(Rele,LOW);
Serial.println("OFF");
EnTiempo=0; //0= desactivamos intervalo.
}
estadoAnteriorBoton=valorBoton; //guardamos el estado actual del pulsador para la siguiente iteración
}
Tengo que comprobar este código, espero que sea esta la solución.
¿habría alguna otra forma de contabilizarlo?.
Gracias.