Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

16/09/2015 #1


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);           
}
16/09/2015 #2

Avatar de TRILO-BYTE

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.
16/09/2015 #3


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
16/09/2015 #4

Avatar de TRILO-BYTE

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.
16/09/2015 #5


Gracias por tu respuesta, le echaré un vistazo.

Saludos
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.