Estou atualmente trabalhando com Arduino + Sensores ultra-sônicos e me deparei com problemas que eu achei interessante publicar. A ideia do projeto é utilizar os sensores para contar entrada e saída de pessoas em um estabelecimento, para isso está sendo utilizado dois sensores para detectar o sentido que a pessoa passa na porta (entrada ou saída).
Pois bem, irei apresentar os trechos de código que fazem parte da solução final.
1º - Rotina para leitura do sensor:
unsigned long Timing(int trigger,int echo)
{
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
unsigned long duration=pulseIn(echo,HIGH)/29/2;
return duration;
}
Onde:
- trigger: é a porta que será enviado o sinal para o sensor e,
- echo: é a porta que receberá a resposta do sinal.
O valor que retorna do pulseIn está sendo dividido por 29 e depois por 2. Isso é para que o resultado dessa rotina retorne a distância que o sensor está levando em consideração a velocidade do som. A divisão por dois é para considerar apenas a ida (no caso do sensor ultra-sônico, é preciso que o sinal retorne para calcular a distância que é de ida e volta).
É importante também manter os valores dos delays (que estão em microsegundos), para evitar problemas com o processo do arduino.
2º - Rotina para verificar a existência de uma pessoa no sensor:
É importante também manter os valores dos delays (que estão em microsegundos), para evitar problemas com o processo do arduino.
2º - Rotina para verificar a existência de uma pessoa no sensor:
boolean CheckDuration(unsigned long value)
{
if ( ((value<height)||(value > deadSignal)) && (value > 0) )
{
return true;
}
else
return false;
}
Onde:
- value: é o valor que retorna da função Timing,
- height: é a altura mínima que deseja considerar nos cálculos e,
- deadSignal: é o valor máximo que retorna do sensor (isso deve ser considerado pois pode acontecer do sensor perder o sinal, que significa que algo passou por ele. No meu caso o valor é de 500, que é a distância máxima que o sensor retorna de 5 metros)
Caso a função retorne verdadeiro, significa que o sensor detectou algo, caso contrário, o sensor não detectou nada.
Segue abaixo um exemplo de como trabalhar com essas duas funções:
void loop()
{
if (CheckDuration(Timing(ETrig, EEcho)))
{
for (int i = 0; i < 14; i++)
{
delay(25);
if (CheckDuration(Timing(LTrig, LEcho)))
{
// DO SOMETHING
break;
}
}
delay(25);
}
}
Nenhum comentário:
Postar um comentário