Bueno ahora toma mas color el contexto de lo que quieres hacer. Asi debiste comenzar.
Ahora me comprendes no?
Bueno ahora tengo mas comprensión de lo que quieres hacer.
Esto
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;
}
Debería estar en una interrupción. Detectar cruce por cero ocurre cada 10 mseg... no es algo para seguirlo en un loop aunque tal vez te funcione. no lo se.
Yo lo pondria todo en la 2da interrupción disponible. Si usas la INT0 te queda la INT1 para un UNO. El Mega tiene mas INTs.
Por lo visto taco usa la interrupción 1. Asi que te queda la otra.
Bien considéralo!!
Solo respondo a tu problema de cambio de giro.
Prueba a ver si esto funciona mejor. He hecho leves modificaciones.
#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;
bool b = false;
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) {
lcd.setCursor(0, 0);
lcd.print(a);
lcd.print(b);
if (!b) { ///////Condición para giro a izquierdas/////////)
digitalWrite(rele1, LOW);
digitalWrite(rele2, HIGH);
}
else { ////////Condición para giro a derechas/////////////////
digitalWrite(rele1, HIGH);
digitalWrite(rele2, LOW);
}
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; // no hagas tantas cuentas 60/600 = 1/10
rpm1 = pul/10;
pul = 0;
pul2 = 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 = !b;
delay(5500);
a = 1;
}
}
}
void senal(){
pul++
}