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. Lo que quiero es que continúe contando a pesar de que esté sonando el buzzer. He probado distintas combinaciones y no doy con el resultado exacto.

Agradezco una mano.

Es un andruino UNO.

Código:
#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);           
}
 
Es imposible que continúe contando mientras tengas un DELAY.

El delay te va a atorar el microcontrolador el tiempo que tenga programado.

Lo que debes hacer, es administrar el tiempo.
Es decir, en un tiempo muy corto ejecutas el beep y en un tiempo muy corto ejecutas tu otra tarea.

A eso se le llama multitarea. Debes estudiar eso, la multitarea en un microcontrolador.
 
Última edición por un moderador:
Gracias por contestar. Acabo de probar lo que me dices. El caso es que si quito o reduzco el delay ya no tengo el sonido que quiero. En un principio quiero que se repita 20 veces un pitido intermitente y posteriormente un pitido continuo.

¿Alguna otra forma en que pueda encararlo?

Gracias de antemano
 
Si se puede, todo es posible.

Lo que debes hacer, es una base de tiempo con un delay muy corto o con una interrupción.

Ejemplo:
Código:
void main() //esta debe ser cambiada en arduino por loop creo no uso arduino
{
int contador=0;
char segundo1;
char segundo 2;

while(1)//bucle infinito
{

if (contador>= 1000) //cuando llega a 1000 hacemos 1 segundo
{
segundos ++;
contador=0;    //reiniciamos contador
}


if(segundo2>=7) //cuando pasen 7 segundos 
{

segundo2=0; //reiniciamos segundo
rele prende;
}
else 
{
rele apaga;
}


if(segundo1>=3) //cuando pasen 3 segundos 
{

segundo1=0; //reiniciamos segundo
led prende;
}
else 
{
led apaga;
}



//----- AQUI HACEMOS EL TIEMPO-------//

delay_ms(1); // delay muy corto de 5us esta cambia pues es un ejemplo burdo
contador++; //este cuenta para hacer nuestra base de tiempo

}
}
Este código debes estudiarlo, es un ejemplo de una multitarea donde ocurren 2 eventos al mismo tiempo sin atorar al microcontrolador.
Bueno, sí. En realidad lo atoro 1 milisegundo pero para evitar eso, puedo meter la base de tiempo en una interrupción de 1 milisegundo y el microcontrolador no se debería atorar en lo absoluto.
 
Última edición por un moderador:
Atrás
Arriba