Problema con el contador tras llamada a función

Buenas tardes,

Soy novato y tengo un pequeño problema con el siguiente código que posteo a continuación. El caso es que cuando se me ejecuta la función BEEP el contador deja de contar (valga la redundancia) y no vuelve a seguir contando hasta que termina esa función. He probado distintas combinaciones y no doy con el resultado exacto.

Agradezco una mano.

Es un andruino UNO.

#include <LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

int contador = 0;
int pinsensor = 8;
int pinbuzzer = 9;
int lectura;

void setup() 
{
  pinMode(pinsensor, INPUT);
  pinMode(pinbuzzer, OUTPUT);
  
  lcd.begin(16,2);
  lcd.setCursor(4,0);
  lcd.print("SACHETS");
  lcd.setCursor(0,1);
  lcd.print("Contador : 0");

}

void loop() 
{ 
  lectura = digitalRead(pinsensor);

  if (lectura != 1)
  {
    contador = contador + 1;
    lcd.setCursor(11,1);
    lcd.print("     ");
    lcd.setCursor(11,1);
    lcd.print(contador);

    if (contador == 10)
    { 
     beep(500);
    }
    
    while(digitalRead(pinsensor) != 1)
    {}
  }

  

}

void beep(unsigned char delayms){
  
  
  for (int i=0; i<20; i++){
  analogWrite(9, 254);      
  delay(delayms);          
  analogWrite(9, LOW);       
  delay(delayms); 
  }
  analogWrite(9, 254);           

}

Se me olvidó añadir que lo que quiero es que mientras esté sonando el buzar el contador siga sumando cada vez que mi sensor siga detectando objetos y que no pare de sonar hasta que no se pulse el RESET de la placa.

Gracias :slight_smile:

Hola. No sé si te refieres a algo así:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

int contador = 0;
int pinsensor = 8;
int pinbuzzer = 9;
int lectura;

void setup()
{
	pinMode(pinsensor, INPUT);
	pinMode(pinbuzzer, OUTPUT);

	lcd.begin(16,2);
	lcd.setCursor(4,0);
	lcd.print("SACHETS");
	lcd.setCursor(0,1);
	lcd.print("Contador : 0");

}

void loop()
{
	lectura = digitalRead(pinsensor);

	if (lectura != 1)
	{
		contador = contador + 1;
		lcd.setCursor(11,1);
		lcd.print("     ");
		lcd.setCursor(11,1);
		lcd.print(contador);

		if (contador == 10)
		{
			tone(pinbuzzer, 850); // pin, frecuencia del tono
		}

		while(digitalRead(pinsensor) != 1) {};
	}
}

Gracias por contestar noter.

La idea es jugar con el tono. Al principio quiero que suene 20 veces de forma intermitente y después de forma continua (pero mientras sucede esto que siga contando en caso de que el sensor detecte otro objeto). He leído algo acerca de la librería Timer para poder hacer algo asi pero a decir verdad no sé trasladar la idea a mi proyecto.

Un saludo

Comentar también que estuve probando con millis() y tampoco doy con el asunto.

¿alguna idea más?

Saludos

De "reference"

"Caveat

While it is easy to create a blinking LED with the delay() function, and many sketches use short delays for such tasks as switch debouncing, the use of delay() in a sketch has significant drawbacks. No other reading of sensors, mathematical calculations, or pin manipulation can go on during the delay function, so in effect, it brings most other activity to a halt. For alternative approaches to controlling timing see the millis() function and the sketch sited below. More knowledgeable programmers usually avoid the use of delay() for timing of events longer than 10's of milliseconds unless the Arduino sketch is very simple."

Si no me equivoco el micro no cuenta (millis() no incrementa) durante el "delay"

Saludos

Gracias por contestar.

Eso entendí yo,de ahí el problema que tengo: mientras tengo los delay el programa está congelado y no puedo leer con mi sensor :confused:

Saludos

No me he leído a fondo tu especificación (una hojeada; no parece muy complicado). Échale un vistazo a una línea que se llama "doing several things at the same time" (o algo parecido); tu problema está resuelto ahí (casi seguro).

Saludos

"ojeada", coño, "ojeada" (no hojeada)

Le echaré un vistazo y comento. GRACIAS

Buenas de nuevo,

He estado echando un vistazo al hilo que comentas. Entiendo alguna parte pero me viene un pelín grande el trasladarlo a mi proyecto la verdad.

¿algún programador que me pueda echar una mano?

Gracias de nuevo :slight_smile:

Hola,

¿Puedes escribir la especificación?. Por ejemplo: "El sistema está en reposo: no suena el buzzer y en la pantalla se muestra el mensaje "xxxxx". Al pasar una persona (o lo que sea: pulsar el botón, etcétera) el buzzer suena con un pitido grave hasta que se pulsa el pulsador "YYYY", etcétera, etcétera, . . . ."

Saludos

Hola de nuevo,

-El sistema está en reposo y en pantalla se muestra contador = 0

-Pasa un objeto y mi sensor lo lee y en pantalla se muestra contador = 1 (incrementandose el contador con el paso de más objetos)

-Cuando el contador llegue a 10 el buzzer tiene que sonar con 20 pitidos discontinuos y terminar con un pitido continuo que no se pare hasta que se pulse el RESET del ARDUINO)

-Durante el proceso de sonido del buzzer si pasara algún objeto delante del sensor, el contador debe seguir incrementandose (Aquí es donde tengo el problema con los delays en la parte de los 20 pitidos discontinuos)

Gracias de nuevo

Saludos

Hola,

Para empezar puede valer. Más cosas: ¿es un proyecto para aprender?, ¿va a funcionar en una fábrica?, ¿tiene algún compromiso importante -seguridad de personas o cosas-?

Saludos

La finalidad del proyecto es para una linea de producción en una planta. Queremos saber la cantidad exacta de objetos que salen por la línea (a pesar de ello, me lo estoy pasando bien haciendo pruebas y aprendiendo poco a poco). No tiene ningún compromiso como los que mencionas. Es báscicamente un conteo a nivel interno de la planta.

OK. Doy por hecho que tanto el detector de objetos como el buzzer están comprobados cada uno por su lado. (No vendría mal saber algo más del detector. En realidad hace falta saber sus características -problema de rebote; ya te explicaré-).

Saludos

PD. También hace falta saber el consumo (mA) del buzzer y si, aparte del detector, hay algo más de electrónica: alimentación, transistores, etcétera.

(Vuelvo a partir de las 15:30)

El sensor y el buzzer están comprobados.
El sensor es el siguiente:

http://www.pccomponentes.com/modulo_infrarrojos_proximidad_ajustable_compatible_arduino.html

Conectado a GND, 5v y pin.

El consumo del buzzer no lo conozco. Pedí uno que trabajase a 5V y fue el que me dieron. Es igual que este:

Conectado a un PIN PWM y a GND (Aquí igual es necesaria alguna R ¿?).

Lo he montado todo sobre un Arduino UNO con un shield LCD que va acoplado encima y la alimentación la estoy haciendo por el puerto USB (mi idea es que cuando esté terminado se alimente con un cargador).
No le he añadido más de electrónica al no considerarlo necesario (corrígeme si me equivoco).

Hola Joseasis
El tema es que cuando vos haces una demora el micro se queda en esa demora hasta terminarla, NO HACE OTRA COSA, la solución es hacerlo por interrupción interna, busca en el foro algo que publique hace unos días sobre máquina de estados, me paso lo mismo jugando con un display y un led, no detectaba los botones hasta que no terminaba la demora del led.
Espero te sirva.
Suerte.

Usa toneAC en lugar de tone. Es una librería mas evolucionada con control de volumen, frecuencias mas altas (aunque no es tu problema) pero que usa los timers y por lo tanto, no detiene la ejecución del programa