Arduino - utilización de maquinas de estados y estructuras

 
Vista:

utilización de maquinas de estados y estructuras

Publicado por camila saanchez (1 intervención) el 15/05/2018 14:43:41
buenos días estoy comenzando con el tema de maquinas de estados finitos (FSM) y tengo el proyecto de reproducir una melodía por medio de estas maquinas, usado un buzzer. la siguiente es la idea que tengo pero solo reproduce una frecuencia, no tiene la capacidad de cambiar de frecuencia ni de durar el tiempo correspondiente. quisiera saber si es posible que alguien pueda decirme el error que estoy cometiendo. muchas gracias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#define PINbuzzer_1 13
 
typedef enum {
  reproduciendo,
  indagando,
  esperando
}STATE;
STATE state;
 
typedef struct {
  unsigned long previo;
  unsigned long actual;
  unsigned long tiempo2;
  unsigned long tiempo1;
  unsigned long lapso2;
  unsigned long lapso1;
  bool estado;
  unsigned long periodo;
  unsigned long ciclo;
  int pinbuzzer;
  unsigned long frec[24] = {659,659,659,523,659,784,392,523,392,330,440,494,466,440,392,659,784,880,698,784,659,523,587,494};
  unsigned long tiempos[24] = {300,400,600,600,600,700,800,700,600,600,400,400,500,500,700,450,450,700,500,500,700,450,450,700};
  int h;
  int longitud_vector;
  unsigned long frecuencia;
  unsigned long tiempoT;
}BUZZER;
 
BUZZER buzzer_1;
 
int buzzer_setup(BUZZER*buzzer, int pin_buzzer){
  buzzer->previo = micros();
  buzzer->actual = micros();
  buzzer->tiempo2 = micros();
  buzzer->tiempo1 = micros();
  buzzer->lapso2 = micros();
  buzzer->lapso1 = micros();
  buzzer->estado = 0;
  buzzer->pinbuzzer = pin_buzzer;
  buzzer->h = 0;
  buzzer->longitud_vector = 24;
  buzzer->frecuencia=buzzer->frec[buzzer->h];
  buzzer->periodo = 1/buzzer->frecuencia;
  buzzer->tiempoT = buzzer->tiempos[buzzer->h];
 
 
  return 1;
}
 
int buzzer_sound(BUZZER*buzzer){
  switch (state){
 
    case reproduciendo:{
        if( buzzer->actual - buzzer->previo >= (buzzer->periodo/2)*1000000){
      if (buzzer->estado == 0) {
      buzzer->estado = 1;
    } else {
      buzzer->estado = 0;
    }
      digitalWrite( buzzer->pinbuzzer,buzzer->estado);
      buzzer->previo = buzzer->actual = micros();
 
      state = indagando;
  }
  buzzer->actual = micros();
  buzzer->estado = 0;
  digitalWrite( buzzer->pinbuzzer,buzzer->estado);
 
  break;
    }
 
   case indagando: {
  if(buzzer->tiempo2 - buzzer->tiempo1 >= buzzer->tiempoT*1000000){
      buzzer->estado = 1;
      digitalWrite(buzzer->pinbuzzer, buzzer->estado);
       buzzer->tiempo2 = buzzer->tiempo1 = micros();
       state = esperando;
    }
    buzzer->tiempo2 = micros();
    buzzer->estado = 1;
    digitalWrite(buzzer->pinbuzzer, buzzer->estado);
   state = reproduciendo;
 
    break;
   }
 
   case esperando: {
    if(buzzer->lapso2 - buzzer->lapso1 < buzzer->tiempoT*1.5*1000000){
      buzzer->estado = 0;
      digitalWrite(buzzer->pinbuzzer,buzzer->estado);
      buzzer->lapso2 = micros();
    }
    if(buzzer->h > buzzer->longitud_vector){
      buzzer->h = 0;
      }
      buzzer->h++;
    buzzer->estado = 1;
    digitalWrite(buzzer->pinbuzzer, buzzer->estado);
     buzzer->lapso2 = micros();
     buzzer->lapso1 = micros();
     state = reproduciendo;
 
    break;
   }
 
 
  }
 
}
 
void setup(){
 
pinMode(PINbuzzer_1,OUTPUT);
buzzer_setup(&buzzer_1,PINbuzzer_1);
}
 
void loop(){
  buzzer_sound(&buzzer_1);
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder