1.- El objetivo de esa interrupción es para el cálculo de las revoluciones por minuto del motor pero me ha faltado copiarlo en el mensaje de antes.
2.- a es para salir del while y b es para cambiar de estado de un relé o del otro para poder cambiar de sentido del motor.
3.- Cómo tengo usado todas las interrupciones, pues pensé que la mejor manera de detectar el flanco de bajada para el paso por 0.
4.- Los delays grandes son usados para que pare el motor totalmente y repose unos segundos la ropa para el nuevo giro y el delay(100) es usado para darle un tiempo de seguridad a los relés para evitar arcos eléctricos en ellos a la hora de dejar de mandar impulsos al triac.
El resultado de resta sirve para la rampa de aceleración del motor de la lavadora, ya que no pueden arrancar de golpe sino que tienen que hacerlo progresivamente.
Tiempo y tiempo2 sirven para el cálculo de RPM y que lo muestre por el LCD, pero no afecta para el funcionamiento de la lavadora por el momento.
Tiempo3 es la duración de cada ciclo de giro.
La detección de paso por cero se hace a través de un optoacoplador 4n25 por el D4 y la señal de para el triac desde el D5.
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);
#define val1 12
#define val2 11
#define rele2 7
#define rele1 6
#define bomba 9
#define bloqueo 12
#define taco 1
int pul = 0;
long int pul2 = 0;
int sen = 0;
int tiem = 0;
unsigned long start = 0;
unsigned long resta = 0;
int regulacion = 200;
unsigned tiempo2 = 0;
unsigned int inicio, inicio2 = 0;
unsigned int tiempo, tiempo3 = 0;
long int rpm1 = 0;
long int rpm2 = 0;
int valor;
byte a, c = 0;
byte b = 0;
byte d = 0;
int EstadoActual = 0;
int EstadoAnterior = 0;
int x = 0;
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(rele1, OUTPUT);
digitalWrite(rele1, 0);
pinMode(rele2, OUTPUT);
digitalWrite(rele2, 0);
pinMode(5, OUTPUT);
pinMode(4, INPUT_PULLUP);
pinMode(val1, OUTPUT);
digitalWrite(val1, LOW);
pinMode(val2, OUTPUT);
digitalWrite(val2, LOW);
pinMode(bomba, OUTPUT);
digitalWrite(bomba, 0);
pinMode(bloqueo, OUTPUT);
digitalWrite(bloqueo, 1);
attachInterrupt(taco, senal, FALLING);
//pinMode(3, INPUT);
// Serial.begin(250000);
lcd.setCursor(4, 0);
lcd.print("INICIO");
a = 1;
}
void loop() {
int n = (45 * regulacion);////Entero para el cálculo de disparo del triac/////////////////////////////
if (b == 2) { /////Si b es igual a 2, puesta a 0 de nuevo//////////
b = 0;
}
if (a == 1 && b == 0) { ///////Condición para giro a izquierdas/////////
lcd.setCursor(0, 0);
lcd.print(a);
lcd.print(b);
digitalWrite(rele1, LOW);
digitalWrite(rele2, HIGH);
delay(4000);
start = millis();
tiem = millis();
inicio = millis();
inicio2 = millis();
a = 2;
}
if (a == 1 && b == 1) { ////////Condición para giro a derechas/////////////////
lcd.setCursor(0, 0);
lcd.print(a);
lcd.print(b);
digitalWrite(rele2, LOW);
digitalWrite(rele1, HIGH);
delay(4000);
start = millis();
tiem = millis();
inicio = millis();
inicio2 = millis();
a = 2;
}
while (a == 2) {////////
tiempo = millis() - inicio;
tiempo2 = millis() - tiem;
tiempo3 = millis() - inicio2;
EstadoActual = digitalRead(4); /////////////////////////Detección de paso por 0/////////////////////////////////////
if (EstadoActual == 0 & EstadoAnterior == 1) {
c = 1;
}
EstadoAnterior = EstadoActual;
if (c == 1) { ////////////////////////Si paso por 0 es 1, disparo triac///////////////////////////////////
delayMicroseconds(n);
digitalWrite(5, HIGH);
delayMicroseconds(10);
digitalWrite(5, LOW);
c = 0;
}
if (tiempo >= 1000) {//////////////////Cálculo RPM//////////////////////////////////////
rpm1 = (pul * 60) / 600;
pul = 0;
inicio = millis();
}
if (tiempo2 >= 1000) { ///////////Mostrar RPM en LCD
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(rpm1);
tiem = millis();
}
resta = millis() - start;
if (resta >= 20 && regulacion >= 113 && b == 0) {////////////////Arranque del motor////////////////////////////////
regulacion--;
n = (45 * regulacion);
start = millis();
}
if (tiempo3 >= 13000) { /////////Si tiempo3 llega a 13 segundos, para motor, desconecta los relés y aumenta b en uno más para el cambio de giro y sale del while///////
regulacion = 200;
delay(100);
lcd.setCursor(0, 0);
lcd.print("FIN");
digitalWrite(rele2, LOW);
digitalWrite(rele1, LOW);
b++;
delay(5500);
a = 1;
}
}
}
void senal(){
pul++
}
Esquema de funcionamiento.
La cosa es que cuando a==1 y b==0, lo hace todo bien pero luego cuando es a==1 y b==1 hace todo el ciclo pero no manda impulsos al triac, luego cuando vuelve a ser a==1 y b==0 si lo hace bien y en el siguiente nada.
Espero haberme explicado bien, gracias de antemano y saludos.
