-
Notifications
You must be signed in to change notification settings - Fork 0
/
arduino.c
159 lines (127 loc) · 3.87 KB
/
arduino.c
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// Valor de MY en XBee (ATMY)
#define direccionMando 0x1
// Valor de ID en XBee (ATID)
#define idRed 0x3332
// Canal de comunicación XBee (ATCH)
#define canal 0xC
// Dirección del receptor (ATDL)
#define direccionReceptor 0x2
boolean accelSleep;
char inData[100]; // Espacio para los datos entrantes
char inChar; // Caracter leído
byte index = 0; // Índice del array
String cadenaIdentificacion = "MY=" + String(direccionMando) + ",ID=" + String(idRed) + ",CH=" + String(canal) + ",DL=" + String(direccionReceptor);
unsigned int delayMuestreo = 50; // Delay de muestreo por defecto
int instruccion; // Variable para guardar la instrucción a ejecutar
unsigned int aux = 0; // Variable para almacenar el segundo parámetro recibido (delay de muestreo)
char identificadorEntrante[100]; // Array para guardar la cadena que comprobará si la instrucción es o no para este mando
void setup()
{
// Configuración puerto Serie
Serial.begin(9600); // 9600 bps
delay(1000);
accelSleep = HIGH;
// Ponemos en alto la entrada ¬ SLEEP
digitalWrite(4, accelSleep);
// Para ganar precisión se usa una fuente de referencia externa (3.3V)
analogReference(EXTERNAL);
pinMode(13,OUTPUT);
// Enciendo el LED 13
digitalWrite(13, accelSleep);
}
void loop()
{
recibeInstrucciones();
if(accelSleep == HIGH){
// Valor de x entre 0 y 1023
float x = analogRead(A5);
// Valor de y entre 0 y 1023
float y = analogRead(A4);
// Valor de z entre 0 y 1023
float z = analogRead(A3);
// Cambio los valores a voltios
x = x*3.3/1023;
y = y*3.3/1023;
z = z*3.3/1023;
// Paso los valores a G
x = (x - 0.85) * (2) / (2.45-0.85) -1;
y = (y - 0.85) * (2) / (2.45-0.85) -1;
z = (z - 0.60) * (2) / (2.21-0.60) -1;
// Imprimo los valores
Serial.print("IT");
// Datos de direccionamiento de XBee
Serial.print("MY=");
Serial.print(direccionMando);
Serial.print(",");
Serial.print("ID=");
Serial.print(idRed);
Serial.print(",");
Serial.print("CH=");
Serial.print(canal);
Serial.print(",");
Serial.print("DL=");
Serial.print(direccionReceptor);
Serial.print(",");
// Datos de sensores
Serial.print("x=");
Serial.print(x);
Serial.print(",");
Serial.print("y=");
Serial.print(y);
Serial.print(",");
Serial.print("z=");
Serial.print(z);
Serial.println("FT");
}
delay(delayMuestreo);
}
void recibeInstrucciones(){
// Leo mientras haya datos
while (Serial.available() > 0)
{
if(index < 99)
{
inChar = Serial.read(); // Leo el caracter
inData[index] = inChar; // Lo guardo
index++; // Aumento el índice del array
inData[index] = '\0'; // Cierro la cadena
// Parseo la cadena entrante
sscanf (inData,"%s %d %d",identificadorEntrante,&instruccion,&aux);
}
}
// Si el primer dato recibido coindice con el identificador del mando
if ((String(identificadorEntrante).compareTo(cadenaIdentificacion)) == 0) {
// "Limpio" los arrays
for (int i=0;i<99;i++) {
inData[i]=0;
identificadorEntrante[i]=0;
}
index=0;
// Ejecuto la instrucción asociada
switch(instruccion){
case 1:
// Apagar acelerómetro
accelSleep = LOW;
delay(1000);
digitalWrite(4, accelSleep);
digitalWrite(13, accelSleep);
Serial.println("OK");
break;
case 2:
// Encender acelerómetro
accelSleep = HIGH;
delay(1000);
digitalWrite(4, accelSleep);
digitalWrite(13, accelSleep);
Serial.println("OK");
break;
case 3:
// Cambiar velocidad de muestreo
if(aux>0){
delayMuestreo = aux;
}
Serial.println("OK");
break;
}
}
}