This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Subrutinas
#1
Buenas, soy Oscar un estudiante de telecomunicaciones, tengo una duda acerca de las subrutinas

Tengo este primer codigo, que hace funcionar un motor para una puerta con dos finales de carrera, mandando la señal de abrir desde un infrarrojos

#include <IRremote.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

int M1 = 8; //Encoje
int M2 = 9; //Estira
int FCA = 10; //Final de carrera abierto
int FCC = 11; //Final de carrera cerrado
int S1 = 12; //Sensor de barrera
int ReceptorIR = 5;
IRrecv irrecv (ReceptorIR);
decode_results Valor;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}

void loop() {
  if(irrecv.decode(&Valor)){ // es para averiguar el valor del botón 1 y 2
    Serial.print("0x");
    Serial.println(Valor.value, HEX);  // Mostrar en el monitor
    switch(Valor.value){
      case 0x86C68877:        // boton 1
        FCA = digitalRead(10);
        while(FCA==1){    // Mientras el Final de carrera de abierto no este activado, la puerta se abrira
        FCA = digitalRead(10);
        digitalWrite(8, HIGH);  // Abrir la puerta
        }
        digitalWrite(8, LOW);
        delay(5000);
        FCC = digitalRead(11);
        S1 = digitalRead(12);
        while(FCC==1){    // Mientras el Final de carrera de cerrado no este activado o el sensor de barrera se activa, la puerta se cerrara
        FCC = digitalRead(11);
        digitalWrite(9, HIGH);  // Cerrar la puerta
        }
        digitalWrite(9, LOW);
        digitalWrite(8, LOW);
        break;
    }
    delay(50);
    irrecv.resume();
  }
}



Al intentar englobarlo en subrutinas el codigo anterior, y añadirle un sensor de barrera, no consigo hacer que la subrutina de "cerrar" entre en funcionamiento.

#include <IRremote.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

int FCA_V, FCC_V, S1_V;
const int M1 = 8; //Encoje
const int M2 = 9; //Estira
const int FCA = 10; //Final de carrera abierto
const int FCC = 11; //Final de carrera cerrado
const int S1 = 12; //Sensor de barrera
const int ReceptorIR = 5;
IRrecv irrecv (ReceptorIR);
decode_results Valor;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
}
void parar (){
digitalWrite(M2, LOW);
digitalWrite(M1, LOW); 
}
void abrir (){
digitalWrite(M1, HIGH);  // Abrir la puerta
digitalWrite(M2, LOW);
}
void cerrar (){
digitalWrite(M2, HIGH);  // Cerrar la puerta
digitalWrite(M1, LOW);  // Cerrar la puerta
S1_V = digitalRead(S1);
FCC_V = digitalRead(FCC);
  if(S1_V = HIGH){
  parar();
  delay(2000);
    while(FCA_V==1){    // Mientras el Final de carrera de abierto no este activado, la puerta se abrira
    FCA_V = digitalRead(FCA);
    abrir();
    delay(5000);
    } 
  }           
}
void loop() {
  if(irrecv.decode(&Valor)){ // es para averiguar el valor del botón 1 y 2
    Serial.print("0x");
    Serial.println(Valor.value, HEX);  // Mostrar en el monitor
    switch(Valor.value){
      case 0x86C68877:        // boton 1
        FCA_V = digitalRead(FCA);
        while(FCA_V==1){    // Mientras el Final de carrera de abierto no este activado, la puerta se abrira
        FCA_V = digitalRead(FCA);
        abrir();
        }
        digitalWrite(M1, LOW);
        delay(5000);
        FCC_V = digitalRead(FCC);
        S1_V = digitalRead(S1);
        while(FCC_V==1){    // Mientras el Final de carrera de cerrado no este activado o el sensor de barrera se activa, la puerta se cerrara
        FCC_V = digitalRead(FCC);
        cerrar();
        }
        parar();
        break;
    }
    delay(50);
    irrecv.resume();
  }
}

¿Alguien me podria echar una mano porfavor? Llevo ya un par de dias mirando y nada
  Responder
#2
Buenas tardes.

Leyendo tus códigos y jugando a encontrar las diferencias

En el primer código declaras los pines de Arduino como salidas, líneas 16 y 17

Sin embargo en el segundo código, no declaras los pines de Arduino como salida, si no una variable creada por ti como salida, líneas 17 y 18 (posible primer error)

En el segundo código, haces el
void setup()
{
}

después haces / escribes, unos void que el programa no entiende, porque no están en su sitio

void parar()
void abrir()
void cerrar()

y luego haces el void loop()
{
}

Segundo posible error.

Prueba a hacerlo como requieren las reglas de escritura del código según el Ide Arduino y a ver que pasa.

https://forum.arduino.cc/t/unir-dos-codi...ido/401225
  Responder
#3
Has entendido lo que te quiero decir, no quiero escribir tu código, si no que aprendas como se hace.

lo primero que se define en el código Arduino, son las librerías que necesita el programa para ejecutarse correctamente, se crean las variables, y se generan los sensores que se van a utilizar, con sus respectivos pines a los que están conectados.

Después se escribe el void setup()

que son las ordenes principales que va a realizar el programa, y que solo se ejecuta una vez, independientemente de lo que pase después.

Y luego se escribe el void loop()

Que es la parte del programa que se ejecuta constantemente, una y otra vez, mientras el Arduino tenga corriente y que si le afecta lo que ocurra durante la ejecución de esta parte del programa, y dependiendo de lo que pase, por ejemplo la lectura de los sensores, se realiza una orden u otra.

Si no se siguen estas reglas básicas de como escribir el programa, tanto el IDE como el Arduino, se lían y no hacen lo que tu quieres, si no lo que tu has escrito en el programa, que muchas veces no es coherente para el lenguaje de programación y por eso Arduino no hace lo que tu quieres que haga.

Cuando se copia un programa que ha hecho otra persona, y no sabes lo que esta haciendo, ni el por que se hacen las cosas así, ocurren este tipo de errores.

No he montado el proyecto, y no sé si funcionará, pero el código debe escribirse así, cópialo al IDE de Arduino y cuéntame que ocurre.

Un saludo.


Archivos adjuntos
.txt   13_oskkar998_cerrar.txt (Tamaño: 1.96 KB / Descargas: 11)
  Responder
#4
Es muy largo, pero te vendrá bien leerlo, o por lo menos saber donde esta para hacer consultas.

https://www.learncpp.com/

http://www.cplusplus.com/doc/tutorial/

Un saludo.
  Responder
#5
¡Hola, Óscar! Veamos cómo puedes solucionar los problemas con tu código. Hay varios detalles que se pueden ajustar para que las subrutinas funcionen correctamente y para asegurar que el código se ejecute como esperas.
Problemas Identificados y Soluciones:

  1. Uso Incorrecto de la Comparación en
    cerrar()
    :
    • En la subrutina
      cerrar()
      , tienes
      if(S1_V = HIGH)
      en lugar de
      if(S1_V == HIGH)
      . El primer caso es una asignación, no una comparación. Debe ser
      ==
      para comparar el valor de
      S1_V
      con
      HIGH
      .
  2. Lectura de Pines en
    cerrar()
    :
    • Estás leyendo los valores de los pines
      S1
      ,
      FCC
      , y
      FCA
      pero sólo en
      cerrar()
      estás haciendo una lectura de estos pines sin actualizar el valor dentro del
      while
      . Esto puede causar problemas si el valor del pin cambia y no se actualiza correctamente.
  3. Orden de Ejecución:
    • Asegúrate de que las subrutinas se llaman en el orden correcto y que las condiciones dentro de los
      while
      se actualizan correctamente.
  4. Lógica de Control:
    • En la función
      cerrar()
      , la lógica debe asegurarse de que el motor no se detenga hasta que se cumpla la condición de que la puerta esté completamente cerrada.
Código Corregido:

Aquí tienes el código corregido con estos ajustes:


#include <IRremote.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

const int M1 = 8; // Motor abre
const int M2 = 9; // Motor cierra
const int FCA = 10; // Final de carrera abierto
const int FCC = 11; // Final de carrera cerrado
const int S1 = 12; // Sensor de barrera
const int ReceptorIR = 5;

IRrecv irrecv(ReceptorIR);
decode_results Valor;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
  pinMode(FCA, INPUT);
  pinMode(FCC, INPUT);
  pinMode(S1, INPUT);
}

void parar() {
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
}

void abrir() {
  digitalWrite(M1, HIGH);  // Abrir la puerta
  digitalWrite(M2, LOW);
}

void cerrar() {
  digitalWrite(M1, LOW);  // Asegurarse de que M1 está apagado
  digitalWrite(M2, HIGH);  // Cerrar la puerta

  while (digitalRead(FCC) == HIGH && digitalRead(S1) == LOW) { // Mientras el Final de carrera de cerrado no esté activado y el sensor de barrera no esté activado
    // Continuar cerrando la puerta
    digitalWrite(M2, HIGH);
    delay(100); // Pequeño retraso para evitar un bucle muy rápido
  }

  parar(); // Detener el motor cuando se cumpla la condición
}

void loop() {
  if (irrecv.decode(&Valor)) { // es para averiguar el valor del botón 1 y 2
    Serial.print("0x");
    Serial.println(Valor.value, HEX);  // Mostrar en el monitor

    switch (Valor.value) {
      case 0x86C68877:        // botón 1
        while (digitalRead(FCA) == HIGH) {    // Mientras el Final de carrera de abierto no esté activado
          abrir();
          delay(100); // Pequeño retraso para evitar un bucle muy rápido
        }
        parar();
        delay(5000);

        while (digitalRead(FCC) == HIGH || digitalRead(S1) == LOW) {    // Mientras el Final de carrera de cerrado no esté activado o el sensor de barrera no esté activado
          cerrar();
          delay(100); // Pequeño retraso para evitar un bucle muy rápido
        }
        parar();
        break;
    }

    delay(50);
    irrecv.resume();
  }
}

Cambios Realizados:
  1. Corrección de Comparación en
    cerrar()
    :
    • Cambiado
      if(S1_V = HIGH)
      a
      if(S1_V == HIGH)
      .
  2. Ajuste en Subrutinas:
    • Asegúrate de que los pines se configuren correctamente como entradas o salidas en el
      setup()
      .
    • Añadido un pequeño retraso dentro de los bucles
      while
      para evitar bucles muy rápidos que pueden causar problemas.
  3. Lógica de Control:
    • La lógica se ha ajustado para asegurar que el motor no se detenga hasta que se cumplan las condiciones adecuadas.

Con estos ajustes, tu código debería funcionar correctamente. Si encuentras más problemas o necesitas más ayuda, no dudes en preguntar. ¡Buena suerte con tu proyecto!
  Responder