Hi, im some days doing a proyect of a auto door, but i having some problems with that.
Im using:
Dual-H L298N for up and down door.
x2 Adjustable IR Reflection Sensor, detect person down of door, and too use for auto open door.
x2 Micro Limit Switch, up and down.
The program detects motion up the door, after a while if it does not detect anything under proceeds to lower it, if at the time it detects something is dropping down, up and back down past the time.
The problem that I have, that makes me whole cycle well, but when the door to stay down low, instead of stopping, automatically rises, and when it comes up ignores the upper limit. Here I put the program to see if anyone could help me, thanks.
#include <WProgram.h>
#include <NECIRrcv.h>
#include <SoftwareSerial.h>
#define motor_arriba 7
#define motor_abajo 6
#define IR_obstaculo_1 12
#define IR_obstaculo_2 11
#define FC_arriba 10
#define FC_abajo 9
#define IR_mando 8
#define led_manual 5
#define pulsa_auto_man 4
#define pulsa_s_b 3
#define tiempo_arriba 5000 //time door up
#define tiempo_ir 2000 //timer door up extra when detect some down
int modo = 0; //mode 0 - auto, mode 1 - mode manual.
NECIRrcv ir(IR_mando);
long boton1 = 4278254850; //Botton auto/manual
long boton2 = 4228119555; //Botton up door
long boton3 = 4244831235; //Botton down door
void setup() {
pinMode(IR_obstaculo_1, INPUT);
pinMode(IR_obstaculo_2, INPUT);
pinMode(FC_arriba, INPUT);
pinMode(FC_abajo, INPUT);
pinMode(pulsa_auto_man, INPUT);
pinMode(pulsa_s_b, INPUT);
//Declaramos las salidas
pinMode(motor_arriba, OUTPUT);
pinMode(motor_abajo, OUTPUT);
pinMode(led_manual, OUTPUT);
Serial.begin(9600);
ir.begin();
Serial.println("Iniciando puerto serie") ;
}
void loop(){
unsigned long ircode;
while (ir.available())
{
ircode = ir.read();
if ( ircode == boton1 )
{
auto_on_off();
}
//UP
if (modo == 1)
{
if ( ircode == boton2 && digitalRead(FC_abajo)==HIGH && digitalRead(FC_arriba)==LOW && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==LOW ) //MANDAMOS LA ORDEN DE SUBIR LA PUERTA
{
subidamanual:
Serial.println("Mode auto: Go up") ;
motoressubiendo();
}
//Start go down
if ( ircode == boton3 && digitalRead(FC_abajo)==LOW && digitalRead(FC_arriba)==HIGH && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==LOW && digitalRead(IR_obstaculo_1)==HIGH && digitalRead(IR_obstaculo_2)==HIGH )
{
motoresbajando();
}
}
/////////////////////////////////
}//END-WHILE
if (modo == 0)
{
if ( digitalRead(IR_obstaculo_2)==LOW || digitalRead(IR_obstaculo_1)==LOW )
{
Serial.println("DETECT") ;
if ( digitalRead(FC_abajo)==HIGH && digitalRead(FC_arriba)==LOW && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==LOW && digitalRead(IR_obstaculo_2)==LOW || digitalRead(IR_obstaculo_1)==LOW )
{
subida:
Serial.println("Mode auto.. Starting") ;
motoressubiendo();
delay(5);
}
}//ENDBOTON
}//END-MODO
if (modo == 1)
{
//STOP UP
if ( digitalRead(FC_abajo)==LOW && digitalRead(FC_arriba)==HIGH && digitalRead(motor_arriba)==HIGH && digitalRead(motor_abajo)==LOW )
{
Serial.println("Mode auto: Door up, stop motor..") ;
pararmotores(); //activamos la parada
}
//DOOR DOWN STOP
if ( digitalRead(FC_abajo)==HIGH && digitalRead(FC_arriba)==LOW && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==HIGH )
{
pararmotores();
}
//GOING DOWN, AND DETECT SOME
if ( digitalRead(FC_abajo)==LOW && digitalRead(FC_arriba)==LOW && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==HIGH )
{
if ( digitalRead(IR_obstaculo_1)==LOW || digitalRead(IR_obstaculo_2)==LOW ) //GOING DOWN, AND DETECT SOME
{
pararmotores();
goto subidamanual;
}
}
}
if (modo == 0)
{
if ( digitalRead(FC_abajo)==LOW && digitalRead(FC_arriba)==HIGH && digitalRead(motor_arriba)==HIGH && digitalRead(motor_abajo)==LOW ) //Door up
{
Serial.println("Mode auto.. Door up, stop motor..") ;
pararmotores(); //Stop motor
Serial.println("Mode auto.. Waiting") ;
delay(tiempo_arriba);
irdetectado:
Serial.println("Mode auto.. Waiting timer") ;
delay(tiempo_ir);
if ( digitalRead(FC_abajo)==LOW && digitalRead(FC_arriba)==HIGH && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==LOW && digitalRead(IR_obstaculo_1)==HIGH && digitalRead(IR_obstaculo_2)==HIGH)
{
motoresbajando(); //Start down motor
}
else
{
Serial.println("Mode auto... Some down of door") ;
goto irdetectado; //
}
}
//Going down and detect some
if ( digitalRead(FC_abajo)==LOW && digitalRead(FC_arriba)==LOW && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==HIGH )
{
if ( digitalRead(IR_obstaculo_1)==LOW && digitalRead(IR_obstaculo_2)==LOW)
{
Serial.println("Mode auto... || IR object") ;
pararmotores();
goto subida;
}
}
//
if ( digitalRead(FC_abajo)==HIGH && digitalRead(FC_arriba)==LOW && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==HIGH ) //Door down
{
pararmotores();
}
}
//Pulsador AUTO/MAN
if ( digitalRead(pulsa_auto_man)==HIGH ) //Change to mode auto or manual
{
delay(500);
auto_on_off();
}
if ( modo == 1 && digitalRead(pulsa_s_b)==HIGH && digitalRead(FC_abajo)==HIGH && digitalRead(FC_arriba)==LOW && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==LOW ) //MANDAMOS LA ORDEN DE SUBIR LA PUERTA
{
motoressubiendo();
}
if ( modo == 1 && digitalRead(pulsa_s_b)==HIGH && digitalRead(FC_abajo)==LOW && digitalRead(FC_arriba)==HIGH && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==LOW && digitalRead(IR_obstaculo_1)==HIGH && digitalRead(IR_obstaculo_2)==HIGH )
{
motoresbajando();
}
}//END-LOOP
//FUNCIONES
void pararmotores()
{
digitalWrite(motor_abajo, LOW);
digitalWrite(motor_arriba, LOW);
}
void motoressubiendo()
{
digitalWrite(motor_abajo, LOW);
delay(1);
digitalWrite(motor_arriba, HIGH);
}
void motoresbajando()
{
digitalWrite(motor_arriba, LOW);
delay(1);
digitalWrite(motor_abajo, HIGH);
}
void auto_on_off()
{
if ( digitalRead(FC_abajo)==HIGH && digitalRead(FC_arriba)==LOW && digitalRead(motor_arriba)==LOW && digitalRead(motor_abajo)==LOW )
{
if (modo == 0)
{
modo = 1;
digitalWrite(led_manual, HIGH);
}
else
{
modo = 0;
digitalWrite(led_manual, LOW);
}
}
else
{
Serial.println("Door need be down for change mode") ;
}
}
Thanks again.