Buenas estimados!
Tengo un proyecto muy simple: una puerta para perro que abre con sensores desde dentro y desde fuera. Para esto tengo una placa UNO y dos sensores ultrasonicos HC-SR04. La idea es que cuando cualquiera de los dos sensores detectan al perro a menos de 40cm, activan un led verde y mueven un servomotor de 0º a 270º para abrir la puerta, esperan 10 segundos y luego mueven el servomotor de 270º a 0º para cerrar la puerta.
Para manejar ambos sensores uso la libreria Ultrasonic.h
Para mantener la puerta abierta 10 segundos uso Delay (10000)
Para que el programa sepa cuando abrir o cerrar uso la funcion "if/else"
El problema es que solo respeta los 10 segundos si el perro esta al menos 1-2 segundos en el scope del sensor. Si aparece en el sensor por menos que eso abre la puerta pero la cierra casi de inmediato. Es como si necesitara una confirmacion de un minimo de tiempo para ejecutar el programa.. Aca dejo el codigo por si alguno me puede ayudar a ver lo que no veo =(
Existe un minimo de tiempo de "trigger" para que se ejecute el codigo?
Sera una mala aplicacion del "if/else"?
#include <Ultrasonic.h>
#include <Servo.h>
Servo Servo_Puerta;
Ultrasonic ultrain(6, 7); //pin trig, pin echo
Ultrasonic ultraout(8, 9); //pin trig, pin echo
int led = 2; //pin del arduino que se conecta al led
int distanciain; // variable de distancia del ultrasonico interior
int distanciaout; // variable de distancia del ultrasonico exterior
void setup() {
pinMode(led, OUTPUT);
Servo_Puerta.attach(5);
Serial.begin(9600);
}
void loop() {
distanciain = ultrain.read(CM);
distanciaout = ultraout.read(CM);
if (distanciain < 40) { //distancia deteccion
digitalWrite(2, HIGH); //enciende led
Servo_Puerta.write(270); //abre puerta
delay(10000); //espera 10 segundos
digitalWrite(2, LOW); //apaga led
} else {
Servo_Puerta.write(0); //cierra la puerta
}
if (distanciaout < 40) {
digitalWrite(2, HIGH);
Servo_Puerta.write(270);
delay(10000);
digitalWrite(2, LOW);
} else {
Servo_Puerta.write(0);
}
}
Yo creo que lo encaras mal.
Si quieres usar sensores ultrasónicos bien, pero deberias usar 2 asegurándote que no interfieran. Para ello se canalizan en un tubo PVC.
Pones dos separados por una distancia en el que puedas establecer una situación como que viene el perro interrumpe el sensor 1 y luego lo hace con el 2.
De este modos sabes si viene o va.
Si viene de 1 a 2 abres la puerta.
La situación de cerrar podria repetirse porque atraviesa un S3 y S4 ingresando a determinado lugar.
Si luego quiere salir hara una secuencia S4 a S3 con lo que abres la puerta y cuando atraviese S2 primero y S1 al final la cierras.
Todo esto es similar si usas barreras IR.
Pero se supone que los sensores están separados por la puerta, uno adentro y otro afuera. Difícil que interfieran uno con otro.
Además si se dispara el de adentro el pichicho quiere salir y si dispara el de afuera, quiere entrar.
Yo no hablo de esos dos.
Hablo de 2 fuera y 2 dentro creando 2 barreras ultrasónicas o como sugerí dos barreras IR.
Una secuencia te dice entro y la otra te dice salgo.
No le pongo nada como delay(10000) que no me asegura que el perro entro o no porque detecto que ha hecho.
Primero le puse una puerta basculante que el pueda empujar, pero como es un perro minusculo le asusta que la puerta le pegue cuando vuelve. Por eso pense en hacer algo automatico y me meti en el mundo Arduino // HELP!!
Para mas contexto, compre la primera placa arduino y alimente el servo directo desde esa placa. El codigo funciono correctamente unos dias hasta que la placa se murio (lo se soy novato).
Esta placa es nueva, mismo codigo e instalacion salvo que el servo tiene su propia alimentacion 5V.
Yo solo quiero que el sensor de una medicion bajo 40cm, active el servo, mantenga la puerta abierta 10 segundos y luego la baje.
Uso delay justamente porque es como aguantar la respiracion mientras el perro pasa por la puerta y va a hacer sus cosas. Cuando vuelve ya han pasado mas de 10 segundos y puede volver a activar la puerta esta vez on el sensor exterior.
Mi objetivo es que siempre respete el delay(10000) sin importar si la medicion sel sensor dura 1milisegundo o 1 segundo..
Y claramente va a funcionar bien, pero ese no es el punto.
El punto es que si la puerta lo atrapa, vas a tener problemas, no porque lo atrape o lastime sino porque le va a generar temor.
De todos modos es mi mirada del tema.
Ejemplo. Mis perros son medianos
Al principio le puse un simple plástico para que se acostumbren. y les costó pero hay veces que el viento devuelve la puerta plastica y no sabés el susto que se pegan.
Si concuerdo 100%.. Hasta ahora cuando quiere salir espera que suba la puertita y se va de una a su arbol, luego de vuelta la puerta se vuelve a activar y el entra rapido.
Idealmente seria que si la puerta esta bajando y el sensor mide <40cm, el servo pare y vuelva a 270º de abierto, asi se evita un posible trauma...
Pero ese codigo ya se me va de las manos..
Que dicen ustedes, los sensores tendran un minimo de tiempo requerido de trigger? O deberia intentar con milis() en vez de delay()
Si señor.. a traves de una mini protoboard.
Tengo una fuente DC 5V conectada a esa miniboard y de ahi saco 5V tanto para el servo como para ambos sensores (los sensores no estan conectados al 5V y GND directamente a la placa)
GND de la miniboard si esta conectada a GND en la placa..