Hola!
estoy intentando desarrollar un proyecto y la verdad que por poco que avanzo tengo bastantes imprevistos....
La idea es crear subrutinas void para que me haga una serie secuencia dependiendo de la subrutina creada y llamarla desde el puerto serie, esto lo he conseguido, el problema es que no se como pararla, o simplemente llamando a otra de paro por ejemplo ya me serviría? me refiero como en los PLC que llamas a una subrutina y después la dejas de llamar.
la otra duda es que cuando estoy dentro de una subrutina necesito arrancar una salida y a los 30 segundos arrancar otra y lo mismo para pararla cuando deje de llamar a esa subrutina.
la función Millis para el envio por el puerto serie me funciona lo que he visto que me da problemas en activar al mismo tiempo en subrutinas distintas....
os pongo el programa para que podáis entenderlo mejor:
La función temp122() se arranca nada mas empezar el programa y es para enviar por el puerto serie las temperaturas, la idea es enviar sondas de temperatura y verlas por el PC pero como no las tengo el hw lo simulo con esa función o con valores fijos o con valores alternos.
// Declaración de constantes, salidas digitales:
int Com507DO = 8;
int Fan507DO = 10;
int SVCond = 48;
int SVDefr = 9;
// Declaración de constantes, comunicación Arduino-PC:
char FRIO_START; // Variable del SCADA
char VAC_START; // Variable del SCADA
char PARAR_OFF; // Variable del SCADA
int estado;
String comando;
char caracter;
// delay para envio de temp.
unsigned long previousMillis = 0;
const long interval = 50; // Intervalo de envio milisegundos
const long interval1 = 5000; // Intervalo de envio milisegundos
String envia="";
void setup(){
// Declaracion de salidas digitales
pinMode(Com507DO, OUTPUT);
pinMode (SVCond, OUTPUT);
pinMode (SVDefr, OUTPUT);
Serial.begin(9600); // Velocidad de comunicación.
}
void vacio122(){ // Subrutinao 1
digitalWrite(SVDefr, HIGH); Serial.println("D30");
}
void parar122(){ // Subrutina para parar todo
digitalWrite(Com507DO, LOW); Serial.println("D23");
digitalWrite(SVDefr, LOW); Serial.println("D31");
}
void congelacion122() { // Subrutina 2
unsigned long currentMillis = millis();
digitalWrite(Com507DO, HIGH); Serial.println("D22");
if (Com507DO == HIGH); digitalWrite (Fan507DO, HIGH); Serial.println("D32");
if (Com507DO == HIGH); {
if (currentMillis - previousMillis >= interval1)
{previousMillis = currentMillis;
digitalWrite (SVCond, HIGH); Serial.println ("D28");}
}
}
void temp122(){ // Subrutina para la lectura de las entradas analogicas
unsigned long currentMillis = millis();
for (int j = 0; j < 360; j++)
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the L
previousMillis = currentMillis;
// Serial.print("T");
//Serial.println (sin(j*(PI/180)));
//Serial.print("V");
//Serial.println (sin(j*(PI/100)));
//Serial.print ("T");
//Serial.println("40");
//Serial.print ("V");
//Serial.println("100");
}
}
void loop(){
while (Serial.available()>0){
caracter = Serial.read();
comando.concat(caracter);
delay(2);
}
// Marcha de las subrutinas
if (comando.equals ("FRIO_START") == true) {congelacion122();}
if (comando.equals ("VAC_START") == true) {vacio122();}
if (comando.equals ("PARAR_OFF") == true) {parar122();}
comando="";
temp122();
}