Buenas, como va? Mi problema es el siguiente:
Mientras se ejecuta la funcion ejecutarSecuenciaReles(), si inicio el modo de control desde el cliente remoto (es para testear cada electrovalvula) y luego ejecuto el comando "continuar riego" deberia volver a la ejecucion del loop principal, pero el problema es que inicia donde la funcion fue interrumpida y yo necesito que reinicie desde el paso 0. IntentΓ© cambiar el valor de la variable "static unsigned long tiempoInicioPaso = 0;" pero no tuvo efecto.
#include <ESP8266WiFi.h>
int contactor = 5;
int sensor_d = 16;
int sensor_a = A0;
int led = 15;
int bomba_p = 2;
int trafo = 14;
int valvL = 12;
int valvC = 13;
int valvR = 0;
//Ajuste de Reles
const int RON = 0;
const int ROFF = 1;
unsigned long secuenciaStartTime = 0;
unsigned long delayTime = 0;
int estadoSecuencia = 0;
const int grupoValv[] = {0, 12, 13, 14};
const int numValves = 3;
int valvePins[numValves] = {12, 13, 0};
int activeValve = -1;
bool modoTesteo = false;
bool salida = false;
const char *ssid = "ESP8266";
const char *password = "juan1234";
WiFiServer server(80);
WiFiClient client;
String command = "";
String message;
unsigned long tiempoInicioLED = 0;
bool estadoLED = LOW;
unsigned long tiempoInicio;
unsigned long tiempoActual;
unsigned long tiempoCliente;
static int paso = 0;
static unsigned long tiempoInicioPaso = 0;
void setup() {
Serial.begin(115200);
pinMode(trafo, OUTPUT);
pinMode(valvL, OUTPUT);
pinMode(valvC, OUTPUT);
pinMode(valvR, OUTPUT);
pinMode(contactor, OUTPUT);
pinMode(sensor_d, OUTPUT);
pinMode(led, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(trafo, ROFF);
digitalWrite(valvL, ROFF);
digitalWrite(valvC, ROFF);
digitalWrite(valvR, ROFF);
digitalWrite(contactor, LOW);
digitalWrite(led, HIGH);
digitalWrite(LED_BUILTIN, LOW);
for (int i = 0; i < 5; i++) {
digitalWrite(led, HIGH);
delay(250);
digitalWrite(led, LOW);
delay(1000);
}
digitalWrite(led, HIGH);
for (int i = 0; i < numValves; i++) {
pinMode(valvePins[i], OUTPUT);
digitalWrite(valvePins[i], ROFF);
}
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
delay(4000);
Serial.print("IP Address: ");
Serial.println(IP);
server.begin();
delay(10000);
Serial.println("Esperando instrucciones...");
tiempoInicio = millis();
tiempoCliente = millis();
while (millis() - tiempoInicio < 10000) {
if (Serial.available() > 0) {
String mensaje = Serial.readStringUntil('\n');
if (mensaje.equals("inicio testeo")) {
ejecutarModoTesteo();
break;
}
}
}
}
void loop() {
if (!client.connected()) {
client = server.available();
}
if (client.connected() && client.available() > 0) {
String command = client.readStringUntil('\n');
command.trim();
message = "Comando Recibido: " + String(command);
print(message);
if (command.equals("Control")) {
interacc_client();
goto salida1;
}
}
while (Serial.available() > 0) {
String input = Serial.readStringUntil('\n');
if (input.equals("inicio testeo")) {
modoTesteo = true;
ejecutarModoTesteo();
}
}
salida1:
if (salida == true){
static int paso = 0;
static int tiempoInicioPaso = 0;
const unsigned long tiemposEspera[] = {1000, 500, 5000, 2000, 5000, 2000, 5000, 1000};
unsigned long tiempoActual = millis();
message = "Variables reestablecidas";
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
ejecutarSecuenciaReles();
}
}
void interacc_client(){
message = "-------------->CONTROL<-------------";
print(message);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
message = "inicio testeo";
print(message);
message = "continuar riego";
print(message);
digitalWrite(contactor, LOW);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
desact_grupo();
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
while (client.connected()) {
if (client.available()) {
String command = client.readStringUntil('\n');
command.trim();
message = "Comando Recibido: " + String(command);
print(message);
if (command.equals("inicio testeo")) {
ejecutarModoTesteo();
return;
}
if (command.equals("continuar riego")) {
salida = true;
delay(10);
modoTesteo = false;
return;
}
else {
client.println("Comando Desconocido");
}
if (salida == true){
static int paso = 0;
static int tiempoInicioPaso = 0;
tiempoInicio = millis();
while (millis() - tiempoInicio < 100) {}
message = "Yendo a Salida2";
print(message);
goto salida2;
}
salida2:
return;
}
}
}
void ejecutarModoTesteo() {
message = "--------------Test Mode-------------";
print(message);
modoTesteo = true;
digitalWrite(contactor, LOW);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
desact_grupo();
digitalWrite(trafo, RON);
message = "VΓ‘lvula L = 1";
print(message);
tiempoInicio = millis();
while (millis() - tiempoInicio < 100) {}
message = "VΓ‘lvula C = 2";
print(message);
tiempoInicio = millis();
while (millis() - tiempoInicio < 100) {}
message = "VΓ‘lvula R = 3";
print(message);
tiempoInicio = millis();
while (millis() - tiempoInicio < 100) {}
unsigned long tiempoInicioLED = millis();
bool estadoLED = LOW;
while (modoTesteo) {
tiempoActual = millis();
while (millis() - tiempoInicio < 100) {}
if (tiempoActual - tiempoInicioLED >= 500) {
estadoLED = !estadoLED;
digitalWrite(15, estadoLED);
tiempoInicioLED = tiempoActual;
}
tiempoActual = millis();
while (millis() - tiempoInicio < 100) {}
if (client.available()) {
String valveNumberStr = client.readStringUntil('\n');
int valveNumber = valveNumberStr.toInt();
valveNumberStr.trim();
if (valveNumberStr.equals("Continuar Riego")) {
modoTesteo = false;
salida = true;
message = "------------Fin Test Mode------------";
print(message);
return;
}
if (valveNumber >= 1 && valveNumber <= numValves) {
digitalWrite(trafo, RON);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
message = "->VΓ‘lvula " + String(valveNumber) + " ON<-";
print(message);
activateValve(valveNumber);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
digitalWrite(contactor, HIGH);
}
if (valveNumberStr.equals("fin testeo")) {
secuencia_FnTst();
break;
}
}
if (Serial.available() > 0) {
String valveNumberStr = Serial.readStringUntil('\n');
int valveNumber = valveNumberStr.toInt();
if (valveNumber >= 1 && valveNumber <= numValves) {
digitalWrite(trafo, RON);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {} // Esperar 500 milisegundos
activateValve(valveNumber);
message = "->VΓ‘lvula " + String(valveNumber) + " ON<-";
print(message);
digitalWrite(contactor, HIGH);
}
if (valveNumberStr.equals("fin testeo")) {
secuencia_FnTst();
break;
}
}
}
}
void secuencia_FnTst() {
message = "Apagando Bombas...";
print(message);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
digitalWrite(contactor, LOW);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
message = "Apagando Electrovalvulas...";
print(message);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
desact_grupo();
message = "Aguarde 10s para reiniciar...";
print(message);
tiempoInicio = millis();
while (millis() - tiempoInicio < 500) {}
message = "------------Fin Test Mode------------";
print(message);
delay(10000);
modoTesteo = false;
ESP.restart();
}
void config_grupo() {
for (int i = 0; i < sizeof(grupoValv) / sizeof(grupoValv[0]); i++) {
pinMode(grupoValv[i], OUTPUT);
}
}
void activar_grupo() {
for (int i = 0; i < sizeof(grupoValv) / sizeof(grupoValv[0]); i++) {
digitalWrite(grupoValv[i], RON);
}
}
void desact_grupo() {
for (int i = 0; i < sizeof(grupoValv) / sizeof(grupoValv[0]); i++) {
digitalWrite(grupoValv[i], ROFF);
}
}
void ejecutarSecuenciaReles() {
static unsigned long tiempoInicioPaso = 0;
const unsigned long tiemposEspera[] = {1000, 500, 5000, 2000, 5000, 2000, 5000, 1000};
unsigned long tiempoActual = millis();
if (tiempoActual < tiempoInicioPaso) {
paso = 0;
}
if (tiempoActual - tiempoInicioPaso >= tiemposEspera[paso]) {
switch (paso) {
case 0:
message = "-----------Iniciando Riego----------";
print(message);
desact_grupo();
digitalWrite(trafo, RON);
break;
case 1:
digitalWrite(valvL, RON);
digitalWrite(contactor, HIGH);
message = "->Trafo ON // VΓ‘lv. L ON // Bombas ON<-";
print(message);
break;
case 2:
message = "->VΓ‘lv. C ON<-";
print(message);
digitalWrite(valvC, RON);
break;
case 3:
digitalWrite(valvL, ROFF);
break;
case 4:
message = "->VΓ‘lv. R ON<-";
print(message);
digitalWrite(valvR, RON);
break;
case 5:
digitalWrite(valvC, ROFF);
break;
case 6:
message = "->Bombas OFF<-";
print(message);
digitalWrite(contactor, LOW);
break;
case 7:
desact_grupo();
message = "-----------Riego Finalizado---------";
print(message);
digitalWrite(led, LOW);
break;
}
paso++;
tiempoInicioPaso = tiempoActual;
if (paso > 7) {
paso = 0;
}
}
}
void print(String message) {
Serial.println(message);
client.println(message);
delay(10);
message = "";
}
void activateValve(int valveNumber) {
if (valveNumber != activeValve) {
if (activeValve != -1) {
digitalWrite(valvePins[valveNumber - 1], RON);
message = "Cambiando VΓ‘lv.";
print(message);
client.println("Aqui");
tiempoInicio = millis();
while (millis() - tiempoInicio < 1000) {}
digitalWrite(valvePins[activeValve - 1], ROFF);
message = "->VΓ‘lv. " + String(activeValve) + " OFF<-";
print(message);
tiempoInicio = millis();
while (millis() - tiempoInicio < 1000) {}
}
digitalWrite(valvePins[valveNumber - 1], RON);
activeValve = valveNumber;
}
}