Atmel AT42QT1070 Seven-channel QTouch® Touch Sensor IC

Committer:
mederic
Date:
Thu Jun 28 08:08:14 2018 +0000
Revision:
1:324c2c093ab8
Parent:
0:cdb98fa5056a
replace "x%=X_MAX;" by "if(x>X_MAX)x=X_MAX;"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mederic 0:cdb98fa5056a 1 #ifndef QT1070_H
mederic 0:cdb98fa5056a 2 #define QT1070_H
mederic 0:cdb98fa5056a 3
mederic 0:cdb98fa5056a 4 #include "mbed.h"
mederic 0:cdb98fa5056a 5
mederic 0:cdb98fa5056a 6 /** AT42QT1070 class
mederic 0:cdb98fa5056a 7 * Seven-channel QTouch® Touch Sensor Driver
mederic 0:cdb98fa5056a 8 *
mederic 0:cdb98fa5056a 9 * Example:
mederic 0:cdb98fa5056a 10 * @code
mederic 0:cdb98fa5056a 11 * #include "mbed.h"
mederic 0:cdb98fa5056a 12 * #include "QT1070.h"
mederic 0:cdb98fa5056a 13 *
mederic 0:cdb98fa5056a 14 * DigitalOut led(LED1);
mederic 0:cdb98fa5056a 15 * I2C i2c(PB_7,PB_6);
mederic 0:cdb98fa5056a 16 * QT1070 touch(&i2c, PA_11);
mederic 0:cdb98fa5056a 17 *
mederic 0:cdb98fa5056a 18 * int main() {
mederic 0:cdb98fa5056a 19 * touch.guard(0);
mederic 0:cdb98fa5056a 20 * touch.aksAve(5,0,0); // Disable key5 AVE=0
mederic 0:cdb98fa5056a 21 * touch.aksAve(6,0,0); // Disable key6 AVE=0
mederic 0:cdb98fa5056a 22 *
mederic 0:cdb98fa5056a 23 * while(1) {
mederic 0:cdb98fa5056a 24 * if(touch.change()){
mederic 0:cdb98fa5056a 25 * led=!led;
mederic 0:cdb98fa5056a 26 * printf("Key %d!!!!\r\n", touch.key());
mederic 0:cdb98fa5056a 27 * }
mederic 0:cdb98fa5056a 28 * }
mederic 0:cdb98fa5056a 29 * }
mederic 0:cdb98fa5056a 30 * @endcode
mederic 0:cdb98fa5056a 31 */
mederic 0:cdb98fa5056a 32
mederic 0:cdb98fa5056a 33 class QT1070{
mederic 0:cdb98fa5056a 34 public:
mederic 0:cdb98fa5056a 35 enum state{
mederic 0:cdb98fa5056a 36 I2C_ADDR = 0x36, //I2C adress
mederic 0:cdb98fa5056a 37 KEY_NUM = 0x07, //Number of channel
mederic 1:324c2c093ab8 38 AVEMAX = 31, //Averaging maximum
mederic 0:cdb98fa5056a 39 AKSMAX = 3 //Group maximum
mederic 0:cdb98fa5056a 40 };
mederic 0:cdb98fa5056a 41
mederic 0:cdb98fa5056a 42 //Register map
mederic 0:cdb98fa5056a 43 enum reg{
mederic 0:cdb98fa5056a 44 REG_CHIPID = 0,
mederic 0:cdb98fa5056a 45 REG_FIRMW = 1,
mederic 0:cdb98fa5056a 46 REG_STATUS = 2,
mederic 0:cdb98fa5056a 47 REG_KEYSTAT = 3,
mederic 0:cdb98fa5056a 48 REG_KEYSIG0 = 4,
mederic 0:cdb98fa5056a 49 REG_REFDAT0 = 18,
mederic 0:cdb98fa5056a 50 REG_NTHR0 = 32,
mederic 0:cdb98fa5056a 51 REG_AVEAKS0 = 39,
mederic 0:cdb98fa5056a 52 REG_DI0 = 46,
mederic 0:cdb98fa5056a 53 REG_FOMOGRD = 53,
mederic 0:cdb98fa5056a 54 REG_LOWPWR = 54,
mederic 0:cdb98fa5056a 55 REG_MAXOND = 55,
mederic 0:cdb98fa5056a 56 REG_CALIB = 56,
mederic 0:cdb98fa5056a 57 REG_RESET = 57
mederic 0:cdb98fa5056a 58 };
mederic 0:cdb98fa5056a 59
mederic 0:cdb98fa5056a 60 /** Create PCA9633 instance + config method
mederic 0:cdb98fa5056a 61 * @param *i2c initialized I2C bus to use
mederic 0:cdb98fa5056a 62 * @param change PinName if connected
mederic 0:cdb98fa5056a 63 */
mederic 0:cdb98fa5056a 64 QT1070(I2C *i2c, PinName change=NC);
mederic 0:cdb98fa5056a 65
mederic 0:cdb98fa5056a 66 /** Get key reg.
mederic 0:cdb98fa5056a 67 * @rerun 0 if not, 2^key if hit
mederic 0:cdb98fa5056a 68 */
mederic 0:cdb98fa5056a 69 char key(void);
mederic 0:cdb98fa5056a 70
mederic 0:cdb98fa5056a 71 /** Check a change in status
mederic 0:cdb98fa5056a 72 * @return true in change occurs
mederic 0:cdb98fa5056a 73 */
mederic 0:cdb98fa5056a 74 bool change(void);
mederic 0:cdb98fa5056a 75
mederic 0:cdb98fa5056a 76 /** Get signal.
mederic 0:cdb98fa5056a 77 * @param key <0,6> key number
mederic 0:cdb98fa5056a 78 */
mederic 0:cdb98fa5056a 79 unsigned short signal(char key);
mederic 0:cdb98fa5056a 80
mederic 0:cdb98fa5056a 81 /** Get reference.
mederic 0:cdb98fa5056a 82 * @param key <0,6> key number
mederic 0:cdb98fa5056a 83 */
mederic 0:cdb98fa5056a 84 unsigned short ref(char key);
mederic 0:cdb98fa5056a 85
mederic 0:cdb98fa5056a 86 /** Set/Get negative threshold.
mederic 0:cdb98fa5056a 87 * @param key <0,6> key number
mederic 0:cdb98fa5056a 88 * @param val <1,255> (Getter if 0)
mederic 0:cdb98fa5056a 89 */
mederic 0:cdb98fa5056a 90 char nthresh(char key, char val=0);
mederic 0:cdb98fa5056a 91
mederic 0:cdb98fa5056a 92 /** Set/Get adjacent supresssor group and averaging.
mederic 0:cdb98fa5056a 93 * @param key <0,6> key number
mederic 0:cdb98fa5056a 94 * @param group <0,3> adjacent key suppressor group of the key
mederic 0:cdb98fa5056a 95 * @param ave <1,31> averaged signal value
mederic 0:cdb98fa5056a 96 */
mederic 0:cdb98fa5056a 97 char aksAve(char key, char group=1, char ave=8);
mederic 0:cdb98fa5056a 98
mederic 0:cdb98fa5056a 99 /** set DI.
mederic 0:cdb98fa5056a 100 * @param key <0,6> key number
mederic 0:cdb98fa5056a 101 * @param val <2,255> how measurement before confirm key hit
mederic 0:cdb98fa5056a 102 */
mederic 0:cdb98fa5056a 103 void detectInt(char key, char val);
mederic 0:cdb98fa5056a 104
mederic 0:cdb98fa5056a 105 /** Set fastout and Maxcal.
mederic 0:cdb98fa5056a 106 * @param fo set the digital integrator of 4 for all channel
mederic 0:cdb98fa5056a 107 * @param maxcal if set only the key timeout was recalibrated
mederic 0:cdb98fa5056a 108 */
mederic 0:cdb98fa5056a 109 void foMaxCal(bool fo, bool maxcal=false);
mederic 0:cdb98fa5056a 110
mederic 0:cdb98fa5056a 111 /** Set a key to be guard channel (priority filtering).
mederic 0:cdb98fa5056a 112 * @param key <0,6> key number
mederic 0:cdb98fa5056a 113 */
mederic 0:cdb98fa5056a 114 void guard(char key);
mederic 0:cdb98fa5056a 115
mederic 0:cdb98fa5056a 116 /** Set interval between key measurment to reduce pwr.
mederic 0:cdb98fa5056a 117 * @param ms <8,2040>[ms] in step of 8ms
mederic 0:cdb98fa5056a 118 */
mederic 0:cdb98fa5056a 119 void lowpwr(unsigned short ms);
mederic 0:cdb98fa5056a 120
mederic 0:cdb98fa5056a 121 /** Set how long any key can be touch before it recalibrates itself.
mederic 0:cdb98fa5056a 122 * @param ms <0,40800>[ms] in step of 160ms
mederic 0:cdb98fa5056a 123 */
mederic 0:cdb98fa5056a 124 void maxOnDuration(unsigned short ms);
mederic 0:cdb98fa5056a 125
mederic 0:cdb98fa5056a 126 /** Trig a calibration cycle
mederic 0:cdb98fa5056a 127 */
mederic 0:cdb98fa5056a 128 void calibrate(void);
mederic 0:cdb98fa5056a 129
mederic 0:cdb98fa5056a 130 /** Trig a RESET
mederic 0:cdb98fa5056a 131 */
mederic 0:cdb98fa5056a 132 void reset(void);
mederic 0:cdb98fa5056a 133
mederic 0:cdb98fa5056a 134 protected:
mederic 0:cdb98fa5056a 135 void write(char reg, char data);
mederic 0:cdb98fa5056a 136 void writeW(char reg, unsigned short data);
mederic 0:cdb98fa5056a 137 char read(char reg);
mederic 0:cdb98fa5056a 138 unsigned short readW(char reg);
mederic 0:cdb98fa5056a 139
mederic 0:cdb98fa5056a 140 private:
mederic 0:cdb98fa5056a 141 I2C *_i2c;
mederic 0:cdb98fa5056a 142 DigitalIn _change;
mederic 0:cdb98fa5056a 143 };
mederic 0:cdb98fa5056a 144
mederic 0:cdb98fa5056a 145 #endif