21400695_HW3_DHT22_TCP

Dependencies:   SDFileSystem

Fork of _HW3_DHT_TCP by JamEon Jeong

Committer:
Proverbs
Date:
Tue Jan 02 11:43:43 2018 +0000
Revision:
0:e548610ed175
HW2_DHT_TCP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Proverbs 0:e548610ed175 1 /******************************************************************************
Proverbs 0:e548610ed175 2 * Includes
Proverbs 0:e548610ed175 3 *****************************************************************************/
Proverbs 0:e548610ed175 4
Proverbs 0:e548610ed175 5 #include "mbed.h"
Proverbs 0:e548610ed175 6 #include "mbed_debug.h"
Proverbs 0:e548610ed175 7
Proverbs 0:e548610ed175 8 #include "MMA7455.h"
Proverbs 0:e548610ed175 9
Proverbs 0:e548610ed175 10 /******************************************************************************
Proverbs 0:e548610ed175 11 * Defines and typedefs
Proverbs 0:e548610ed175 12 *****************************************************************************/
Proverbs 0:e548610ed175 13
Proverbs 0:e548610ed175 14 #define MMA7455_I2C_ADDR (0x1D << 1)
Proverbs 0:e548610ed175 15
Proverbs 0:e548610ed175 16 #define MMA7455_ADDR_XOUTL 0x00
Proverbs 0:e548610ed175 17 #define MMA7455_ADDR_XOUTH 0x01
Proverbs 0:e548610ed175 18 #define MMA7455_ADDR_YOUTL 0x02
Proverbs 0:e548610ed175 19 #define MMA7455_ADDR_YOUTH 0x03
Proverbs 0:e548610ed175 20 #define MMA7455_ADDR_ZOUTL 0x04
Proverbs 0:e548610ed175 21 #define MMA7455_ADDR_ZOUTH 0x05
Proverbs 0:e548610ed175 22 #define MMA7455_ADDR_XOUT8 0x06
Proverbs 0:e548610ed175 23 #define MMA7455_ADDR_YOUT8 0x07
Proverbs 0:e548610ed175 24 #define MMA7455_ADDR_ZOUT8 0x08
Proverbs 0:e548610ed175 25 #define MMA7455_ADDR_STATUS 0x09
Proverbs 0:e548610ed175 26 #define MMA7455_ADDR_DETSRC 0x0A
Proverbs 0:e548610ed175 27 #define MMA7455_ADDR_TOUT 0x0B
Proverbs 0:e548610ed175 28 #define MMA7455_ADDR_I2CAD 0x0D
Proverbs 0:e548610ed175 29 #define MMA7455_ADDR_USRINF 0x0E
Proverbs 0:e548610ed175 30 #define MMA7455_ADDR_WHOAMI 0x0F
Proverbs 0:e548610ed175 31 #define MMA7455_ADDR_XOFFL 0x10
Proverbs 0:e548610ed175 32 #define MMA7455_ADDR_XOFFH 0x11
Proverbs 0:e548610ed175 33 #define MMA7455_ADDR_YOFFL 0x12
Proverbs 0:e548610ed175 34 #define MMA7455_ADDR_YOFFH 0x13
Proverbs 0:e548610ed175 35 #define MMA7455_ADDR_ZOFFL 0x14
Proverbs 0:e548610ed175 36 #define MMA7455_ADDR_ZOFFH 0x15
Proverbs 0:e548610ed175 37 #define MMA7455_ADDR_MCTL 0x16
Proverbs 0:e548610ed175 38 #define MMA7455_ADDR_INTRST 0x17
Proverbs 0:e548610ed175 39 #define MMA7455_ADDR_CTL1 0x18
Proverbs 0:e548610ed175 40 #define MMA7455_ADDR_CTL2 0x19
Proverbs 0:e548610ed175 41 #define MMA7455_ADDR_LDTH 0x1A
Proverbs 0:e548610ed175 42 #define MMA7455_ADDR_PDTH 0x1B
Proverbs 0:e548610ed175 43 #define MMA7455_ADDR_PW 0x1C
Proverbs 0:e548610ed175 44 #define MMA7455_ADDR_LT 0x1D
Proverbs 0:e548610ed175 45 #define MMA7455_ADDR_TW 0x1E
Proverbs 0:e548610ed175 46
Proverbs 0:e548610ed175 47 #define MMA7455_MCTL_MODE(m) ((m) << 0)
Proverbs 0:e548610ed175 48 #define MMA7455_MCTL_GLVL(g) ((g) << 2)
Proverbs 0:e548610ed175 49
Proverbs 0:e548610ed175 50 #define MMA7455_STATUS_DRDY (1 << 0)
Proverbs 0:e548610ed175 51 #define MMA7455_STATUS_DOVR (1 << 1)
Proverbs 0:e548610ed175 52 #define MMA7455_STATUS_PERR (1 << 2)
Proverbs 0:e548610ed175 53
Proverbs 0:e548610ed175 54
Proverbs 0:e548610ed175 55 MMA7455::MMA7455(PinName sda, PinName scl) : _i2c(sda, scl)
Proverbs 0:e548610ed175 56 {
Proverbs 0:e548610ed175 57 _mode = ModeStandby;
Proverbs 0:e548610ed175 58 _range = Range_8g;
Proverbs 0:e548610ed175 59
Proverbs 0:e548610ed175 60 _xOff = 0;
Proverbs 0:e548610ed175 61 _yOff = 0;
Proverbs 0:e548610ed175 62 _zOff = 0;
Proverbs 0:e548610ed175 63 }
Proverbs 0:e548610ed175 64
Proverbs 0:e548610ed175 65 bool MMA7455::setMode(Mode mode) {
Proverbs 0:e548610ed175 66 bool result = false;
Proverbs 0:e548610ed175 67 int mCtrl = 0;
Proverbs 0:e548610ed175 68
Proverbs 0:e548610ed175 69 do {
Proverbs 0:e548610ed175 70 mCtrl = getModeControl();
Proverbs 0:e548610ed175 71 if (mCtrl < 0) break;
Proverbs 0:e548610ed175 72
Proverbs 0:e548610ed175 73 mCtrl &= ~(0x03 << 0);
Proverbs 0:e548610ed175 74 mCtrl |= MMA7455_MCTL_MODE(mode);
Proverbs 0:e548610ed175 75
Proverbs 0:e548610ed175 76 if (setModeControl((uint8_t)mCtrl) < 0) {
Proverbs 0:e548610ed175 77 break;
Proverbs 0:e548610ed175 78 }
Proverbs 0:e548610ed175 79
Proverbs 0:e548610ed175 80 _mode = mode;
Proverbs 0:e548610ed175 81 result = true;
Proverbs 0:e548610ed175 82 } while(0);
Proverbs 0:e548610ed175 83
Proverbs 0:e548610ed175 84
Proverbs 0:e548610ed175 85
Proverbs 0:e548610ed175 86 return result;
Proverbs 0:e548610ed175 87 }
Proverbs 0:e548610ed175 88
Proverbs 0:e548610ed175 89 bool MMA7455::setRange(Range range) {
Proverbs 0:e548610ed175 90 bool result = false;
Proverbs 0:e548610ed175 91 int mCtrl = 0;
Proverbs 0:e548610ed175 92
Proverbs 0:e548610ed175 93 do {
Proverbs 0:e548610ed175 94 mCtrl = getModeControl();
Proverbs 0:e548610ed175 95 if (mCtrl < 0) break;
Proverbs 0:e548610ed175 96
Proverbs 0:e548610ed175 97 mCtrl &= ~(0x03 << 2);
Proverbs 0:e548610ed175 98 mCtrl |= MMA7455_MCTL_GLVL(range);
Proverbs 0:e548610ed175 99
Proverbs 0:e548610ed175 100 if (setModeControl((uint8_t)mCtrl) < 0) {
Proverbs 0:e548610ed175 101 break;
Proverbs 0:e548610ed175 102 }
Proverbs 0:e548610ed175 103
Proverbs 0:e548610ed175 104 _range = range;
Proverbs 0:e548610ed175 105 result = true;
Proverbs 0:e548610ed175 106 } while(0);
Proverbs 0:e548610ed175 107
Proverbs 0:e548610ed175 108
Proverbs 0:e548610ed175 109
Proverbs 0:e548610ed175 110 return result;
Proverbs 0:e548610ed175 111
Proverbs 0:e548610ed175 112 }
Proverbs 0:e548610ed175 113
Proverbs 0:e548610ed175 114 bool MMA7455::read(int32_t& x, int32_t& y, int32_t& z) {
Proverbs 0:e548610ed175 115 bool result = false;
Proverbs 0:e548610ed175 116
Proverbs 0:e548610ed175 117
Proverbs 0:e548610ed175 118 // nothing to read in standby mode
Proverbs 0:e548610ed175 119 if (_mode == ModeStandby) return false;
Proverbs 0:e548610ed175 120
Proverbs 0:e548610ed175 121 // wait for ready flag
Proverbs 0:e548610ed175 122 int status = 0;
Proverbs 0:e548610ed175 123 do {
Proverbs 0:e548610ed175 124 status = getStatus();
Proverbs 0:e548610ed175 125 } while (status >= 0 && (status & MMA7455_STATUS_DRDY) == 0);
Proverbs 0:e548610ed175 126
Proverbs 0:e548610ed175 127
Proverbs 0:e548610ed175 128 do {
Proverbs 0:e548610ed175 129 if (status < 0) break;
Proverbs 0:e548610ed175 130
Proverbs 0:e548610ed175 131
Proverbs 0:e548610ed175 132 char buf[6];
Proverbs 0:e548610ed175 133 buf[0] = MMA7455_ADDR_XOUTL;
Proverbs 0:e548610ed175 134 if (_i2c.write(MMA7455_I2C_ADDR, buf, 1) != 0) break;
Proverbs 0:e548610ed175 135 if (_i2c.read(MMA7455_I2C_ADDR, buf, 6) != 0) break;
Proverbs 0:e548610ed175 136
Proverbs 0:e548610ed175 137 // check if second bit is set in high byte -> negative value
Proverbs 0:e548610ed175 138 // expand negative value to full byte
Proverbs 0:e548610ed175 139 if (buf[1] & 0x02) buf[1] |= 0xFC;
Proverbs 0:e548610ed175 140 if (buf[3] & 0x02) buf[3] |= 0xFC;
Proverbs 0:e548610ed175 141 if (buf[5] & 0x02) buf[5] |= 0xFC;
Proverbs 0:e548610ed175 142
Proverbs 0:e548610ed175 143 x = (int16_t)((buf[1] << 8) | buf[0]) + _xOff;
Proverbs 0:e548610ed175 144 y = (int16_t)((buf[3] << 8) | buf[2]) + _yOff;
Proverbs 0:e548610ed175 145 z = (int16_t)((buf[5] << 8) | buf[4]) + _zOff;
Proverbs 0:e548610ed175 146
Proverbs 0:e548610ed175 147
Proverbs 0:e548610ed175 148 result = true;
Proverbs 0:e548610ed175 149
Proverbs 0:e548610ed175 150 } while(0);
Proverbs 0:e548610ed175 151
Proverbs 0:e548610ed175 152
Proverbs 0:e548610ed175 153 return result;
Proverbs 0:e548610ed175 154 }
Proverbs 0:e548610ed175 155
Proverbs 0:e548610ed175 156 bool MMA7455::calibrate() {
Proverbs 0:e548610ed175 157 bool result = false;
Proverbs 0:e548610ed175 158 bool failed = false;
Proverbs 0:e548610ed175 159
Proverbs 0:e548610ed175 160 int32_t x = 0;
Proverbs 0:e548610ed175 161 int32_t y = 0;
Proverbs 0:e548610ed175 162 int32_t z = 0;
Proverbs 0:e548610ed175 163
Proverbs 0:e548610ed175 164 int32_t xr = 0;
Proverbs 0:e548610ed175 165 int32_t yr = 0;
Proverbs 0:e548610ed175 166 int32_t zr = 0;
Proverbs 0:e548610ed175 167
Proverbs 0:e548610ed175 168 int xOff = 0;
Proverbs 0:e548610ed175 169 int yOff = 0;
Proverbs 0:e548610ed175 170 int zOff = 16;
Proverbs 0:e548610ed175 171 if (_range == Range_2g) {
Proverbs 0:e548610ed175 172 zOff = 64;
Proverbs 0:e548610ed175 173 }
Proverbs 0:e548610ed175 174 if (_range == Range_4g) {
Proverbs 0:e548610ed175 175 zOff = 32;
Proverbs 0:e548610ed175 176 }
Proverbs 0:e548610ed175 177
Proverbs 0:e548610ed175 178 do {
Proverbs 0:e548610ed175 179
Proverbs 0:e548610ed175 180 // get an average of 6 values
Proverbs 0:e548610ed175 181 for (int i = 0; i < 6; i++) {
Proverbs 0:e548610ed175 182 if (!read(xr, yr, zr)) {
Proverbs 0:e548610ed175 183 failed = true;
Proverbs 0:e548610ed175 184 break;
Proverbs 0:e548610ed175 185 }
Proverbs 0:e548610ed175 186 x += xr;
Proverbs 0:e548610ed175 187 y += yr;
Proverbs 0:e548610ed175 188 z += zr;
Proverbs 0:e548610ed175 189
Proverbs 0:e548610ed175 190 wait_ms(100);
Proverbs 0:e548610ed175 191 }
Proverbs 0:e548610ed175 192
Proverbs 0:e548610ed175 193 if (failed) break;
Proverbs 0:e548610ed175 194 x /= 6;
Proverbs 0:e548610ed175 195 y /= 6;
Proverbs 0:e548610ed175 196 z /= 6;
Proverbs 0:e548610ed175 197
Proverbs 0:e548610ed175 198 xOff -= x;
Proverbs 0:e548610ed175 199 yOff -= y;
Proverbs 0:e548610ed175 200 zOff -= z;
Proverbs 0:e548610ed175 201
Proverbs 0:e548610ed175 202 /*
Proverbs 0:e548610ed175 203 * For some reason we have not got correct/reliable calibration
Proverbs 0:e548610ed175 204 * by using the offset drift registers. Instead we are
Proverbs 0:e548610ed175 205 * calculating the offsets and store them in member variables.
Proverbs 0:e548610ed175 206 *
Proverbs 0:e548610ed175 207 * These member variables are then used in the read() method
Proverbs 0:e548610ed175 208 */
Proverbs 0:e548610ed175 209
Proverbs 0:e548610ed175 210 _xOff = xOff;
Proverbs 0:e548610ed175 211 _yOff = yOff;
Proverbs 0:e548610ed175 212 _zOff = zOff;
Proverbs 0:e548610ed175 213
Proverbs 0:e548610ed175 214
Proverbs 0:e548610ed175 215 result = true;
Proverbs 0:e548610ed175 216
Proverbs 0:e548610ed175 217 } while (0);
Proverbs 0:e548610ed175 218
Proverbs 0:e548610ed175 219
Proverbs 0:e548610ed175 220
Proverbs 0:e548610ed175 221 return result;
Proverbs 0:e548610ed175 222 }
Proverbs 0:e548610ed175 223
Proverbs 0:e548610ed175 224 bool MMA7455::setCalibrationOffsets(int32_t xOff, int32_t yOff, int32_t zOff) {
Proverbs 0:e548610ed175 225 _xOff = xOff;
Proverbs 0:e548610ed175 226 _yOff = yOff;
Proverbs 0:e548610ed175 227 _zOff = zOff;
Proverbs 0:e548610ed175 228
Proverbs 0:e548610ed175 229 return true;
Proverbs 0:e548610ed175 230 }
Proverbs 0:e548610ed175 231
Proverbs 0:e548610ed175 232 bool MMA7455::getCalibrationOffsets(int32_t& xOff, int32_t& yOff, int32_t& zOff) {
Proverbs 0:e548610ed175 233 xOff = _xOff;
Proverbs 0:e548610ed175 234 yOff = _yOff;
Proverbs 0:e548610ed175 235 zOff = _zOff;
Proverbs 0:e548610ed175 236
Proverbs 0:e548610ed175 237 return true;
Proverbs 0:e548610ed175 238 }
Proverbs 0:e548610ed175 239
Proverbs 0:e548610ed175 240 int MMA7455::getStatus() {
Proverbs 0:e548610ed175 241 int result = -1;
Proverbs 0:e548610ed175 242 char data[1];
Proverbs 0:e548610ed175 243
Proverbs 0:e548610ed175 244 do {
Proverbs 0:e548610ed175 245 data[0] = MMA7455_ADDR_STATUS;
Proverbs 0:e548610ed175 246 if (_i2c.write(MMA7455_I2C_ADDR, data, 1) != 0) break;
Proverbs 0:e548610ed175 247
Proverbs 0:e548610ed175 248 if (_i2c.read(MMA7455_I2C_ADDR, data, 1) != 0) break;
Proverbs 0:e548610ed175 249
Proverbs 0:e548610ed175 250 result = data[0];
Proverbs 0:e548610ed175 251
Proverbs 0:e548610ed175 252 } while (0);
Proverbs 0:e548610ed175 253
Proverbs 0:e548610ed175 254
Proverbs 0:e548610ed175 255
Proverbs 0:e548610ed175 256 return result;
Proverbs 0:e548610ed175 257 }
Proverbs 0:e548610ed175 258
Proverbs 0:e548610ed175 259 int MMA7455::getModeControl() {
Proverbs 0:e548610ed175 260
Proverbs 0:e548610ed175 261 int result = -1;
Proverbs 0:e548610ed175 262 char data[1];
Proverbs 0:e548610ed175 263
Proverbs 0:e548610ed175 264 do {
Proverbs 0:e548610ed175 265 data[0] = MMA7455_ADDR_MCTL;
Proverbs 0:e548610ed175 266 if (_i2c.write(MMA7455_I2C_ADDR, data, 1) != 0) break;
Proverbs 0:e548610ed175 267
Proverbs 0:e548610ed175 268 if (_i2c.read(MMA7455_I2C_ADDR, data, 1) != 0) break;
Proverbs 0:e548610ed175 269
Proverbs 0:e548610ed175 270 result = data[0];
Proverbs 0:e548610ed175 271
Proverbs 0:e548610ed175 272 } while (0);
Proverbs 0:e548610ed175 273
Proverbs 0:e548610ed175 274
Proverbs 0:e548610ed175 275
Proverbs 0:e548610ed175 276 return result;
Proverbs 0:e548610ed175 277 }
Proverbs 0:e548610ed175 278
Proverbs 0:e548610ed175 279 int MMA7455::setModeControl(uint8_t mctl) {
Proverbs 0:e548610ed175 280 int result = -1;
Proverbs 0:e548610ed175 281 char data[2];
Proverbs 0:e548610ed175 282
Proverbs 0:e548610ed175 283 do {
Proverbs 0:e548610ed175 284 data[0] = MMA7455_ADDR_MCTL;
Proverbs 0:e548610ed175 285 data[1] = (char)mctl;
Proverbs 0:e548610ed175 286 if (_i2c.write(MMA7455_I2C_ADDR, data, 2) != 0) break;
Proverbs 0:e548610ed175 287
Proverbs 0:e548610ed175 288 result = 0;
Proverbs 0:e548610ed175 289
Proverbs 0:e548610ed175 290 } while (0);
Proverbs 0:e548610ed175 291
Proverbs 0:e548610ed175 292
Proverbs 0:e548610ed175 293
Proverbs 0:e548610ed175 294 return result;
Proverbs 0:e548610ed175 295 }