A safe using the mbed, dc motor, solenoid, and more!

Dependencies:   4DGL-uLCD-SE DebounceIn Motordriver PinDetect SDFileSystem mbed-rtos mbed

Committer:
adamlawrence
Date:
Fri Apr 29 20:01:29 2016 +0000
Revision:
0:6b5c0ae5acc6
initial commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adamlawrence 0:6b5c0ae5acc6 1 /*
adamlawrence 0:6b5c0ae5acc6 2 Copyright (c) 2011 Anthony Buckton (abuckton [at] blackink [dot} net {dot} au)
adamlawrence 0:6b5c0ae5acc6 3
adamlawrence 0:6b5c0ae5acc6 4 Permission is hereby granted, free of charge, to any person obtaining a copy
adamlawrence 0:6b5c0ae5acc6 5 of this software and associated documentation files (the "Software"), to deal
adamlawrence 0:6b5c0ae5acc6 6 in the Software without restriction, including without limitation the rights
adamlawrence 0:6b5c0ae5acc6 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
adamlawrence 0:6b5c0ae5acc6 8 copies of the Software, and to permit persons to whom the Software is
adamlawrence 0:6b5c0ae5acc6 9 furnished to do so, subject to the following conditions:
adamlawrence 0:6b5c0ae5acc6 10
adamlawrence 0:6b5c0ae5acc6 11 The above copyright notice and this permission notice shall be included in
adamlawrence 0:6b5c0ae5acc6 12 all copies or substantial portions of the Software.
adamlawrence 0:6b5c0ae5acc6 13
adamlawrence 0:6b5c0ae5acc6 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
adamlawrence 0:6b5c0ae5acc6 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
adamlawrence 0:6b5c0ae5acc6 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
adamlawrence 0:6b5c0ae5acc6 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
adamlawrence 0:6b5c0ae5acc6 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
adamlawrence 0:6b5c0ae5acc6 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
adamlawrence 0:6b5c0ae5acc6 20 THE SOFTWARE.
adamlawrence 0:6b5c0ae5acc6 21 */
adamlawrence 0:6b5c0ae5acc6 22
adamlawrence 0:6b5c0ae5acc6 23 #include <mbed.h>
adamlawrence 0:6b5c0ae5acc6 24 #include <sstream>
adamlawrence 0:6b5c0ae5acc6 25 #include <string>
adamlawrence 0:6b5c0ae5acc6 26 #include <list>
adamlawrence 0:6b5c0ae5acc6 27
adamlawrence 0:6b5c0ae5acc6 28 #include <mpr121.h>
adamlawrence 0:6b5c0ae5acc6 29
adamlawrence 0:6b5c0ae5acc6 30 Mpr121::Mpr121(I2C *i2c, Address i2cAddress)
adamlawrence 0:6b5c0ae5acc6 31 {
adamlawrence 0:6b5c0ae5acc6 32 this->i2c = i2c;
adamlawrence 0:6b5c0ae5acc6 33
adamlawrence 0:6b5c0ae5acc6 34 address = i2cAddress;
adamlawrence 0:6b5c0ae5acc6 35
adamlawrence 0:6b5c0ae5acc6 36 // Configure the MPR121 settings to default
adamlawrence 0:6b5c0ae5acc6 37 this->configureSettings();
adamlawrence 0:6b5c0ae5acc6 38 }
adamlawrence 0:6b5c0ae5acc6 39
adamlawrence 0:6b5c0ae5acc6 40
adamlawrence 0:6b5c0ae5acc6 41 void Mpr121::configureSettings()
adamlawrence 0:6b5c0ae5acc6 42 {
adamlawrence 0:6b5c0ae5acc6 43 // Put the MPR into setup mode
adamlawrence 0:6b5c0ae5acc6 44 this->write(ELE_CFG,0x00);
adamlawrence 0:6b5c0ae5acc6 45
adamlawrence 0:6b5c0ae5acc6 46 // Electrode filters for when data is > baseline
adamlawrence 0:6b5c0ae5acc6 47 unsigned char gtBaseline[] = {
adamlawrence 0:6b5c0ae5acc6 48 0x01, //MHD_R
adamlawrence 0:6b5c0ae5acc6 49 0x01, //NHD_R
adamlawrence 0:6b5c0ae5acc6 50 0x00, //NCL_R
adamlawrence 0:6b5c0ae5acc6 51 0x00 //FDL_R
adamlawrence 0:6b5c0ae5acc6 52 };
adamlawrence 0:6b5c0ae5acc6 53
adamlawrence 0:6b5c0ae5acc6 54 writeMany(MHD_R,gtBaseline,4);
adamlawrence 0:6b5c0ae5acc6 55
adamlawrence 0:6b5c0ae5acc6 56 // Electrode filters for when data is < baseline
adamlawrence 0:6b5c0ae5acc6 57 unsigned char ltBaseline[] = {
adamlawrence 0:6b5c0ae5acc6 58 0x01, //MHD_F
adamlawrence 0:6b5c0ae5acc6 59 0x01, //NHD_F
adamlawrence 0:6b5c0ae5acc6 60 0xFF, //NCL_F
adamlawrence 0:6b5c0ae5acc6 61 0x02 //FDL_F
adamlawrence 0:6b5c0ae5acc6 62 };
adamlawrence 0:6b5c0ae5acc6 63
adamlawrence 0:6b5c0ae5acc6 64 writeMany(MHD_F,ltBaseline,4);
adamlawrence 0:6b5c0ae5acc6 65
adamlawrence 0:6b5c0ae5acc6 66 // Electrode touch and release thresholds
adamlawrence 0:6b5c0ae5acc6 67 unsigned char electrodeThresholds[] = {
adamlawrence 0:6b5c0ae5acc6 68 E_THR_T, // Touch Threshhold
adamlawrence 0:6b5c0ae5acc6 69 E_THR_R // Release Threshold
adamlawrence 0:6b5c0ae5acc6 70 };
adamlawrence 0:6b5c0ae5acc6 71
adamlawrence 0:6b5c0ae5acc6 72 for(int i=0; i<12; i++){
adamlawrence 0:6b5c0ae5acc6 73 int result = writeMany((ELE0_T+(i*2)),electrodeThresholds,2);
adamlawrence 0:6b5c0ae5acc6 74 }
adamlawrence 0:6b5c0ae5acc6 75
adamlawrence 0:6b5c0ae5acc6 76 // Proximity Settings
adamlawrence 0:6b5c0ae5acc6 77 unsigned char proximitySettings[] = {
adamlawrence 0:6b5c0ae5acc6 78 0xff, //MHD_Prox_R
adamlawrence 0:6b5c0ae5acc6 79 0xff, //NHD_Prox_R
adamlawrence 0:6b5c0ae5acc6 80 0x00, //NCL_Prox_R
adamlawrence 0:6b5c0ae5acc6 81 0x00, //FDL_Prox_R
adamlawrence 0:6b5c0ae5acc6 82 0x01, //MHD_Prox_F
adamlawrence 0:6b5c0ae5acc6 83 0x01, //NHD_Prox_F
adamlawrence 0:6b5c0ae5acc6 84 0xFF, //NCL_Prox_F
adamlawrence 0:6b5c0ae5acc6 85 0xff, //FDL_Prox_F
adamlawrence 0:6b5c0ae5acc6 86 0x00, //NHD_Prox_T
adamlawrence 0:6b5c0ae5acc6 87 0x00, //NCL_Prox_T
adamlawrence 0:6b5c0ae5acc6 88 0x00 //NFD_Prox_T
adamlawrence 0:6b5c0ae5acc6 89 };
adamlawrence 0:6b5c0ae5acc6 90 writeMany(MHDPROXR,proximitySettings,11);
adamlawrence 0:6b5c0ae5acc6 91
adamlawrence 0:6b5c0ae5acc6 92 unsigned char proxThresh[] = {
adamlawrence 0:6b5c0ae5acc6 93 PROX_THR_T, // Touch Threshold
adamlawrence 0:6b5c0ae5acc6 94 PROX_THR_R // Release Threshold
adamlawrence 0:6b5c0ae5acc6 95 };
adamlawrence 0:6b5c0ae5acc6 96 writeMany(EPROXTTH,proxThresh,2);
adamlawrence 0:6b5c0ae5acc6 97
adamlawrence 0:6b5c0ae5acc6 98 this->write(FIL_CFG,0x04);
adamlawrence 0:6b5c0ae5acc6 99
adamlawrence 0:6b5c0ae5acc6 100 // Set the electrode config to transition to active mode
adamlawrence 0:6b5c0ae5acc6 101 this->write(ELE_CFG,0x0c);
adamlawrence 0:6b5c0ae5acc6 102 }
adamlawrence 0:6b5c0ae5acc6 103
adamlawrence 0:6b5c0ae5acc6 104 void Mpr121::setElectrodeThreshold(int electrode, unsigned char touch, unsigned char release){
adamlawrence 0:6b5c0ae5acc6 105
adamlawrence 0:6b5c0ae5acc6 106 if(electrode > 11) return;
adamlawrence 0:6b5c0ae5acc6 107
adamlawrence 0:6b5c0ae5acc6 108 // Get the current mode
adamlawrence 0:6b5c0ae5acc6 109 unsigned char mode = this->read(ELE_CFG);
adamlawrence 0:6b5c0ae5acc6 110
adamlawrence 0:6b5c0ae5acc6 111 // Put the MPR into setup mode
adamlawrence 0:6b5c0ae5acc6 112 this->write(ELE_CFG,0x00);
adamlawrence 0:6b5c0ae5acc6 113
adamlawrence 0:6b5c0ae5acc6 114 // Write the new threshold
adamlawrence 0:6b5c0ae5acc6 115 this->write((ELE0_T+(electrode*2)), touch);
adamlawrence 0:6b5c0ae5acc6 116 this->write((ELE0_T+(electrode*2)+1), release);
adamlawrence 0:6b5c0ae5acc6 117
adamlawrence 0:6b5c0ae5acc6 118 //Restore the operating mode
adamlawrence 0:6b5c0ae5acc6 119 this->write(ELE_CFG, mode);
adamlawrence 0:6b5c0ae5acc6 120 }
adamlawrence 0:6b5c0ae5acc6 121
adamlawrence 0:6b5c0ae5acc6 122
adamlawrence 0:6b5c0ae5acc6 123 unsigned char Mpr121::read(int key){
adamlawrence 0:6b5c0ae5acc6 124
adamlawrence 0:6b5c0ae5acc6 125 unsigned char data[2];
adamlawrence 0:6b5c0ae5acc6 126
adamlawrence 0:6b5c0ae5acc6 127 //Start the command
adamlawrence 0:6b5c0ae5acc6 128 i2c->start();
adamlawrence 0:6b5c0ae5acc6 129
adamlawrence 0:6b5c0ae5acc6 130 // Address the target (Write mode)
adamlawrence 0:6b5c0ae5acc6 131 int ack1= i2c->write(address);
adamlawrence 0:6b5c0ae5acc6 132
adamlawrence 0:6b5c0ae5acc6 133 // Set the register key to read
adamlawrence 0:6b5c0ae5acc6 134 int ack2 = i2c->write(key);
adamlawrence 0:6b5c0ae5acc6 135
adamlawrence 0:6b5c0ae5acc6 136 // Re-start for read of data
adamlawrence 0:6b5c0ae5acc6 137 i2c->start();
adamlawrence 0:6b5c0ae5acc6 138
adamlawrence 0:6b5c0ae5acc6 139 // Re-send the target address in read mode
adamlawrence 0:6b5c0ae5acc6 140 int ack3 = i2c->write(address+1);
adamlawrence 0:6b5c0ae5acc6 141
adamlawrence 0:6b5c0ae5acc6 142 // Read in the result
adamlawrence 0:6b5c0ae5acc6 143 data[0] = i2c->read(0);
adamlawrence 0:6b5c0ae5acc6 144
adamlawrence 0:6b5c0ae5acc6 145 // Reset the bus
adamlawrence 0:6b5c0ae5acc6 146 i2c->stop();
adamlawrence 0:6b5c0ae5acc6 147
adamlawrence 0:6b5c0ae5acc6 148 return data[0];
adamlawrence 0:6b5c0ae5acc6 149 }
adamlawrence 0:6b5c0ae5acc6 150
adamlawrence 0:6b5c0ae5acc6 151
adamlawrence 0:6b5c0ae5acc6 152 int Mpr121::write(int key, unsigned char value){
adamlawrence 0:6b5c0ae5acc6 153
adamlawrence 0:6b5c0ae5acc6 154 //Start the command
adamlawrence 0:6b5c0ae5acc6 155 i2c->start();
adamlawrence 0:6b5c0ae5acc6 156
adamlawrence 0:6b5c0ae5acc6 157 // Address the target (Write mode)
adamlawrence 0:6b5c0ae5acc6 158 int ack1= i2c->write(address);
adamlawrence 0:6b5c0ae5acc6 159
adamlawrence 0:6b5c0ae5acc6 160 // Set the register key to write
adamlawrence 0:6b5c0ae5acc6 161 int ack2 = i2c->write(key);
adamlawrence 0:6b5c0ae5acc6 162
adamlawrence 0:6b5c0ae5acc6 163 // Read in the result
adamlawrence 0:6b5c0ae5acc6 164 int ack3 = i2c->write(value);
adamlawrence 0:6b5c0ae5acc6 165
adamlawrence 0:6b5c0ae5acc6 166 // Reset the bus
adamlawrence 0:6b5c0ae5acc6 167 i2c->stop();
adamlawrence 0:6b5c0ae5acc6 168
adamlawrence 0:6b5c0ae5acc6 169 return (ack1+ack2+ack3)-3;
adamlawrence 0:6b5c0ae5acc6 170 }
adamlawrence 0:6b5c0ae5acc6 171
adamlawrence 0:6b5c0ae5acc6 172
adamlawrence 0:6b5c0ae5acc6 173 int Mpr121::writeMany(int start, unsigned char* dataSet, int length){
adamlawrence 0:6b5c0ae5acc6 174 //Start the command
adamlawrence 0:6b5c0ae5acc6 175 i2c->start();
adamlawrence 0:6b5c0ae5acc6 176
adamlawrence 0:6b5c0ae5acc6 177 // Address the target (Write mode)
adamlawrence 0:6b5c0ae5acc6 178 int ack= i2c->write(address);
adamlawrence 0:6b5c0ae5acc6 179 if(ack!=1){
adamlawrence 0:6b5c0ae5acc6 180 return -1;
adamlawrence 0:6b5c0ae5acc6 181 }
adamlawrence 0:6b5c0ae5acc6 182
adamlawrence 0:6b5c0ae5acc6 183 // Set the register key to write
adamlawrence 0:6b5c0ae5acc6 184 ack = i2c->write(start);
adamlawrence 0:6b5c0ae5acc6 185 if(ack!=1){
adamlawrence 0:6b5c0ae5acc6 186 return -1;
adamlawrence 0:6b5c0ae5acc6 187 }
adamlawrence 0:6b5c0ae5acc6 188
adamlawrence 0:6b5c0ae5acc6 189 // Write the date set
adamlawrence 0:6b5c0ae5acc6 190 int count = 0;
adamlawrence 0:6b5c0ae5acc6 191 while(ack==1 && (count < length)){
adamlawrence 0:6b5c0ae5acc6 192 ack = i2c->write(dataSet[count]);
adamlawrence 0:6b5c0ae5acc6 193 count++;
adamlawrence 0:6b5c0ae5acc6 194 }
adamlawrence 0:6b5c0ae5acc6 195 // Stop the cmd
adamlawrence 0:6b5c0ae5acc6 196 i2c->stop();
adamlawrence 0:6b5c0ae5acc6 197
adamlawrence 0:6b5c0ae5acc6 198 return count;
adamlawrence 0:6b5c0ae5acc6 199 }
adamlawrence 0:6b5c0ae5acc6 200
adamlawrence 0:6b5c0ae5acc6 201
adamlawrence 0:6b5c0ae5acc6 202 bool Mpr121::getProximityMode(){
adamlawrence 0:6b5c0ae5acc6 203 if(this->read(ELE_CFG) > 0x0c)
adamlawrence 0:6b5c0ae5acc6 204 return true;
adamlawrence 0:6b5c0ae5acc6 205 else
adamlawrence 0:6b5c0ae5acc6 206 return false;
adamlawrence 0:6b5c0ae5acc6 207 }
adamlawrence 0:6b5c0ae5acc6 208
adamlawrence 0:6b5c0ae5acc6 209 void Mpr121::setProximityMode(bool mode){
adamlawrence 0:6b5c0ae5acc6 210 this->write(ELE_CFG,0x00);
adamlawrence 0:6b5c0ae5acc6 211 if(mode){
adamlawrence 0:6b5c0ae5acc6 212 this->write(ELE_CFG,0x30); //Sense proximity from ALL pads
adamlawrence 0:6b5c0ae5acc6 213 } else {
adamlawrence 0:6b5c0ae5acc6 214 this->write(ELE_CFG,0x0c); //Sense touch, all 12 pads active.
adamlawrence 0:6b5c0ae5acc6 215 }
adamlawrence 0:6b5c0ae5acc6 216 }
adamlawrence 0:6b5c0ae5acc6 217
adamlawrence 0:6b5c0ae5acc6 218
adamlawrence 0:6b5c0ae5acc6 219 int Mpr121::readTouchData(){
adamlawrence 0:6b5c0ae5acc6 220 return this->read(0x00);
adamlawrence 0:6b5c0ae5acc6 221 }