![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Detect 6 states of the board, display state.
Fork of Accelerometer_example by
Revision 2:cc80ef6fc8c2, committed 2018-02-16
- Comitter:
- natgovor
- Date:
- Fri Feb 16 18:54:56 2018 +0000
- Parent:
- 1:31f0f53b08bd
- Commit message:
- Detect 6 states of the board, display state.
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 31f0f53b08bd -r cc80ef6fc8c2 main.cpp --- a/main.cpp Wed Feb 07 16:56:55 2018 +0000 +++ b/main.cpp Fri Feb 16 18:54:56 2018 +0000 @@ -7,26 +7,98 @@ #define MMA8451_I2C_ADDRESS (0x1d<<1) +PwmOut rled(LED1); +PwmOut gled(LED2); +PwmOut bled(LED3); + +void setLeds(float red, float green, float blue) { + rled = red; + gled = green; + bled = blue; +} + int main(void) -{ +{ MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); - PwmOut rled(LED1); - PwmOut gled(LED2); - PwmOut bled(LED3); Serial pc(USBTX, USBRX); // tx, rx - + + enum states { flat, right, left, down, up, over, intermediate }; + states state = intermediate; + states oldState = intermediate; + states oldStableState = intermediate; + int stateCounter = 0; + int const stableState = 3; - pc.printf("MMA8451 ID: %d\n", acc.getWhoAmI()); + pc.printf("MMA8451 ID: %d\n\r", acc.getWhoAmI()); while (true) { float x, y, z; x = acc.getAccX(); y = acc.getAccY(); z = acc.getAccZ(); - rled = 1.0f - abs(x); - gled = 1.0f - abs(y); - bled = 1.0f - abs(z); + + float threshold = 0.10; + + if (z > 1 - threshold && z < 1 + threshold) { + state = flat; + } else if (z > -1 - threshold && z < -1 + threshold) { + state = over; + } else if (y > 1 - threshold && y < 1 + threshold) { + state = left; + } else if (y > -1 - threshold && y < -1 + threshold) { + state = right; + } else if (x > 1 - threshold && x < 1 + threshold) { + state = down; + } else if (x > -1 - threshold && x < -1 + threshold) { + state = up; + } else { + state = intermediate; + } + + if (state != intermediate) { + if (state == oldState) { + if (stateCounter < stableState) { + stateCounter ++; + } + } else { + oldState = state; + stateCounter = 0; + } + } else { + setLeds(0.99, 0.99, 0.99); // dimmed white led + } + + // print the state + if (stateCounter == stableState && oldStableState != state) { + oldStableState = state; + switch (state) { + case flat: + pc.printf("flat\n\r"); + setLeds(0.0, 0.0, 1.0); // yellow led + break; + case right: + pc.printf("right\n\r"); + setLeds(1.0, 0.0, 0.0); // light-blue led + break; + case left: + pc.printf("left\n\r"); + setLeds(1.0, 1.0, 0.0); // blue led + break; + case down: + pc.printf("down\n\r"); + setLeds(0.0, 1.0, 0.0); // pink led + break; + case up: + pc.printf("up\n\r"); + setLeds(0.0, 1.0, 1.0); // red led + break; + case over: + pc.printf("over\n\r"); + setLeds(1.0, 0.0, 1.0); // green led + break; + } + } + Thread::wait(300); - pc.printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x, y, z); } }