/* Este programa solo emite una señal de salida siempre y cuando se cumpla:
La presencia y el pison hallan sido activados mas de 2 segundos, ademas
de estar posteriormente los dos desactivados
*/
//presencia
int presencia_1 = 2; // sensor de presencia a la entrada 2
int salida_presencia_1 = 3; // salida de sensor presencia a led
int estado_presencia_1; // variable de la presencia
int variable_control_1 = 0; // Al principio no ha sido activado.
int variable_encendido_1 = 0; // Al principio no ha sido encendido.
long iniciopr1, finalpr1, actualpr1; // variables para temporizador
//pison
int pison = 4; // sensor de cierre a la entrada 2
int salida_pison = 5; // salida de sensor cierre a led
int estado_pison; // variable de la cierre
int variable_control_2 = 0; // Al principio no ha sido activado.
int variable_encendido_2 = 0; // Al principio no ha sido encendido.
long iniciopi1, finalpi1, actualpi1; // variables para temporizador
//gps
int salida_gps = 7; // asigno salida 7 hacia el guarda
int variable_gps = 0; // cambiará cuando la presencia y el pison esten en 1
int estado_anterior_variable_gps = LOW; // variable utilizo para comparativa
int contador = 0; // contador de envios a gps
void setup() {
Serial.begin(9600); // inicializo puerto serie
//presencia
pinMode(presencia_1, INPUT); // El presencia_1 será entrada de sensor.
pinMode(salida_presencia_1, OUTPUT); // El salida_presencia_1 será salida hacia LED
//pison
pinMode(pison, INPUT); // El pison será entrada pulsador.
pinMode(salida_pison, OUTPUT); // El salida_pison será salida led.
//gps
pinMode(salida_gps, OUTPUT); // El salida_gps será salida hacia gps
}
void loop() {
// tratado de la presencia//
estado_presencia_1 = digitalRead(presencia_1); // asigna el estado de la presencia a la variable
if (estado_presencia_1 == HIGH && variable_control_1 == 0) // compara si esta en 1 y la variable control sigue a 0
{
variable_control_1 = 1; // asigna 1 a la variable
iniciopr1 = millis(); // asigna tiempo a la variable
finalpr1 = iniciopr1 + 2000;} // Tiempo finalpr1 es iniciopr1 más 2 segundos.
actualpr1 = millis(); // Consulta el tiempo actualpr1.
if (variable_control_1 == 1 && (actualpr1 > finalpr1) ) {enciende_salida_presencia_1();} // compara la v. control y han pasado 2 segundos activa salida gps
if (variable_encendido_1 == 1 && (estado_presencia_1 == LOW) ) {apaga_salida_presencia_1();} // compara la v. control este a 1 y la presencia desactivada desactiva salida gps
//Tratado del pison//
estado_pison = digitalRead(pison); // asigna el estado del sensor a la variable
if (estado_pison == HIGH && variable_control_2 == 0) { // compara si esta en 1 y la variable control sigue a 0
variable_control_2 = 1; // asigna 1 a la variable
iniciopi1 = millis(); // asigna tiempo a la variable
finalpi1 = iniciopi1 + 2000;} // Tiempo finalpi1 es iniciopi1 más 2 segundos.
actualpi1 = millis(); // Consulta el tiempo actualpi1.
if (variable_control_2 == 1 && (actualpi1 > finalpi1) ) {enciende_salida_pison();} // compara la v. control y han pasado 2 segundos activa salida led
if (variable_encendido_2 == 1 && (estado_pison == LOW) ) {apaga_salida_pison();} // compara la v. control este a 1 y la presencia desactivada desactiva salida led
//Tratado de la salida gps
variable_gps = (variable_encendido_1 == 1 && variable_encendido_2 == 1); // la variable_gps se pondrá a 1 cuando estén las entradas a 1
if (variable_gps == 1) {estado_anterior_variable_gps = HIGH;} // asigna un 1 a la variable estado_anterior_variable_gps cuando la variable_gps este a 1
if ( estado_presencia_1 == LOW & estado_pison == LOW & estado_anterior_variable_gps == HIGH ) // activa salida si se cumplen las 3 condiciones y si no deja apagada la salida gps
{salida_gps1();} else {digitalWrite(salida_gps, LOW);} //
}
// Subrutina variable_encendido_1.
void enciende_salida_presencia_1(){
digitalWrite(salida_presencia_1, HIGH);
variable_encendido_1 = 1;}
// Subrutina apagado de presencia.
void apaga_salida_presencia_1(){
digitalWrite(salida_presencia_1, LOW);
variable_encendido_1 = 0;
variable_control_1 = 0;}
// Subrutina variable_encendido_2.
void enciende_salida_pison(){
digitalWrite(salida_pison, HIGH);
variable_encendido_2 = 1;}
// Subrutina apagado de pison.
void apaga_salida_pison(){
digitalWrite(salida_pison, LOW);
variable_encendido_2 = 0;
variable_control_2 = 0;}
// Subrutina salida gps.
void salida_gps1(){
digitalWrite(salida_gps, HIGH);
if (digitalRead(salida_gps) == HIGH){ // comprueba que la salida este en alto
contador++; // aumenta 1 si salida en alto
Serial.println(contador); } // muestra el número de envios
delay(100); // para poder ver el encendido
estado_anterior_variable_gps = LOW; // mando estado_anterior_variable_gps a bajo
}