Go Down

Topic: Mejora de Programa sin usar delay(); (Read 666 times) previous topic - next topic

AdanAlegria

Sep 20, 2016, 11:10 pm Last Edit: Sep 27, 2016, 03:08 pm by AdanAlegria

tengo un proyecto el cual tengo que mejorar necesito hacer el cambio de giro con un motor y prender algunos leds con las señales de 3 sensores de presencia. El problema con esto es que necesito dejarlos encendidos por un tiempo y decidí hacerlos con el tan odiado delay ();

El problema es que ocupo que los sensores detecten en todo momento y realicen su tarea... pero con el delay(); se queda inactivo y hasta que no pasa el tiempo por mas que yo active algun otro sensor este no hara nada.

Code: [Select]

int i;
void setup()
    {
      pinMode(4,INPUT);   //abrir.
      pinMode(5,INPUT);   //cerrar.
      pinMode(6,INPUT);   //sensor de chapa.
      pinMode(7,INPUT);  //puerta abierta.
      pinMode(8,OUTPUT);  //abrir.
      pinMode(9,OUTPUT);  //cerrar.
      pinMode(10,OUTPUT); //chapa cerrada.

    }

void loop()
    {
     int Abrir  =digitalRead(4); //Estado de Sensor para ABRIR puerta
     int Cerrar =digitalRead(5); //Estado de Sensor para CERRAR puerta
     int Enclave=digitalRead(6); //Estado de Sensor de CHAPA ELECTRICA
     int Puerta =digitalRead(7); //Estado de Sensor de puerta abierta
/*Recuerda que agregaste la condicional puerta en los 3 ciclos*/
    
//////////////////////// Abrir puerta por fuera /////////////////////////
        if ((Abrir==HIGH) && (Enclave==LOW) && (Puerta == HIGH))
        {
                  digitalWrite(8,HIGH);
                  delay(100);
                  digitalWrite(8,LOW);                              
         }
/////////////////////// Cerrar puerta por dentro ////////////////////////
          if ((Cerrar==HIGH) && (Enclave==LOW))
        {

                  digitalWrite(9,HIGH);
                  delay(1100);
                  digitalWrite(10,HIGH);
                  digitalWrite(9,LOW);
        }          
//////////////////////// Abrir puerta por dentro ////////////////////////
          if ((Cerrar==HIGH && Enclave==HIGH) && (Puerta == HIGH))
        {
                  delay(10);
                  digitalWrite(10,LOW);
                  delay(300);          
                  digitalWrite(8,HIGH);
                  delay(1000);
                  digitalWrite(8,LOW);

        }
  
    }

surbyte

Bien como pusiste el código usando tags pero mal tu título, de hecho pésimo.
Edita ese título y ponle algo acorde con tu consulta pero AYUDA y por FAVOR retiralos del mismo


Lee las normas del foro


Busca respuestas mías donde modfifico programas usando millis() muy parecidos al tuyo.
La verdad no tengo tiempo para buscarlo
Debes crear una máquina de estados simple.

AdanAlegria

que le parece ahora surbyte?

por cierto gracias por el dato, en la brevedad lo buscare

marvicdigital

Hola a todos...
No soy un experto aún pero lo que te sugiero es que uses el timer en este video puedes ver como lo implementa y como lo usa:

Reloj con arduino

Saludos

AdanAlegria

Hola a todos...
No soy un experto aún pero lo que te sugiero es que uses el timer en este video puedes ver como lo implementa y como lo usa:

Reloj con arduino

Saludos
Muchas gracias por el aporte, ya estoy analizando el vídeo...

surbyte

#5
Oct 18, 2016, 08:33 pm Last Edit: Oct 18, 2016, 09:39 pm by surbyte
Dame un momento y te doy un empujón con tu programa. Ahora que has corregido lo que te pedí me da gusto ayudarte.
Code: [Select]
int i;
bool Abrir, Cerrar, Enclave, Puerta;
bool estado1 = false;
bool estado2 = false;
byte estado3 = 0; // ojo que uso otro tipo de variable


void setup()     {
  pinMode(4,INPUT);   //abrir.
  pinMode(5,INPUT);   //cerrar.
  pinMode(6,INPUT);   //sensor de chapa.
  pinMode(7,INPUT);  //puerta abierta.
  pinMode(8,OUTPUT);  //abrir.
  pinMode(9,OUTPUT);  //cerrar.
  pinMode(10,OUTPUT); //chapa cerrada.

}

void loop()     {
    Abrir  = digitalRead(4); //Estado de Sensor para ABRIR puerta
    Cerrar = digitalRead(5); //Estado de Sensor para CERRAR puerta
    Enclave= digitalRead(6); //Estado de Sensor de CHAPA ELECTRICA
    Puerta = digitalRead(7); //Estado de Sensor de puerta abierta
   
    //////////////////////// Abrir puerta por fuera /////////////////////////
   
    if (Abrir && !EnclaveOW && Puerta && !estado1) {
        digitalWrite(8,HIGH);
        start = millis();
        estado1 = true;
    }   
    if (estado1 && millis()-start > 100UL) {
        digitalWrite(8,LOW);                               
        estado1 = 0;
    }
     
    /////////////////////// Cerrar puerta por dentro ////////////////////////
    if (Cerrar && !Enclave && !estado2) {
        digitalWrite(9,HIGH);
        start = millis();
        estado2 = true;
    }   
    if (estado2 && millis()-start > 1100UL) {
        digitalWrite(10, HIGH);                               
        digitalWrite(9,LOW);
        estado2 = false;
    }

    //////////////////////// Abrir puerta por dentro ////////////////////////
    if (Cerrar && Enclave && Puerta && estado3 == 0)    {
        delay(10);
        digitalWrite(10,LOW);
        start = millis();
        estado3 = 1;
    }

    if (estado3 == 1 && millis()-start > 300UL) {
        digitalWrite(8,HIGH);
        estado3 = 2;
    }
    if (estado3 == 2 && millis()-start > 10000UL) {
        digitalWrite(8,LOW);
        estado3 = 0;
    }
}

Go Up