PROBLEMAS CON EL CICLO DEL PROGRAMA

Hola a todos, estoy realizando un proyecto en el cual pulsando tres botones mi programa debe de cambiar una rutina (tengo tres programadas) el problema que tengo es : 1.-Pulso un boton y solo me realiza una accion , lo que quiero esque se este repitiendo ,hasta que yo pulse otro boton (paro)

El programa debe hacer lo siguiente: LUBRICAR el operador puede escojer entre tres rutinas de lubricacion las cuales son boton 1: Lubricar todo el tiempo boton 2:Lubricar 5 segundos y esperar para lubricar 2 segundos y repetir la accion hasta que pulse el boton de paro boton 3:Lubricar 7 segundos y esperar para lubricar 2 segundos y repetir la accion hasta que pulse el boton de paro

espero me puedan apoyar!

const int ledPin3 =  8;      // the number of the LED pin
const int ledPin2 =  9;
const int ledPin1 =  10;
const int inputPin1 = A1; 
const int inputPin2 = A2; 
const int inputPin3 = A3; 
const int inputPin4 = A4; 
const int inputPin5 = A5; 

int ledState1 = LOW;             // ledState used to set the LED
int ledState2 = LOW; 
int ledState3 = LOW;
int p1 = LOW;
int p2 = LOW;
int p3 = LOW;
int p4 = LOW;
int p5 = LOW; 

long previousMillis2 = 0;        // will store last time LED was updated
long previousMillis3 = 0; 
long previousMillis4 = 0; 

long intervalOn2 = 5000;          
long intervalOff2 = 5000;        
long intervalOn3 = 3000;
long intervalOff3 = 5000; 
long intervalOn4 = 1000;
long intervalOff4 = 5000; 

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT); 
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
  pinMode(inputPin3, INPUT);
  pinMode(inputPin4, INPUT);
  pinMode(inputPin5, INPUT);     
}

void loop(){
  p1=digitalRead(inputPin1);
  p2=digitalRead(inputPin2);
  p3=digitalRead(inputPin3);
  p4=digitalRead(inputPin4);
  p5=digitalRead(inputPin5);
  
//BOTON 1__________________________________________________________

if (p1 == HIGH) {
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, LOW);
  }
//BOTON 2___________________________________________________________

if (p2 == HIGH) {
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin1, HIGH);
unsigned long currentMillis2 = millis(); 
  if (ledState2 == LOW) {
    if(currentMillis2 - previousMillis2 > intervalOff2) {
            previousMillis2 = currentMillis2;   
            ledState2 = HIGH;
    }
} else {
    if(currentMillis2 - previousMillis2 > intervalOn2) {
           previousMillis2 = currentMillis2;   
           ledState2 = LOW;
    }
}
digitalWrite(ledPin2, ledState2); 
}

//BOTON 3_______________________________________________________________

if (p3 == HIGH) {
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin1, HIGH);
unsigned long currentMillis3 = millis();
  if (ledState2 == LOW) {
    if(currentMillis3 - previousMillis3 > intervalOff3) {
            previousMillis3 = currentMillis3;   
            ledState2 = HIGH;
    }
} else {
    if(currentMillis3 - previousMillis3 > intervalOn3) {
           previousMillis3 = currentMillis3;   
           ledState2 = LOW;
    }
}
digitalWrite(ledPin2, ledState2);
}

//BOTON 4______________________________________________________________

if (p4 == HIGH) {
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin1, HIGH);
unsigned long currentMillis4 = millis();
  if (ledState2 == LOW) {
    if(currentMillis4 - previousMillis4 > intervalOff4) {
            previousMillis4 = currentMillis4;   
            ledState2 = HIGH;
    }
} else {
    if(currentMillis4 - previousMillis4 > intervalOn4) {
           previousMillis4 = currentMillis4;   
           ledState2 = LOW;
    }
}
digitalWrite(ledPin2, ledState2);
}

//BOTON 5_______________________________________________________________

if (p5 == HIGH) {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
  }
}

Oye, un poco más de paciencia por favor. Sabías que postear doble está prohibido?

Tu pregunta ahora no te la puedo responder como se debe; el código se ve muy grande para visualizarlo en un teléfono celular, y ahora no estoy en casa. Desde ya lo que puedo decir, es que quizá algo con la sentencia switch podría solucionar tu problema....

Perdon , ya lei las reglas y si cometi mucho errores la vdd que en otros foros no se suele responder en el mismo , se acostumbra a colocar nuevos para indicar cambios, agradeceria tu ayuda la verdad es que ya llevo una semana con este problema . gracias

alberto_horta_1989: Perdon , ya lei las reglas y si cometi mucho errores la vdd que en otros foros no se suele responder en el mismo , se acostumbra a colocar nuevos para indicar cambios, agradeceria tu ayuda la verdad es que ya llevo una semana con este problema . gracias

Te contesto aqui ,porque es donde mejor se explica que es lo que quieres del programa,aunque faltaria algun detalle para aclarar las cosas ,por ejemplo ,¿ese sketch solo va a realizar ese trabajo?.¿Cuando hablas de parar la lubricacion ,tiene que concluir el ciclo que esta haciendo ?

si asi es tengo 5 botones boton inico, boton paro, rutina 1, rutina 2 y rutina3 entonces preciono el boton de rutina 1 y debe ejecutar una rutina esta la debe de estar repitiendo hasta que pulse el boton de paro, el problema que tengo es que no me cicla

Bueno, ya estoy en casa así que aquí va una mejor respuesta:

Voy a explicar mejor por qué menciono al switch:

Resulta que tienes que cada ciclo se realice si cierta condición if se cumple. El resultado: tendría que mantener pulsado el botón para que la rutina se siga ejecutando. Ahora, con un switch la rutina seleccionada por el último botón se sigue ejecutado, aunque no se esté presionando nada. Esa es tu idea, lo sé.

Por fortuna, las modificaciones a realizar no son difíciles de hacer; y son las siguientes:

El principio del loop debe quedar así:

void loop() {
  p1 = digitalRead(inputPin1);
  p2 = digitalRead(inputPin2);
  p3 = digitalRead(inputPin3);
  p4 = digitalRead(inputPin4);
  p5 = digitalRead(inputPin5);
  
  // Parte de elegir
  if (p1) {opcion = 0; seleccionado = true;}
  if (p2 && !seleccionado) {opcion = 1; seleccionado = true;}
  if (p3 && !seleccionado) {opcion = 2; seleccionado = true;}
  if (p4 && !seleccionado) {opcion = 3; seleccionado = true;}
  if (p5 && !seleccionado) {opcion = 4;}
  seleccionado = false;

  // El resto queda igual... por ahora

Añade dos variables globales nuevas:

byte opcion = 5;
boolean seleccionado = false;

Arriba del comentario del botón 1, añade la siguiente línea:

switch (opcion) {

Reemplaza cada if de cada botón por un case con su respectivo valor (p1 lleva cero, p2 lleva 1; y así hasta p5 lleva 4); y al final de ese bloque if, la sentencia break. Ejemplo:

Antes:

if (p1 == HIGH) {
  // Lo que sea que haya adentro
}

Ahora:

case 0:
  // Lo que sea que haya adentro
break;

Recuerda que el bloque switch se debe cerrar con un '}'; de lo contrario, un error de compilación podría ocurrir (y es probable que diga otra cosa que no sea la falta de ese '}').

PD: avísame si lo lograste, porque siento como que quizá no me haya explicado "al 100%" ::)

Hola a todos! Lucario448 muchas gracia x por tu ayuda !!! el programa ya me esta trabajando como queria, solo tengo un pequeño problema, mi boton de paro solo me reacciona cuando lee la ultima linea del case , como puedo hacer para que en cualquier momento pueda parar el case ??? dejo mi codigo

byte opcion = 5;
boolean seleccionado = false;

const int ledPin3 =  8;      // the number of the LED pin
const int ledPin2 =  9;
const int ledPin1 =  10;
const int inputPin1 = A1; 
const int inputPin2 = A2; 
const int inputPin3 = A3; 
const int inputPin4 = A4; 
const int inputPin5 = A5; 

int ledState1 = LOW;             // ledState used to set the LED
int ledState2 = LOW; 
int ledState3 = LOW;
int p1 = LOW;
int p2 = LOW;
int p3 = LOW;
int p4 = LOW;
int p5 = LOW; 

long previousMillis2 = 0;        // will store last time LED was updated
long previousMillis3 = 0; 
long previousMillis4 = 0; 

long intervalOn2 = 5000;          
long intervalOff2 = 5000;        
long intervalOn3 = 3000;
long intervalOff3 = 5000; 
long intervalOn4 = 1000;
long intervalOff4 = 5000; 

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT); 
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
  pinMode(inputPin3, INPUT);
  pinMode(inputPin4, INPUT);
  pinMode(inputPin5, INPUT);     
}

void loop(){
  p1=digitalRead(inputPin1);
  p2=digitalRead(inputPin2);
  p3=digitalRead(inputPin3);
  p4=digitalRead(inputPin4);
  p5=digitalRead(inputPin5);

  if (p1) {opcion = 0; seleccionado = true;}
  if (p2 && !seleccionado) {opcion = 1; seleccionado = true;}
  if (p3 && !seleccionado) {opcion = 2; seleccionado = true;}
  if (p4 && !seleccionado) {opcion = 3; seleccionado = true;}
  if (p5 && !seleccionado) {opcion = 4; seleccionado = true;}
  seleccionado = false;
  
switch (opcion) {  
//BOTON 1__________________________________________________________

  case 0:
  
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, LOW);
      break;

  case 1:
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      delay (5000);
      digitalWrite(ledPin2, LOW);
      delay (1000);
      break;

  case 2:
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      delay (3000);
      digitalWrite(ledPin2, LOW);
      delay (1000);
      break;

  case 3:
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      delay (1000);
      digitalWrite(ledPin2, LOW);
      delay (1000); 
      break;

 case 4: 
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, HIGH);

      }  
}

Ya le agrege mi lcd sin problemas , solo me falta esa parte del boton de paro gracias !

Según código... cuál era el "botón de paro"?

Está extraño porque se supone que hay un case para cada uno de los cinco botones... :confused:

siento que la funcion del programa esta un poco mal planteada a mi hulmide opinon debes de hacer un pseudo-codigo antes de que pasos realizara y de ahi partir para realizar el programa , como dice uno de los comentarios anteriores me parece que puedes hacer algo que lleve cuenta de que boton se preciona y utilizar un switch (opcion) y que cada que haya un case hacer una funcion para cada caso asi no te atoras con todos los if y los else del programa.

el delay para la ejecucion del loop ,por lo que la placa no atiende a la pulsacion de botones(ni a nada) durante la duracion del mismo ,salvo a las interrupciones,por lo que una posible solucion seria que la ejecucion de cada ciclo dependiera de una variable booleana que se modificaria en la funcion que va ligada en la interrupcion cambiando el valor,asi al iniciar el ciclo siguiente la variable booleana cambia de valor y no se ejecuta el siguiente ciclo.