bueno este es el codigo completo
se trata de dos sensores y dos servos (un par para la entrada del estacionamiento y otro para la salida), en la entrada (1) cuando el servo se mueve (se abre la puerta) manda por serial "in" para que otra app haga sus cosas.
despues en la salida (2) pide un dato a la app por serial, el arduino lo lee y si esta bandera esta en 1 la puerta se abre, de lo contrario se mantiene cerrada, bueno se supone que sea asi
la cosa es que cuando el sensor detecta un auto y con la bandera en 0 pasa un tiempo despues de quitar el obstaculo y el servo hace el mismo movimiento que cuando arranca.
pero cuando la bandera esta en 1 y el sensor detecta algo se habre y cierra con normalidad
por eso pienso que resolviendo el problema de mantener cerrada la puerta desde cuando comienza solucionaria el de la salida
#include <Servo.h>
#include <pt.h>
int s1,s2;
int aux1,aux2;
int ang1=0,ang2=0;
const int PinSensor1 = 2, PinSensor2 = 4;
const int PinServo1 = 9, PinServo2 = 10;
Servo servo1;
Servo servo2;
struct pt in;
struct pt out;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
PT_INIT(&in);
PT_INIT(&out);
}
void loop() {
// put your main code here, to run repeatedly:
entrada(&in);
salida(&out);
}
void entrada(struct pt *pt){
PT_BEGIN(pt);
static long t=0;
//setup
pinMode(PinSensor1,INPUT);
servo1.attach(PinServo1);
//loop
do{
s1 = digitalRead(PinSensor1);
if(s1!=aux1){
if(s1==HIGH){
t=millis();
PT_WAIT_WHILE(pt, (millis()-t)<2000);
for(ang1=90;ang1>=0;ang1--){
servo1.write(ang1);
t=millis();
PT_WAIT_WHILE(pt, (millis()-t)<20);
}
}else{
Serial.println("in");
for(ang1=0;ang1<=90;ang1++){
servo1.write(ang1);
t=millis();
PT_WAIT_WHILE(pt, (millis()-t)<10);
}
}
aux1 = s1;
}
t=millis();
PT_WAIT_WHILE(pt, (millis()-t)<100);
}while(true);
PT_END(pt);
}
/*para la puerta de salida es necesario validar que el auto
ha pagado y que el sensor detecte un vehiculo*/
void salida(struct pt *pt){
PT_BEGIN(pt);
static long t=0;
static int pago=0;
//setup
pinMode(PinSensor2,INPUT);
servo2.attach(PinServo2);
//loop
do{
s2 = digitalRead(PinSensor2);
if(s2!=aux2){
if(s2==HIGH){
t=millis();
PT_WAIT_WHILE(pt, (millis()-t)<2000);
for(ang2=90;ang2>=0;ang2--){
servo2.write(ang2);
t=millis();
PT_WAIT_WHILE(pt, (millis()-t)<20);
}
}
//bandera que indica si el pago esta hecho
pago=readData();
if(s2==LOW&&pago==1){
Serial.println(" out");
for(ang2=0;ang2<=90;ang2++){
servo2.write(ang2);
t=millis();
PT_WAIT_WHILE(pt, (millis()-t)<10);
}
}
aux2 = s2;
}
t=millis();
PT_WAIT_WHILE(pt, (millis()-t)<100);
}while(true);
PT_END(pt);
}
int readData(){//lee un dato meidiante comunicacion serial
if (Serial.available()){
int data = Serial.read();
Serial.write(data);
if(data==49){
return 1;
}else{
return 0;
}
}
}