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
| <span class='line'>#include "mma7260q.h"
</span><span class='line'>
</span><span class='line'>//set up MMA7260Q
</span><span class='line'>Mma7260q mma7260q = Mma7260q(0,1,2);
</span><span class='line'>
</span><span class='line'>long time = millis();
</span><span class='line'>
</span><span class='line'>void setup() {
</span><span class='line'>
</span><span class='line'> Serial.begin(9600);
</span><span class='line'> delay(100);
</span><span class='line'>
</span><span class='line'>
</span><span class='line'> //initial calibration of the MMA7260q
</span><span class='line'> // you can get the correct values for your MMA7260q
</span><span class='line'> // by running this program and copying the max and min values
</span><span class='line'> // after rotating the mma7260q 360degrees around all axis
</span><span class='line'> mma7260q.autoZeroCalibration(173,192,258);
</span><span class='line'> mma7260q.autoZeroCalibration(766,720,914);
</span><span class='line'>
</span><span class='line'>
</span><span class='line'> Serial.print("RST\r\n");delay(100);
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>void loop()
</span><span class='line'>{
</span><span class='line'> float rho, phi,theta;
</span><span class='line'> mma7260q.readTilt(&rho,&phi,&theta);
</span><span class='line'>
</span><span class='line'> if ((millis()-time)>2000)
</span><span class='line'> {
</span><span class='line'> time = millis();
</span><span class='line'> Serial.print("rho : ");
</span><span class='line'> printFloat(rho,3);
</span><span class='line'> Serial.print(" phi : ");
</span><span class='line'> printFloat(phi,3);
</span><span class='line'> Serial.print(" the: ");
</span><span class='line'> printFloat(theta,3);
</span><span class='line'> Serial.print("\r\n");
</span><span class='line'>
</span><span class='line'> int minx,miny,minz,maxx,maxy,maxz;
</span><span class='line'> mma7260q.getMinValues(&minx,&miny,&minz);
</span><span class='line'> mma7260q.getMaxValues(&maxx,&maxy,&maxz);
</span><span class='line'> Serial.print("minx: ");
</span><span class='line'> Serial.print((int)minx,DEC);
</span><span class='line'> Serial.print(" miny: ");
</span><span class='line'> Serial.print((int)miny,DEC);
</span><span class='line'> Serial.print(" minz: ");
</span><span class='line'> Serial.print((int)minz,DEC);
</span><span class='line'> Serial.print("\r\n");
</span><span class='line'>
</span><span class='line'> Serial.print("maxx: ");
</span><span class='line'> Serial.print((int)maxx,DEC);
</span><span class='line'> Serial.print(" maxy: ");
</span><span class='line'> Serial.print((int)maxy,DEC);
</span><span class='line'> Serial.print(" maxz: ");
</span><span class='line'> Serial.print((int)maxz,DEC);
</span><span class='line'> Serial.print("\r\n");
</span><span class='line'>
</span><span class='line'> }
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>void printFloat(float value, int places) {
</span><span class='line'> // this is used to cast digits
</span><span class='line'> int digit;
</span><span class='line'> float tens = 0.1;
</span><span class='line'> int tenscount = 0;
</span><span class='line'> int i;
</span><span class='line'> float tempfloat = value;
</span><span class='line'>
</span><span class='line'> // if value is negative, set tempfloat to the abs value
</span><span class='line'> // make sure we round properly. this could use pow from
</span><span class='line'> //<math.h>, but doesn't seem worth the import
</span><span class='line'> // if this rounding step isn't here, the value 54.321 prints as
</span><span class='line'> //54.3209
</span><span class='line'>
</span><span class='line'> // calculate rounding term d: 0.5/pow(10,places)
</span><span class='line'> float d = 0.5;
</span><span class='line'> if (value < 0)
</span><span class='line'> d *= -1.0;
</span><span class='line'> // divide by ten for each decimal place
</span><span class='line'> for (i = 0; i < places; i++)
</span><span class='line'> d/= 10.0;
</span><span class='line'> // this small addition, combined with truncation will round our
</span><span class='line'> // values properly
</span><span class='line'> tempfloat += d;
</span><span class='line'>
</span><span class='line'> // first get value tens to be the large power of ten less than value
</span><span class='line'> // tenscount isn't necessary but it would be useful if you wanted
</span><span class='line'> // to know after this how many chars the number will take
</span><span class='line'>
</span><span class='line'> if (value < 0)
</span><span class='line'> tempfloat *= -1.0;
</span><span class='line'> while ((tens * 10.0) <= tempfloat) {
</span><span class='line'> tens *= 10.0;
</span><span class='line'> tenscount += 1;
</span><span class='line'> }
</span><span class='line'>
</span><span class='line'>
</span><span class='line'> // write out the negative if needed
</span><span class='line'> if (value < 0)
</span><span class='line'> Serial.print('-');
</span><span class='line'>
</span><span class='line'> if (tenscount == 0)
</span><span class='line'> Serial.print(0, DEC);
</span><span class='line'>
</span><span class='line'> for (i=0; i< tenscount; i++) {
</span><span class='line'> digit = (int) (tempfloat/tens);
</span><span class='line'> Serial.print(digit, DEC);
</span><span class='line'> tempfloat = tempfloat - ((float)digit * tens);
</span><span class='line'> tens /= 10.0;
</span><span class='line'> }
</span><span class='line'>
</span><span class='line'> // if no places after decimal, stop now and return
</span><span class='line'> if (places <= 0)
</span><span class='line'> return;
</span><span class='line'>
</span><span class='line'> // otherwise, write the point and continue on
</span><span class='line'> Serial.print('.');
</span><span class='line'>
</span><span class='line'> // now write out each decimal place by shifting digits one by one
</span><span class='line'> // into the ones place and writing the truncated value
</span><span class='line'> for (i = 0; i < places; i++) {
</span><span class='line'> tempfloat *= 10.0;
</span><span class='line'> digit = (int) tempfloat;
</span><span class='line'> Serial.print(digit,DEC);
</span><span class='line'> // once written, subtract off that digit
</span><span class='line'> tempfloat = tempfloat - (float) digit;
</span><span class='line'> }
</span><span class='line'>}</span>
|