Atmel AT42QT1070 Seven-channel QTouch® Touch Sensor IC

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?

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 <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