Go Down

Topic: Problema con el bucle "for" (Read 320 times) previous topic - next topic

tinofigueiras

Utilicé el bucle "for" para repetir unas instrucciones. Cuando tengo conectado por USB el PC y la placa, funciona, pero cuando lo desconecto el bucle no para. El número de veces que quiero que se repita tampoco logro que funcione correctamente.
Le he dado muchas vueltas y no lo consigo.
El programa es este:


int pulsador1=2; // asigna el pin 2 para el pulsador1
int pulsador2=3; // asigna el pin 3 para el pulsador2
int rele1=4; // asigna el pin 4 para el relé1
int rele2=5; // asigna el pin 5 para el relé2
int rele3=6; // asigna el pin 5 para el relé3
int p1=0; // variable para el estado de pulsador1
int p2=0; // variable para el estado de pulsador2
int entradas=0; // variable para el estado de las entradas

void setup () {
pinMode (rele1, OUTPUT); // declara el rele1 como salida
pinMode (rele2, OUTPUT); // declara el rele2 como salida
pinMode (rele3, OUTPUT); // declara el rele3 como salida
pinMode(pulsador1, INPUT); // declara el pulsadir1 como entrada
pinMode(pulsador2, INPUT); // declara el pulsadir2 como entrada
}

void loop () {
p1=digitalRead (pulsador1); // lee valor de la entrada
p2=digitalRead (pulsador2); // lee valor de la entrada
if (p1==1 || p2==1) { // si están activos p1 o p2
entradas=1;} // activa la variable
for(int i=0; i<10000; i=i+100) // crea un bucle de 10 ciclos
{
if(entradas==1){
digitalWrite (rele1, LOW); // desactiva el relé1
digitalWrite (rele2, LOW); // desactiva el relé2
digitalWrite (rele3, LOW); // desactiva el relé3
delay(180); //esperamos 0.18 segundos
digitalWrite (rele2, HIGH); // activa el relé2
digitalWrite (rele3, HIGH); // activa el rele3
delay(250); //esperamos 0.25 segundos
}
if(entradas==0) {
digitalWrite (rele1, HIGH); // activa el relé1
digitalWrite (rele2, HIGH); // activa el relé2
digitalWrite (rele3, HIGH); // activa el relé3
}
break;
}
}

Jopapa

En primer lugar decirte que leer tu código supone un gran esfuerzo porque no esta identado (sangrado).
Mira identación en la Wikipedia.

En tu código creo que la sentencia 
if(entradas==1){

debes estar ANTES del bucle For y conteniendolo a él

Jopapa
www.jopapa.me

max_saeta

#2
Aug 09, 2014, 02:08 pm Last Edit: Aug 09, 2014, 02:12 pm by max_saeta Reason: 1
Saludos.
Soy nuevo por aquí, así que reviso códigos para poder aprender mas.

Viendo el tuyo pensé que podría escribirse mejor de esta manera, revisalo  y comenta, aunque el problema es que no hay nada que cambien la condición de entradas a "0" nuevamente. Asi que las coloque que cuando cualquiera de las entradas se coloque a cero se desactiva el bucle.

Code: [Select]
int pulsador1=2; // asigna el pin 2 para el pulsador1
int pulsador2=3; // asigna el pin 3 para el pulsador2
int rele1=4; // asigna el pin 4 para el relé1
int rele2=5; // asigna el pin 5 para el relé2
int rele3=6; // asigna el pin 5 para el relé3
int p1=0; // variable para el estado de pulsador1
int p2=0; // variable para el estado de pulsador2
int entradas=0; // variable para el estado de las entradas

void setup () {
 pinMode (rele1, OUTPUT); // declara el rele1 como salida
 pinMode (rele2, OUTPUT); // declara el rele2 como salida
 pinMode (rele3, OUTPUT); // declara el rele3 como salida
 pinMode(pulsador1, INPUT); // declara el pulsadir1 como entrada
 pinMode(pulsador2, INPUT); // declara el pulsadir2 como entrada
}

void loop () {
 switch (entradas){
   case 0:
     digitalWrite (rele1, HIGH); // activa el relé1
     digitalWrite (rele2, HIGH); // activa el relé2
     digitalWrite (rele3, HIGH); // activa el relé3
     if (digitalRead (pulsador1)==1 || digitalRead (pulsador2)==1) { // si están activos p1 o p2
       entradas=1;
     }
   break;
   case 1:
     digitalWrite (rele1, LOW); // desactiva el relé1
     digitalWrite (rele2, LOW); // desactiva el relé2
     digitalWrite (rele3, LOW); // desactiva el relé3
     delay(180); //esperamos 0.18 segundos
     digitalWrite (rele2, HIGH); // activa el relé2
     digitalWrite (rele3, HIGH); // activa el rele3
     delay(250); //esperamos 0.25 segundos
      if (digitalRead (pulsador1)==0 || digitalRead (pulsador2)==0) { // si están activos p1 o p2
        entradas=0;
      }
   break;
 }
}

tinofigueiras

Hola Jopapa.
Gracias por contestar y por la paciencia.
Disculpa por lo de la indentación, vengo de la electrónica y los autómatas, y en varios manuales que he leido de Arduino no lo mencionaban. ¿Algo Así?:


int pulsador1=2; // asigna el pin 2 para el pulsador1
int pulsador2=3; // asigna el pin 3 para el pulsador2
int rele1=4; // asigna el pin 4 para el relé1
int rele2=5; // asigna el pin 5 para el relé2
int rele3=6; // asigna el pin 5 para el relé3
int p1=0; // variable para el estado de pulsador1
int p2=0; // variable para el estado de pulsador2
int entradas=0; // variable para el estado de las entradas

void setup () {
  pinMode (rele1, OUTPUT); // declara el rele1 como salida
  pinMode (rele2, OUTPUT); // declara el rele2 como salida
  pinMode (rele3, OUTPUT); // declara el rele3 como salida
  pinMode(pulsador1, INPUT); // declara el pulsadir1 como entrada
  pinMode(pulsador2, INPUT); // declara el pulsadir2 como entrada
}

void loop () {
  p1=digitalRead (pulsador1); // lee valor de la entrada
  p2=digitalRead (pulsador2); // lee valor de la entrada
    if (p1==1 || p2==1) { // si están activos p1 o p2
    entradas=1;} // activa la variable
  for(int i=0; i<10000; i=i+100) { // crea un bucle de 10 ciclos
    if(entradas==1){
      digitalWrite (rele1, LOW); // desactiva el relé1
      digitalWrite (rele2, LOW); // desactiva el relé2
      digitalWrite (rele3, LOW); // desactiva el relé3
      delay(180); //esperamos 0.18 segundos
      digitalWrite (rele2, HIGH); // activa el relé2
      digitalWrite (rele3, HIGH); // activa el rele3
      delay(250); //esperamos 0.25 segundos
      }
    if(entradas==0) {
      digitalWrite (rele1, HIGH); // activa el relé1
      digitalWrite (rele2, HIGH); // activa el relé2
      digitalWrite (rele3, HIGH); // activa el relé3
      }
    break;
  }
}

He hecho el cambio que sugerías, pero sigue igual.

tinofigueiras

Hola Max.
Gracias por tu respuesta.
Con esos cambios no funciona, hay que mantener presionados los pulsadores para que se ejecuten las instrucciones.

Jopapa

Aparte la programación, hay otros factores que es dificil analizar desde aquí.
¿has puesto las resistencias PullDown en los botones?
¿Bajan los reles el voltaje a niveles de hacer inestable el Arduino?
etc

Jopapa
www.jopapa.me

P.D. Siempre, siempre, siempre usar el SerialPrint(variable) para depurar el programa viendo las varibles en cada momento.

tinofigueiras

Si que uso las resistencias PullDown en las entradas.

tinofigueiras

Ya está funcionando:


int pulsador1=2; // asigna el pin 2 para el pulsador1
int pulsador2=3; // asigna el pin 3 para el pulsador2
int rele1=4; // asigna el pin 4 para el relé1
int rele2=5; // asigna el pin 5 para el relé2
int rele3=6; // asigna el pin 5 para el relé3
int p1=0; // variable para el estado de pulsador1
int p2=0; // variable para el estado de pulsador2
int inicio=0; // variable para el inicio del programa

void setup () {
  pinMode (rele1, OUTPUT); // declara el rele1 como salida
  pinMode (rele2, OUTPUT); // declara el rele2 como salida
  pinMode (rele3, OUTPUT); // declara el rele3 como salida
  pinMode(pulsador1, INPUT); // declara el pulsadir1 como entrada
  pinMode(pulsador2, INPUT); // declara el pulsadir2 como entrada
}

void loop () {
  p1=digitalRead (pulsador1); // lee valor de la entrada
  p2=digitalRead (pulsador2); // lee valor de la entrada
  for(int i=0; i<20; i=i+1) { // crea un bucle de 20 ciclos
  if (p1==1 || p2==1) { // si están activos p1 o p2
    inicio=1;} // activa la variable para el inicio del programa
  if(inicio==1){
    digitalWrite (rele1, LOW); // desactiva el relé1
    digitalWrite (rele2, LOW); // desactiva el relé2
    digitalWrite (rele3, LOW); // desactiva el relé3
    delay(180); //esperamos 0.18 segundos
    digitalWrite (rele2, HIGH); // activa el relé2
    digitalWrite (rele3, HIGH); // activa el rele3
    delay(250); //esperamos 0.25 segundos
    }
  if(inicio==0) {
    digitalWrite (rele1, HIGH); // activa el relé1
    digitalWrite (rele2, HIGH); // activa el relé2
    digitalWrite (rele3, HIGH); // activa el relé3
    }
  if (i==10);
    inicio=0;
    }
}     

Go Up