Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822 circular_buffer
main.cpp
- Committer:
- agufal
- Date:
- 2016-05-25
- Revision:
- 13:e4c3b3e00e3d
- Parent:
- 12:172acb80fcab
File content as of revision 13:e4c3b3e00e3d:
/*
* Esto es para la placa Xtrinsic-Sense Board de element14, mas
* concretamente para el acelerometro MMA8491Q
*/
#include "mbed.h"
#include "Acelerometro.h"
#include "AccelService.h"
#include "circular_buffer.h"
#define MUESTRAS 10
//Serial pc(p9, p11);
bool expired = false;
Timeout timeout; // Hay un LowPowerTimeout, pero no me deja usarlo por algun motivo
/*****************************************************************************
Por lo visto hay que tener cuidado con las funciones de i2c.read y i2c.write,
porque la funcion sleep desactiva el reloj cuando empieza, y lo reactiva al
final del todo cuando hay una interrupcion. Dice que se podria reactivar
manualmente el reloj...
En teoria el solito determina que tipo de sleep utilizar "dinamicamente"
Fuente:
https://developer.mbed.org/teams/SiliconLabs/wiki/Using-the-improved-mbed-sleep-API
******************************************************************************/
void activar(void){
expired = true;
}
int main() {
Acelerometro acc;
AccelService acc_service;
circular_buffer<Vector> buffer(MUESTRAS);
wait(0.01);
// Pesos para la media ponderada, para darle mas valor a los ultimos datos
int pesos[] = { 10, 10, 10, 10, 20, 30, 40, 50, 80, 90 };
while(1) {
Vector ultimo = acc.leer();
buffer.push_back(ultimo);
// TODO Hacer esto en un hilo
// TODO Hacer otro buffer mas chiquitito para la luz de freno
int x = 0, y = 0, z = 0;
int sumaPesos = 0;
for (int i = 0; i < buffer.get_size(); i++){
Vector v = buffer[i];
x += v.x * pesos[i];
y += v.y * pesos[i];
z += v.z * pesos[i];
sumaPesos += pesos[i];
}
Vector media;
media.x = x / sumaPesos; //buffer.get_size();
media.y = y / sumaPesos; //buffer.get_size();
media.z = z / sumaPesos; //buffer.get_size();
acc_service.updateAccelState(media);
//wait(1);
expired = false;
timeout.attach(activar, 1);
// Esto es porque sale del sleep con cualquier interrupcion,
// asi que hay que decirle que si no es la nuestra, se vuelva a dormir
while(!expired) sleep();
//pc.printf("media - X: %i\n Y: %i\n Z: %i\n", media.x, media.y, media.z);
//pc.printf("valor - X: %i\n Y: %i\n Z: %i\n", ultimo.x, ultimo.y, ultimo.z);
}
}
