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