Use a touchscreen display to select which sensor measurement to display
Dependencies: mbed DisplayModule24_demo_day10
acc.cpp@8:a7b7edb66de5, 2017-01-17 (annotated)
- Committer:
- ldelaney17
- Date:
- Tue Jan 17 21:28:13 2017 +0000
- Revision:
- 8:a7b7edb66de5
- Parent:
- 5:8a2afc6fdeb0
final commit; cleaned up debug code; added comments; set 10s ticker period
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ldelaney17 | 1:f2a5ea8ff543 | 1 | /* |
ldelaney17 | 1:f2a5ea8ff543 | 2 | * see acc.h for description of this file |
ldelaney17 | 1:f2a5ea8ff543 | 3 | */ |
ldelaney17 | 1:f2a5ea8ff543 | 4 | #include "acc.h" |
ldelaney17 | 1:f2a5ea8ff543 | 5 | void acc_init(){ |
ldelaney17 | 1:f2a5ea8ff543 | 6 | char acc_config_dataFormat[2] = {0x31,0x0b}; //measurement range |
ldelaney17 | 1:f2a5ea8ff543 | 7 | char acc_config_powerControl[2] = {0x2d,0x08}; |
ldelaney17 | 1:f2a5ea8ff543 | 8 | connection.write(addr_acc, acc_config_dataFormat, 2); // full measurement range |
ldelaney17 | 5:8a2afc6fdeb0 | 9 | wait(.05); // busy wait tolerable during initialization |
ldelaney17 | 1:f2a5ea8ff543 | 10 | connection.write(addr_acc, acc_config_powerControl, 2); // measure mode |
ldelaney17 | 1:f2a5ea8ff543 | 11 | wait(.05); |
ldelaney17 | 1:f2a5ea8ff543 | 12 | } |
ldelaney17 | 1:f2a5ea8ff543 | 13 | |
ldelaney17 | 1:f2a5ea8ff543 | 14 | float get_acc_magnitude(){ |
ldelaney17 | 1:f2a5ea8ff543 | 15 | char data_arr[2] = {0x80|0x40|0x32}; |
ldelaney17 | 1:f2a5ea8ff543 | 16 | connection.write(addr_acc, data_arr, 1); //set up the connection for reading from data |
ldelaney17 | 1:f2a5ea8ff543 | 17 | char acc_data[6]; |
ldelaney17 | 1:f2a5ea8ff543 | 18 | connection.read(addr_acc, acc_data, 6); //read the 6 bytes of data |
ldelaney17 | 1:f2a5ea8ff543 | 19 | int16_t data[3]; |
ldelaney17 | 1:f2a5ea8ff543 | 20 | float x, y, z; |
ldelaney17 | 8:a7b7edb66de5 | 21 | data[0] = acc_data[1] << 8 | acc_data[0]; //shift the bytes into 16bit integers |
ldelaney17 | 1:f2a5ea8ff543 | 22 | data[1] = acc_data[3] << 8 | acc_data[2]; |
ldelaney17 | 1:f2a5ea8ff543 | 23 | data[2] = acc_data[5] << 8 | acc_data[4]; |
ldelaney17 | 8:a7b7edb66de5 | 24 | x = 0.004 * data[0]; //convert the raw data to a value in terms of g |
ldelaney17 | 1:f2a5ea8ff543 | 25 | y = 0.004 * data[1]; |
ldelaney17 | 1:f2a5ea8ff543 | 26 | z = 0.004 * data[2]; |
ldelaney17 | 8:a7b7edb66de5 | 27 | float mag = sqrt(x*x + y*y + z*z); //calculate the magnitude |
ldelaney17 | 1:f2a5ea8ff543 | 28 | #ifdef DEBUG_MODE |
ldelaney17 | 1:f2a5ea8ff543 | 29 | pc.printf("x = %+1.2fg\t y = %1.2fg\t z = %1.2fg\t mag = %+1.2fg\n\r", x, y, z, mag); |
ldelaney17 | 1:f2a5ea8ff543 | 30 | #endif |
ldelaney17 | 1:f2a5ea8ff543 | 31 | return mag; |
ldelaney17 | 2:1ab4c19b99d4 | 32 | } |
ldelaney17 | 2:1ab4c19b99d4 | 33 | |
ldelaney17 | 8:a7b7edb66de5 | 34 | //gets the average of n (default 5) readings |
ldelaney17 | 2:1ab4c19b99d4 | 35 | float get_avg_mag(int n){ |
ldelaney17 | 2:1ab4c19b99d4 | 36 | if ( n <= 0) |
ldelaney17 | 2:1ab4c19b99d4 | 37 | return 0; |
ldelaney17 | 2:1ab4c19b99d4 | 38 | float counter = 0; |
ldelaney17 | 2:1ab4c19b99d4 | 39 | for (int i = 0; i < n; i++){ |
ldelaney17 | 2:1ab4c19b99d4 | 40 | counter += get_acc_magnitude(); |
ldelaney17 | 2:1ab4c19b99d4 | 41 | } |
ldelaney17 | 2:1ab4c19b99d4 | 42 | return counter / n; |
ldelaney17 | 1:f2a5ea8ff543 | 43 | } |