Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Desenvolvido por Murilo Zanini de Carvalho
- Objetivo: Controlar a distância utilizando o sensor de ultrassom
- */
- //Bibliotecas
- //Definicoes e estruturas
- #define led0 2
- #define led1 3
- #define led2 4
- #define pot 0
- #define echo 5
- #define trig 6
- #define N 10
- //Define nossa estrutura media movel
- typedef struct {
- int medicoes[N];
- byte pronto, indice;
- int media;
- } MediaMovel;
- //Variaveis globais
- MediaMovel distancia;
- unsigned long tempo; //Variável para contagem de tempo
- byte estadoSensor; //Variável que cuida do estado atual da leitura do sensor
- //Prototipos de funcoes
- void inicializaMediaMovel(MediaMovel *m);
- void atualizaSensor(); //Função que atualiza o valor do sensor de distancia
- void insereAmostra(MediaMovel *m, int amostra);
- //Função que calcula a distância da média móvel
- int CalcularMedia(MediaMovel *m);
- //FUnçaõ que pega o valor da média movel
- int pegarMedia(MediaMovel m);
- //Funções
- void setup(){
- //Inicialização dos pinos
- pinMode(echo, INPUT);
- pinMode(trig, OUTPUT);
- pinMode(led0, OUTPUT);
- pinMode(led1, OUTPUT);
- pinMode(led2, OUTPUT);
- estadoSensor = 0;
- //Chama função que inicializa a média móvel
- inicializaMediaMovel(&distancia);
- //Inicializa a comunicação Serial
- Serial.begin(9600);
- }
- void loop(){
- //Maquina de estados que realiza a leitura do sensor
- atualizaSensor();
- //Verifica se já está pronto para realizar o programa
- if(CalcularMedia(&distancia)){
- Serial.print("Distancia:");
- Serial.println(pegarMedia(distancia), DEC);
- delay(500);
- }
- }
- //Função que inicializa a média movel
- void inicializaMediaMovel(MediaMovel *m){
- (*m).indice = 0;
- (*m).pronto = 0;
- }
- //Função que atualiza a distancia do sensor de distancia
- void atualizaSensor(){
- switch(estadoSensor){
- case 0:
- digitalWrite(trig, HIGH);
- delayMicroseconds(12);
- digitalWrite(trig, LOW);
- estadoSensor = 1;
- tempo = millis(); //Pega o instante de tempo atual
- break;
- case 1:
- if(digitalRead(echo)){
- tempo = millis(); //Atualiza o valor do tempo
- estadoSensor = 2;
- }
- else if(millis() - tempo >= 10){ //Verifica se não esturou o tempo de espera
- estadoSensor = 0;
- }
- break;
- case 2:
- if(!digitalRead(echo)){
- tempo = millis() - tempo; //Conta o tempo que o pino ficou em nível alto
- estadoSensor = 3;
- }
- else if(millis() - tempo >= 32000){ //Verifica se não estourou o tempo máximo de leitura do sensor
- estadoSensor = 0;
- }
- break;
- case 3:
- //Calcula a distancia e já insere na média movel
- insereAmostra(&distancia, tempo/58);
- estadoSensor = 0;
- break;
- }
- }
- //Insere a amostra na estrutura da média movel
- void insereAmostra(MediaMovel *m, int amostra){
- //Insere a amostra no vetor
- (*m).medicoes[(*m).indice] = amostra;
- //Verifica se a quantidade de amostras já é suficiente
- if((*m).indice == 9 && !(*m).pronto)
- (*m).pronto = 1;
- //Vai para próxima posição do vetor de amostras
- (*m).indice = ((*m).indice + 1) % 10;
- }
- //FUnção que fala se esta pronto para utilizar
- int CalcularMedia(MediaMovel *m){
- if((*m).pronto){
- (*m).media = 0;
- for(int i = 0; i < N; i++){
- (*m).media += (*m).medicoes[i];
- }
- (*m).media /= N;
- }
- return (*m).pronto;
- }
- //Função que pega o valor da média movel
- int pegarMedia(MediaMovel m){
- return m.media;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement