Go Down

Topic: Como juntar dos sketchs (Read 213 times) previous topic - next topic

Ramon_PT

Sep 10, 2019, 03:14 pm Last Edit: Sep 12, 2019, 03:43 pm by surbyte Reason: Agregado de etiqueta para códigos/errores
Hola soy nuevo en este mundillo que me encanta.
Después de haber hecho varios proyectos con éxito, este se me ha atravesado.

Resulta que hice en el portal de mi garaje una aplicacion para abrir y cerrar el portal desde mi android. Este el el sketch:

Code: [Select]
int rele =12;

char valor; // variable para indicar que llega una orden

void setup() {
pinMode(rele, OUTPUT);

Serial.begin(9600);

}

void loop() {
 if (Serial.available()) //si el puerto seria(blutooth) esta disponible
 {
  valor = Serial.read();  //lee el dato entrante via bluetooth
  if (valor =='A')  //si el dato que llega es una A
  {
   digitalWrite(rele,HIGH);  // ENCIENDE EL RELE
   delay(500);
   digitalWrite(rele,LOW);
  }
   if (valor =='B')  //si el dato que llega es una A
  {
   digitalWrite(rele,LOW);  // APAGA EL RELE
 
 
  }
 }
}




Hasta aquí todo bien, pero ahora quiero hacer que pulsando un pulsador, me encienda una luz durante X tiempo y luego que se apague sola. Esto también lo hice y este es el sketch:

Code: [Select]
int PULSADOR = 5;
int rele2 = 11;
int salidapositivo =13;

void setup() {
 pinMode(PULSADOR , INPUT);
 pinMode(rele2, OUTPUT);
 digitalWrite(rele2,LOW);
  pinMode(salidapositivo,OUTPUT);
   digitalWrite(salidapositivo,HIGH);

}

void loop() {
 while(digitalRead(PULSADOR) == LOW);
 digitalWrite(rele2, HIGH);
 delay(10000);   //    TIEMPO QUE TARDA EN APAGARSE
 digitalWrite(rele2, LOW);
 while(digitalRead(PULSADOR) == HIGH);

}



Lo que no doy conseguido es juntar los dos sketch en uno solo, es decir, hacer que los dos corran en el mismo arduino uno.
¿ Es posible ?
Alguien me puede hacer el sketch?
Muchas gracias de antemano.


surbyte

#1
Sep 10, 2019, 04:23 pm Last Edit: Sep 10, 2019, 04:24 pm by surbyte
Lee las normas del foro y edita tu hilo

1. Primero quitando todos los griots. Mayúsculas son gritos en este o cualquier foro. El título también va con minúsculas.
2. Los códigos van con etiquetas, no como texto plano.

Kike_GL

#2
Sep 11, 2019, 06:59 pm Last Edit: Sep 11, 2019, 07:00 pm by Kike_GL
Claro solo debes juntar los códigos cada uno en su lugar teniendo en cuenta que solo debe haber un setup() y un solo loop(), algo asi:

Code: [Select]

int rele = 12;
char valor;                      //variable para indicar que llega una orden
int PULSADOR = 5;
int rele2 = 11;
int salidapositivo =13;

void setup(){
   ...
   ...
}

void loop(){
   ...
   ...
}


PD: Tampoco debe haber nombres de variables o pines repetidos entre los dos proyectos.
Saludos, Kike_GL

Ramon_PT

Hola de nuevo, esto fue lo que hice, pero solo me funciona el pulsador,
lo del movil no:
Code: [Select]


int rele =12;
int PULSADOR = 5;
int rele2 = 11;


char valor; // variable para indicar que llega una orden



void setup() {
 pinMode(rele, OUTPUT);
 pinMode(PULSADOR , INPUT);
  pinMode(rele2, OUTPUT);
  digitalWrite(rele2,LOW);
  digitalWrite(rele,LOW);
 

 Serial.begin(9600);
}

void loop()
{
 while(digitalRead(PULSADOR) == LOW);
  digitalWrite(rele2, HIGH);
  delay(1000);
  digitalWrite(rele2, LOW);
  while(digitalRead(PULSADOR) == HIGH);
 
   if (Serial.available()) //si el puerto seria(blutooth) esta disponible
{
     

valor = Serial.read();  //lee el dato entrante via bluetooth
   if (valor =='A')  //si el dato que llega es una A
   {
    digitalWrite(rele,HIGH);  // ENCIENDE EL RELE
    delay(500);
    digitalWrite(rele,LOW);
   }
    if (valor =='B')  //si el dato que llega es una B
   {
    digitalWrite(rele,LOW);  // APAGA EL RELE
    {
 
    }
   }
  }
}


Que es lo que esta mal?
gracias de nuevo.

RIG

Hola
En realidad no tienes un problema...
Tienes 2.  El uso de while() y el uso de delay() que basicamente también es un while()
En esta parte haces un bucle y no sales de ahi
Code: [Select]
while(digitalRead(PULSADOR) == LOW);
  digitalWrite(rele2, HIGH);
  delay(1000);
  digitalWrite(rele2, LOW);
  while(digitalRead(PULSADOR) == HIGH);

Analiza bien lo que escribiste: básicamente dice mientras el pulsador esta en bajo enciende el relay, espera un segundo sin hacer nada y vuelve a apagar el rele2 y cuando el pulsador esté en alto no hagas nada. Por lo que nunca saldrás de ese bucle y todo lo que esté debajo de ese código nunca se ejecutará.
Y en cuanto a los delay()  debes olvidarte de ellos,  si quieres que tu código funcione tienes que usar millis(), en la sección se Documentacion encontrarás información sobre ello

Kike_GL

#5
Sep 13, 2019, 05:46 pm Last Edit: Sep 13, 2019, 05:58 pm by Kike_GL
Acostumbrate a usar siempre las llaves en lugar correcto:

Code: [Select]

if (condicion){
   .....;
}
while (condicion){
   .....;
}


El otro problema es el pulsador produce rebotes. Supongo que el pulsador de pin 5 esta con una resistencia en pullup de 10k verdad ? Si no es asi usa.

Code: [Select]

pinMode(PULSADOR, INPUT_PULLUP);


Prueba este codigo:
Code: [Select]

const byte PULSADOR = 5;
const byte rele = 12;
const byte rele2 = 11;
char valor;                // variable para indicar que llega una orden
bool actual,anterior;

void setup() {
   Serial.begin(9600);
   pinMode(PULSADOR, INPUT_PULLUP);
   pinMode(rele, OUTPUT);
   pinMode(rele2, OUTPUT);
   digitalWrite(rele, LOW);
   digitalWrite(rele2, LOW);
}

void loop(){
   actual = digitalRead(PULSADOR);
   if (!actual && anterior){
      digitalWrite(rele2, HIGH);
      delay(1000);
      digitalWrite(rele2, LOW);
   }
   anterior = actual;
   //si el puerto serie (blutooth) recibe algun dato
   if (Serial.available()){
      valor = Serial.read();         //lee el dato entrante via bluetooth
      //si el dato que llega es una A
      if (valor == 'A'){
         digitalWrite(rele, HIGH);   //ENCIENDE EL RELE
         delay(500);
         digitalWrite(rele, LOW);    //APAGA EL RELE
      }
      //si el dato que llega es una B
      if (valor == 'B'){
         digitalWrite(rele, LOW);    //APAGA EL RELE
      }
   }
}
Saludos, Kike_GL

Ramon_PT

Hola,
Muchas gracias KIKE la verdad que me funcionó a la primera.
Gracias de nuevo y un saludo.

Go Up