Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.31 KB | None | 0 0
  1. /*
  2. Desenvolvido por Murilo Zanini de Carvalho
  3. Objetivo: Controlar a distância utilizando o sensor de ultrassom
  4. */
  5.  
  6. //Bibliotecas
  7.  
  8. //Definicoes e estruturas
  9. #define led0 2
  10. #define led1 3
  11. #define led2 4
  12. #define pot 0
  13. #define echo 5
  14. #define trig 6
  15. #define N 10
  16.  
  17. //Define nossa estrutura media movel
  18. typedef struct {
  19. int medicoes[N];
  20. byte pronto, indice;
  21. int media;
  22. } MediaMovel;
  23.  
  24. //Variaveis globais
  25. MediaMovel distancia;
  26. unsigned long tempo; //Variável para contagem de tempo
  27. byte estadoSensor; //Variável que cuida do estado atual da leitura do sensor
  28.  
  29. //Prototipos de funcoes
  30. void inicializaMediaMovel(MediaMovel *m);
  31. void atualizaSensor(); //Função que atualiza o valor do sensor de distancia
  32. void insereAmostra(MediaMovel *m, int amostra);
  33. //Função que calcula a distância da média móvel
  34. int CalcularMedia(MediaMovel *m);
  35. //FUnçaõ que pega o valor da média movel
  36. int pegarMedia(MediaMovel m);
  37.  
  38. //Funções
  39. void setup(){
  40. //Inicialização dos pinos
  41. pinMode(echo, INPUT);
  42. pinMode(trig, OUTPUT);
  43. pinMode(led0, OUTPUT);
  44. pinMode(led1, OUTPUT);
  45. pinMode(led2, OUTPUT);
  46. estadoSensor = 0;
  47. //Chama função que inicializa a média móvel
  48. inicializaMediaMovel(&distancia);
  49. //Inicializa a comunicação Serial
  50. Serial.begin(9600);
  51. }
  52.  
  53. void loop(){
  54. //Maquina de estados que realiza a leitura do sensor
  55. atualizaSensor();
  56. //Verifica se já está pronto para realizar o programa
  57. if(CalcularMedia(&distancia)){
  58. Serial.print("Distancia:");
  59. Serial.println(pegarMedia(distancia), DEC);
  60. delay(500);
  61. }
  62. }
  63.  
  64. //Função que inicializa a média movel
  65. void inicializaMediaMovel(MediaMovel *m){
  66. (*m).indice = 0;
  67. (*m).pronto = 0;
  68. }
  69.  
  70. //Função que atualiza a distancia do sensor de distancia
  71. void atualizaSensor(){
  72. switch(estadoSensor){
  73. case 0:
  74. digitalWrite(trig, HIGH);
  75. delayMicroseconds(12);
  76. digitalWrite(trig, LOW);
  77. estadoSensor = 1;
  78. tempo = millis(); //Pega o instante de tempo atual
  79. break;
  80.  
  81. case 1:
  82. if(digitalRead(echo)){
  83. tempo = millis(); //Atualiza o valor do tempo
  84. estadoSensor = 2;
  85. }
  86. else if(millis() - tempo >= 10){ //Verifica se não esturou o tempo de espera
  87. estadoSensor = 0;
  88. }
  89. break;
  90.  
  91. case 2:
  92. if(!digitalRead(echo)){
  93. tempo = millis() - tempo; //Conta o tempo que o pino ficou em nível alto
  94. estadoSensor = 3;
  95. }
  96. else if(millis() - tempo >= 32000){ //Verifica se não estourou o tempo máximo de leitura do sensor
  97. estadoSensor = 0;
  98. }
  99. break;
  100. case 3:
  101. //Calcula a distancia e já insere na média movel
  102. insereAmostra(&distancia, tempo/58);
  103. estadoSensor = 0;
  104. break;
  105. }
  106. }
  107.  
  108. //Insere a amostra na estrutura da média movel
  109. void insereAmostra(MediaMovel *m, int amostra){
  110. //Insere a amostra no vetor
  111. (*m).medicoes[(*m).indice] = amostra;
  112. //Verifica se a quantidade de amostras já é suficiente
  113. if((*m).indice == 9 && !(*m).pronto)
  114. (*m).pronto = 1;
  115. //Vai para próxima posição do vetor de amostras
  116. (*m).indice = ((*m).indice + 1) % 10;
  117. }
  118.  
  119. //FUnção que fala se esta pronto para utilizar
  120. int CalcularMedia(MediaMovel *m){
  121. if((*m).pronto){
  122. (*m).media = 0;
  123. for(int i = 0; i < N; i++){
  124. (*m).media += (*m).medicoes[i];
  125. }
  126. (*m).media /= N;
  127. }
  128. return (*m).pronto;
  129. }
  130.  
  131. //Função que pega o valor da média movel
  132. int pegarMedia(MediaMovel m){
  133. return m.media;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement