// contador usando IRQ de Arduino para contar las vueltas de un bobinador
#include <LiquidCrystal.h>
/* RS, E, D4, D5, D6, D7 */
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int variable = 0; // usadas para el sistema anti-rebote
int variable2 = 0;
unsigned long contadorVueltas = 0; // las que lleva hechas
unsigned long vueltas_a_hacer = 1; // las vueltas que hará, definidas por el usuario
unsigned long numeroMaximoVueltas = 4294967295; // 2 ^32 , el tamaño máximo de un unsigned long ( del 0 al 4294967295)
int sensibilidad = 20; // sensibilidad para el contador de vueltas. A menor número, más sensible
int sensibilidad2 = 80; // sensibilidad para el marcha/paro. A menor número, más sensible
int marcha = 0; // el estado del botón marcha/paro
int delay_anti_rebote = 80;
int vueltasHechas = 0;
int piloto = 4;
int luzFinalizado = 5;
int motor = 6;
int sensorContador = 2;
int marchaParo = 3;
int motor2 = 13;
int botonSubirVueltas = A0;
int botonBajarVueltas = A1;
int pote = A2;
int valorpote;
int pwm1;
int pwm2;
void setup()
{
attachInterrupt(0, contar, FALLING); // IRQ 0 = pin 2 , saltará a la función " contar " , cuando la señal " caiga " ( pase de 1 a 0 ). Lo he puesto así para que hubiese un poco más de variedad :P
attachInterrupt(1, encender_apagar, RISING); // IRQ 1 = pin3, saltará a la función " encender_apagar" cuando la señal " suba " ( pase de 0 a 1 )
pinMode( sensorContador,INPUT); // IRQ 0
pinMode( marchaParo,INPUT); // IRQ 1
pinMode(motor,OUTPUT);
pinMode(motor2,OUTPUT);
pinMode(luzFinalizado,OUTPUT); // cuando llegue a las vueltas indicadas, se pondrá a parpadear
lcd.begin(16,2);
Serial.begin(9600);
}
void loop()
{
lcd.setCursor(0,0);
lcd.print("A hacer: ");
lcd.setCursor(0,1);
lcd.print(" Hechas: ");
lcd.setCursor(10,0);
lcd.print(vueltas_a_hacer);
lcd.setCursor(10,1);
lcd.print(contadorVueltas);
int sensor_subir_vueltas = digitalRead(botonSubirVueltas);
int sensor_bajar_vueltas = digitalRead(botonBajarVueltas);
if(sensor_subir_vueltas == 1) // incrementamos vueltas
{
delay(delay_anti_rebote); // anti-rebote
int sensor_subir_vueltas = digitalRead(botonSubirVueltas);
if(sensor_subir_vueltas == 1)
{
vueltas_a_hacer++;
}
}
if(sensor_bajar_vueltas == 1 && (vueltas_a_hacer > contadorVueltas)) // decrementamos vueltas
{
delay(delay_anti_rebote);
int sensor_bajar_vueltas = digitalRead(botonBajarVueltas);
if(sensor_bajar_vueltas == 1 && (vueltas_a_hacer > contadorVueltas ) && (vueltas_a_hacer > 1))
{
vueltas_a_hacer--;
lcd.setCursor(10,0);
lcd.print(" ");
}
}
if(vueltas_a_hacer == contadorVueltas && marcha == 1) // hacemos el efecto de aviso
{
vueltasHechas= 1; // ya se han hecho todas las vueltas
digitalWrite(motor,LOW); // paramos el motor
digitalWrite(luzFinalizado,HIGH);
delay(400);
digitalWrite(luzFinalizado,LOW);
delay(400);
}
else if(vueltas_a_hacer != contadorVueltas) // limpiamos la variable que avisa que se han hecho las vueltas en caso de que no se hagan, así podremos incrementar el sistema y seguir usándola
{
vueltasHechas = 0;
}
if(contadorVueltas >= numeroMaximoVueltas)
{
Serial.println("Desbordamiento");
}
if(variable < sensibilidad) // sistema anti-rebote para interrupción del contador de vueltas ( así no hace falta tiempo )
{
variable++;
}
if(variable2 < sensibilidad2) // sisema anti-rebote para la interrupción de marcha/paro
{
variable2++;
valorpote=analogRead(pote);
pwm1 = map(valorpote, 0, 1023, 0, 255);
pwm2 = map(valorpote, 0, 1023, 255, 0);
analogWrite(motor,pwm1);
analogWrite(motor2,pwm2);
}
}
//************************************************************************* ISR ***************************************************************************************************************************
void contar() // esta es la función a la que saltará nuestro Arduino cuando se active la interrupción en el pin 2 de nuestro Arduino
{
if((variable >= sensibilidad) && (contadorVueltas < numeroMaximoVueltas) && marcha == 1 && vueltasHechas == 0)
{
contadorVueltas++;
variable = 0;
}
}
void encender_apagar() // esta es la función a la que saltará nuestro Arduino cuando se active la interrupción en el pin 3 de nuestro Arduino
{
if(variable2 >= sensibilidad2)
{
if(marcha == 1)
{
marcha = 0;
digitalWrite(motor,LOW);
}
else if(marcha == 0)
{
marcha = 1;
digitalWrite(motor,HIGH);
}
variable2 = 0;
}
}