Hola! Soy Fede, estuve buscando previamente en el foro la forma de detener un bucle while y encontre "break" lo cual funciono, pero no es lo que esperaba.
Lo que intento hacer es que una lavadora encienda un par de bombas por unos segundos y luego se detenga, pero la lavadora tiene una tapa que cuando se cierra se acciona un pulsador que queda siempre en modo "HIGH" por lo que nunca para de lavar, se repite el proceso.
Disculpen mi ignorancia pero recien comienzo con esto, que posibilidades hay de detener el codigo sin que se repita mientras el pulsador este en "HIGH"
PD: Con respecto a "delay", conozco los contras pero no estoy empapado con millis asique ya que es solo temporizar el funcionamiento de las bombas use delay.
Adjunto el codigo
int pulsador;
const int pinBuzzer = 13 ;
// const int lavadO = 4; //d2
// const int enjuaguE = 5; //d1
void setup() {
pinMode(2,INPUT); // botón de entrada, conectado por defecto a GND
pinMode(4, OUTPUT); //bomba lavado
pinMode(5, OUTPUT); //bomba enjuague
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
toque();
}
void loop() {}
void toque() {
while (pulsador == LOW) {
if (digitalRead(2) == LOW) { // pulsado el botón
tone(pinBuzzer, 3700);
delay(300);
noTone(pinBuzzer);
delay(1000);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
delay(5000);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
tone(pinBuzzer, 3700);
delay(400);
noTone(pinBuzzer);
delay(400);
tone(pinBuzzer, 3700);
delay(400);
noTone(pinBuzzer);
pulsador = LOW;
}
}
}
Muchas Gracias y disculpen si el tema esta repetido.
Gatul muchas gracias por responder, modifique el título, gracias por la aclaración.
Con respecto al código, probé eso que me sugeris pero sigue en la misma situación ya que el INPUT sigue activo, la tapa de la lavadora es la que da la orden, por lo que al terminar el lavado..vuelve a repetirse el proceso porque la tapa sigue enviando la señal y el bucle se vuelve a repetir.
Me explico?
Muchas gracias
Si el pulsador de la tapa está en el pin 2 (eso es lo que yo interpreté) y la secuencia en la rutina toque() sólo se tiene que ejecutar 1 sola vez el error es justamente el lazo while() porque haces repetir la secuencia mientras la tapa está cerrada y el pulsador en LOW.
Lo lógico sería eliminar el lazo ya que solo se tendría que ejecutar 1 vez.
Eso si es que te estoy interpretando bien, reitero.
Edito: No, no estaba interpretando bien.
El pin 2 se pone en HIGH con la tapa cerrada, entonces tu secuencia solo se ejecuta con la tapa abierta.
Por favor pon el resto del código porque ese fragmento que has puesto no alcanza para ver el problema.
El código que adjunte es todo, me queda agregar tiempos de lavado pero no va al caso.
Es así, cuando la tapa baja, un reed switch cierra el circuito (está invertido..low es high).
Recien hice la prueba, me quedo así:
Pero hace lo mismo, termina la secuencia y como la tapa sigue cerrada, vuelve a repetirse (porque estan en loop, lo hice estando en void toque y tampoco funciono, no me detecta nada)
Para que esto no suceda la persona que lava debe de abrir la tapa apenas termina el ciclo para que no se repita, que es lo que quiero evitar.
Voy a probar con el while al final, si, probé desde el setup pero no hace nada..inmutable.
No sé porque está invertido, si envío la orden digitalWrite HIGH queda apagada la salida..si envío digitalWrite LOW, enciende...no se porque..será porque uso Wemos mini?
Gracias por la dedicación.
Funciono perfecto con While, tuve que agregarle un par de cosas para que realmente se quedara dentro del mismo, de todas maneras me parece que hay un poco de ruido electrico por las cargas inductivas del motor porque la entrada no siempre es constante, voy a hacerle debounce y a ponerle un par de filtros.
A modo de anecdota, nunca pude usar arduino uno por ejemplo para controlar motores grandes (con rele y contactor) el ruido electrico al encender llegaba a la fuente de alimentacion por ende se descontrolaba todo! Pero en el caso de wemos nunca un problema, inclusive usando control por wifi y demas.
Gatul muchas gracias por tu ayuda, me has solucionado un literal dolor de cabeza.
Dejo el codigo por si alguien le sirve.
int pulsador;
const int pinBuzzer = 13 ;
// const int lavadO = 4; //d2
// const int enjuaguE = 5; //d1
void setup() {
pinMode(2,INPUT); // botón de entrada, conectado por defecto a GND
pinMode(4, OUTPUT); //bomba lavado
pinMode(5, OUTPUT); //bomba enjuague
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
toque();
}
void loop() {}
void toque() {
while (pulsador == LOW) {
if (digitalRead(2) == LOW) { // pulsado el botón
tone(pinBuzzer, 3700);
delay(300);
noTone(pinBuzzer);
delay(1000);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
delay(5000);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
tone(pinBuzzer, 3700);
delay(400);
noTone(pinBuzzer);
delay(400);
tone(pinBuzzer, 3700);
delay(400);
noTone(pinBuzzer);
while (digitalRead(2) == LOW) {
tone(pinBuzzer, 3700);
delay(800);
noTone(pinBuzzer);
delay(800);
}
}
}
}
Yo creo que no esta solucionado por varias razones que ahora no visualizas.
Lo mejor es que sigas en este hilo haciendo tus consultas porque es obvio que tendras muchas mas.
El principal problema que tienes es que usas delay() y ahora te funciona bien pero luego verás que no será el caso.
Te recomiendo leas en Documentación => Indice de temas Tutoriales => millis() y tambien lee máquina de estados. Indice de temas Tutoriales
Para ir comprendiendo como debes trabajar.
Te va a provocar otro dolor de cabeza entenderlo pero a la larga veras que será muy bueno.