Pages: [1]   Go Down
Author Topic: Problema con el bucle "for"  (Read 275 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;
}
}
Logged

Alicante (España)
Offline Offline
Sr. Member
****
Karma: 13
Posts: 252
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Maracaibo
Offline Offline
Full Member
***
Karma: 7
Posts: 172
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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;
  }
}
« Last Edit: August 09, 2014, 07:12:01 am by max_saeta » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Alicante (España)
Offline Offline
Sr. Member
****
Karma: 13
Posts: 252
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si que uso las resistencias PullDown en las entradas.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;
    }
}       
Logged

Pages: [1]   Go Up
Jump to: