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: 3)
  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