hellomqttt to thingspeak mqtt and ifttt

Dependencies:   Servo MQTTPacket FP

Committer:
jasonberry
Date:
Wed May 05 14:48:01 2021 +0000
Revision:
25:ca1b1098c77f
TEST

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jasonberry 25:ca1b1098c77f 1 #include "MMA7660.h"
jasonberry 25:ca1b1098c77f 2
jasonberry 25:ca1b1098c77f 3 MMA7660::MMA7660(PinName sda, PinName scl, bool active) : _i2c(sda, scl)
jasonberry 25:ca1b1098c77f 4 {
jasonberry 25:ca1b1098c77f 5 setActive(active);
jasonberry 25:ca1b1098c77f 6 samplerate = 64;
jasonberry 25:ca1b1098c77f 7 }
jasonberry 25:ca1b1098c77f 8
jasonberry 25:ca1b1098c77f 9 //Since the MMA lacks a WHO_AM_I register, we can only check if there is a device that answers to the I2C address
jasonberry 25:ca1b1098c77f 10 bool MMA7660::testConnection( void )
jasonberry 25:ca1b1098c77f 11 {
jasonberry 25:ca1b1098c77f 12 if (_i2c.write(MMA7660_ADDRESS, NULL, 0) == 0 )
jasonberry 25:ca1b1098c77f 13 return true;
jasonberry 25:ca1b1098c77f 14 else
jasonberry 25:ca1b1098c77f 15 return false;
jasonberry 25:ca1b1098c77f 16 }
jasonberry 25:ca1b1098c77f 17
jasonberry 25:ca1b1098c77f 18 void MMA7660::setActive(bool state)
jasonberry 25:ca1b1098c77f 19 {
jasonberry 25:ca1b1098c77f 20 active = state;
jasonberry 25:ca1b1098c77f 21 char modereg = read(MMA7660_MODE_R);
jasonberry 25:ca1b1098c77f 22 modereg &= ~(1<<0);
jasonberry 25:ca1b1098c77f 23
jasonberry 25:ca1b1098c77f 24 //If it somehow was in testmode, disable that
jasonberry 25:ca1b1098c77f 25 if (modereg && (1<<2)) {
jasonberry 25:ca1b1098c77f 26 modereg &= ~(1<<2);
jasonberry 25:ca1b1098c77f 27 write(MMA7660_MODE_R, modereg);
jasonberry 25:ca1b1098c77f 28 }
jasonberry 25:ca1b1098c77f 29
jasonberry 25:ca1b1098c77f 30 modereg += state;
jasonberry 25:ca1b1098c77f 31 write(MMA7660_MODE_R, modereg);
jasonberry 25:ca1b1098c77f 32 }
jasonberry 25:ca1b1098c77f 33
jasonberry 25:ca1b1098c77f 34 void MMA7660::readData(int *data)
jasonberry 25:ca1b1098c77f 35 {
jasonberry 25:ca1b1098c77f 36 bool active_old = active;
jasonberry 25:ca1b1098c77f 37 if (!active) {
jasonberry 25:ca1b1098c77f 38 setActive(true);
jasonberry 25:ca1b1098c77f 39 wait(0.012 + 1/samplerate); //Wait until new sample is ready, my experience is that 1/samplerate isnt needed, but datasheet says so
jasonberry 25:ca1b1098c77f 40 }
jasonberry 25:ca1b1098c77f 41
jasonberry 25:ca1b1098c77f 42 char temp[3];
jasonberry 25:ca1b1098c77f 43 bool alert;
jasonberry 25:ca1b1098c77f 44
jasonberry 25:ca1b1098c77f 45 do {
jasonberry 25:ca1b1098c77f 46 alert = false;
jasonberry 25:ca1b1098c77f 47 read(MMA7660_XOUT_R, temp, 3);
jasonberry 25:ca1b1098c77f 48 for (int i = 0; i<3; i++) {
jasonberry 25:ca1b1098c77f 49 if (temp[i] > 63)
jasonberry 25:ca1b1098c77f 50 alert = true;
jasonberry 25:ca1b1098c77f 51 if (temp[i] > 31)
jasonberry 25:ca1b1098c77f 52 temp[i] += 128+64;
jasonberry 25:ca1b1098c77f 53 data[i] = (signed char)temp[i];
jasonberry 25:ca1b1098c77f 54 }
jasonberry 25:ca1b1098c77f 55 } while (alert);
jasonberry 25:ca1b1098c77f 56
jasonberry 25:ca1b1098c77f 57 if (!active_old)
jasonberry 25:ca1b1098c77f 58 setActive(false);
jasonberry 25:ca1b1098c77f 59 }
jasonberry 25:ca1b1098c77f 60
jasonberry 25:ca1b1098c77f 61
jasonberry 25:ca1b1098c77f 62 void MMA7660::readData(float *data)
jasonberry 25:ca1b1098c77f 63 {
jasonberry 25:ca1b1098c77f 64 int intdata[3];
jasonberry 25:ca1b1098c77f 65 readData(intdata);
jasonberry 25:ca1b1098c77f 66 for (int i = 0; i<3; i++)
jasonberry 25:ca1b1098c77f 67 data[i] = intdata[i]/MMA7660_SENSITIVITY;
jasonberry 25:ca1b1098c77f 68 }
jasonberry 25:ca1b1098c77f 69
jasonberry 25:ca1b1098c77f 70 float MMA7660::x( void )
jasonberry 25:ca1b1098c77f 71 {
jasonberry 25:ca1b1098c77f 72 return getSingle(0);
jasonberry 25:ca1b1098c77f 73 }
jasonberry 25:ca1b1098c77f 74
jasonberry 25:ca1b1098c77f 75 float MMA7660::y( void )
jasonberry 25:ca1b1098c77f 76 {
jasonberry 25:ca1b1098c77f 77 return getSingle(1);
jasonberry 25:ca1b1098c77f 78 }
jasonberry 25:ca1b1098c77f 79
jasonberry 25:ca1b1098c77f 80 float MMA7660::z( void )
jasonberry 25:ca1b1098c77f 81 {
jasonberry 25:ca1b1098c77f 82 return getSingle(2);
jasonberry 25:ca1b1098c77f 83 }
jasonberry 25:ca1b1098c77f 84
jasonberry 25:ca1b1098c77f 85
jasonberry 25:ca1b1098c77f 86 void MMA7660::setSampleRate(int samplerate)
jasonberry 25:ca1b1098c77f 87 {
jasonberry 25:ca1b1098c77f 88 bool active_old = active;
jasonberry 25:ca1b1098c77f 89 setActive(false); //Not allowed to be active to change anything
jasonberry 25:ca1b1098c77f 90 int rates[] = {120, 64, 32, 16, 8, 4, 2, 1}; //Alowed samplerates (and their number in array is also number required for MMA)
jasonberry 25:ca1b1098c77f 91 int sampleLoc = 0, sampleError = 10000, temp;
jasonberry 25:ca1b1098c77f 92 for (int i = 0; i<8; i++) {
jasonberry 25:ca1b1098c77f 93 temp = abs( rates[i] - samplerate );
jasonberry 25:ca1b1098c77f 94 if (temp<sampleError) {
jasonberry 25:ca1b1098c77f 95 sampleLoc = i;
jasonberry 25:ca1b1098c77f 96 sampleError=temp;
jasonberry 25:ca1b1098c77f 97 }
jasonberry 25:ca1b1098c77f 98 }
jasonberry 25:ca1b1098c77f 99
jasonberry 25:ca1b1098c77f 100 //Update the samplerate reg
jasonberry 25:ca1b1098c77f 101 temp = read(MMA7660_SR_R);
jasonberry 25:ca1b1098c77f 102 temp &= ~0x07; //Awake sample rate are lowest 3 bit
jasonberry 25:ca1b1098c77f 103 temp |= sampleLoc;
jasonberry 25:ca1b1098c77f 104 write(MMA7660_SR_R, temp);
jasonberry 25:ca1b1098c77f 105 this->samplerate = rates[sampleLoc];
jasonberry 25:ca1b1098c77f 106 setActive(active_old); //Restore previous active state
jasonberry 25:ca1b1098c77f 107 }
jasonberry 25:ca1b1098c77f 108
jasonberry 25:ca1b1098c77f 109
jasonberry 25:ca1b1098c77f 110 MMA7660::Orientation MMA7660::getSide( void )
jasonberry 25:ca1b1098c77f 111 {
jasonberry 25:ca1b1098c77f 112 char tiltreg = read(MMA7660_TILT_R);
jasonberry 25:ca1b1098c77f 113 //We care about 2 LSBs
jasonberry 25:ca1b1098c77f 114 tiltreg &= 0x03;
jasonberry 25:ca1b1098c77f 115 if (tiltreg == 0x01)
jasonberry 25:ca1b1098c77f 116 return MMA7660::Front;
jasonberry 25:ca1b1098c77f 117 if (tiltreg == 0x02)
jasonberry 25:ca1b1098c77f 118 return MMA7660::Back;
jasonberry 25:ca1b1098c77f 119 return MMA7660::Unknown;
jasonberry 25:ca1b1098c77f 120 }
jasonberry 25:ca1b1098c77f 121
jasonberry 25:ca1b1098c77f 122 MMA7660::Orientation MMA7660::getOrientation( void )
jasonberry 25:ca1b1098c77f 123 {
jasonberry 25:ca1b1098c77f 124 char tiltreg = read(MMA7660_TILT_R);
jasonberry 25:ca1b1098c77f 125
jasonberry 25:ca1b1098c77f 126 //We care about bit 2, 3 and 4 (counting from zero)
jasonberry 25:ca1b1098c77f 127 tiltreg &= 0x07<<2;
jasonberry 25:ca1b1098c77f 128 tiltreg >>= 2;
jasonberry 25:ca1b1098c77f 129 if (tiltreg == 0x01)
jasonberry 25:ca1b1098c77f 130 return MMA7660::Left;
jasonberry 25:ca1b1098c77f 131 if (tiltreg == 0x02)
jasonberry 25:ca1b1098c77f 132 return MMA7660::Right;
jasonberry 25:ca1b1098c77f 133 if (tiltreg == 0x05)
jasonberry 25:ca1b1098c77f 134 return MMA7660::Down;
jasonberry 25:ca1b1098c77f 135 if (tiltreg == 0x06)
jasonberry 25:ca1b1098c77f 136 return MMA7660::Up;
jasonberry 25:ca1b1098c77f 137 return MMA7660::Unknown;
jasonberry 25:ca1b1098c77f 138 }
jasonberry 25:ca1b1098c77f 139
jasonberry 25:ca1b1098c77f 140
jasonberry 25:ca1b1098c77f 141
jasonberry 25:ca1b1098c77f 142 //////////////////////////////////////////////
jasonberry 25:ca1b1098c77f 143 ///////////////PRIVATE////////////////////////
jasonberry 25:ca1b1098c77f 144 //////////////////////////////////////////////
jasonberry 25:ca1b1098c77f 145
jasonberry 25:ca1b1098c77f 146
jasonberry 25:ca1b1098c77f 147 void MMA7660::write(char address, char data)
jasonberry 25:ca1b1098c77f 148 {
jasonberry 25:ca1b1098c77f 149 char temp[2];
jasonberry 25:ca1b1098c77f 150 temp[0]=address;
jasonberry 25:ca1b1098c77f 151 temp[1]=data;
jasonberry 25:ca1b1098c77f 152
jasonberry 25:ca1b1098c77f 153 _i2c.write(MMA7660_ADDRESS, temp, 2);
jasonberry 25:ca1b1098c77f 154 }
jasonberry 25:ca1b1098c77f 155
jasonberry 25:ca1b1098c77f 156 char MMA7660::read(char address)
jasonberry 25:ca1b1098c77f 157 {
jasonberry 25:ca1b1098c77f 158 char retval;
jasonberry 25:ca1b1098c77f 159 _i2c.write(MMA7660_ADDRESS, &address, 1, true);
jasonberry 25:ca1b1098c77f 160 _i2c.read(MMA7660_ADDRESS, &retval, 1);
jasonberry 25:ca1b1098c77f 161 return retval;
jasonberry 25:ca1b1098c77f 162 }
jasonberry 25:ca1b1098c77f 163
jasonberry 25:ca1b1098c77f 164 void MMA7660::read(char address, char *data, int length)
jasonberry 25:ca1b1098c77f 165 {
jasonberry 25:ca1b1098c77f 166 _i2c.write(MMA7660_ADDRESS, &address, 1, true);
jasonberry 25:ca1b1098c77f 167 _i2c.read(MMA7660_ADDRESS, data, length);
jasonberry 25:ca1b1098c77f 168 }
jasonberry 25:ca1b1098c77f 169
jasonberry 25:ca1b1098c77f 170 float MMA7660::getSingle( int number )
jasonberry 25:ca1b1098c77f 171 {
jasonberry 25:ca1b1098c77f 172 bool active_old = active;
jasonberry 25:ca1b1098c77f 173 if (!active) {
jasonberry 25:ca1b1098c77f 174 setActive(true);
jasonberry 25:ca1b1098c77f 175 wait(0.012 + 1/samplerate); //Wait until new sample is ready
jasonberry 25:ca1b1098c77f 176 }
jasonberry 25:ca1b1098c77f 177
jasonberry 25:ca1b1098c77f 178 signed char temp;
jasonberry 25:ca1b1098c77f 179 bool alert;
jasonberry 25:ca1b1098c77f 180
jasonberry 25:ca1b1098c77f 181 do {
jasonberry 25:ca1b1098c77f 182 alert = false;
jasonberry 25:ca1b1098c77f 183 temp = read(MMA7660_XOUT_R + number);
jasonberry 25:ca1b1098c77f 184 if (temp > 63)
jasonberry 25:ca1b1098c77f 185 alert = true;
jasonberry 25:ca1b1098c77f 186 if (temp > 31)
jasonberry 25:ca1b1098c77f 187 temp += 128+64;
jasonberry 25:ca1b1098c77f 188 } while (alert);
jasonberry 25:ca1b1098c77f 189
jasonberry 25:ca1b1098c77f 190 if (!active_old)
jasonberry 25:ca1b1098c77f 191 setActive(false);
jasonberry 25:ca1b1098c77f 192
jasonberry 25:ca1b1098c77f 193 return temp / MMA7660_SENSITIVITY;
jasonberry 25:ca1b1098c77f 194 }