A capacitive touch sensor using a analog input port.

Dependents:   TouchSenseTestProgram

Committer:
shintamainjp
Date:
Thu Aug 15 04:22:11 2013 +0000
Revision:
1:08658b9787d8
Parent:
0:5a0704efe081
Changed the calculation algorithm.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:5a0704efe081 1 /* mbed Microcontroller Library
shintamainjp 0:5a0704efe081 2 * Copyright (c) 2013 Shinichiro Nakamura
shintamainjp 0:5a0704efe081 3 *
shintamainjp 0:5a0704efe081 4 * Licensed under the Apache License, Version 2.0 (the "License");
shintamainjp 0:5a0704efe081 5 * you may not use this file except in compliance with the License.
shintamainjp 0:5a0704efe081 6 * You may obtain a copy of the License at
shintamainjp 0:5a0704efe081 7 *
shintamainjp 0:5a0704efe081 8 * http://www.apache.org/licenses/LICENSE-2.0
shintamainjp 0:5a0704efe081 9 *
shintamainjp 0:5a0704efe081 10 * Unless required by applicable law or agreed to in writing, software
shintamainjp 0:5a0704efe081 11 * distributed under the License is distributed on an "AS IS" BASIS,
shintamainjp 0:5a0704efe081 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
shintamainjp 0:5a0704efe081 13 * See the License for the specific language governing permissions and
shintamainjp 0:5a0704efe081 14 * limitations under the License.
shintamainjp 0:5a0704efe081 15 */
shintamainjp 1:08658b9787d8 16
shintamainjp 0:5a0704efe081 17 #ifndef TOUCHSENSE_H
shintamainjp 0:5a0704efe081 18 #define TOUCHSENSE_H
shintamainjp 0:5a0704efe081 19
shintamainjp 0:5a0704efe081 20 #include "platform.h"
shintamainjp 0:5a0704efe081 21 #include "gpio_api.h"
shintamainjp 0:5a0704efe081 22 #include "analogin_api.h"
shintamainjp 0:5a0704efe081 23
shintamainjp 1:08658b9787d8 24 namespace mbed
shintamainjp 1:08658b9787d8 25 {
shintamainjp 0:5a0704efe081 26
shintamainjp 0:5a0704efe081 27 /**
shintamainjp 0:5a0704efe081 28 * A capacitive touch sensor using analog input port.
shintamainjp 0:5a0704efe081 29 *
shintamainjp 0:5a0704efe081 30 * Example:
shintamainjp 0:5a0704efe081 31 * @code
shintamainjp 0:5a0704efe081 32 * #include "mbed.h"
shintamainjp 0:5a0704efe081 33 *
shintamainjp 0:5a0704efe081 34 * TouchSense tp(p18);
shintamainjp 0:5a0704efe081 35 *
shintamainjp 0:5a0704efe081 36 * int main() {
shintamainjp 0:5a0704efe081 37 * tp.calibration();
shintamainjp 0:5a0704efe081 38 * while(1) {
shintamainjp 0:5a0704efe081 39 * if (tp.sense()) {
shintamainjp 0:5a0704efe081 40 * printf("ON\r\n");
shintamainjp 0:5a0704efe081 41 * } else {
shintamainjp 0:5a0704efe081 42 * printf("OFF\r\n");
shintamainjp 0:5a0704efe081 43 * }
shintamainjp 0:5a0704efe081 44 * wait(0.1);
shintamainjp 0:5a0704efe081 45 * }
shintamainjp 0:5a0704efe081 46 * }
shintamainjp 0:5a0704efe081 47 * @endcode
shintamainjp 0:5a0704efe081 48 */
shintamainjp 1:08658b9787d8 49 class TouchSense
shintamainjp 1:08658b9787d8 50 {
shintamainjp 0:5a0704efe081 51
shintamainjp 0:5a0704efe081 52 public:
shintamainjp 0:5a0704efe081 53 /**
shintamainjp 0:5a0704efe081 54 * Create a TouchSense connected to the specified pin
shintamainjp 0:5a0704efe081 55 *
shintamainjp 0:5a0704efe081 56 * @param pin TouchSense pin to connect to
shintamainjp 1:08658b9787d8 57 * @param thr Threshold (1 to 20)
shintamainjp 0:5a0704efe081 58 */
shintamainjp 1:08658b9787d8 59 TouchSense(PinName pin, int thr = 10) : mypin(pin), calval(0) {
shintamainjp 1:08658b9787d8 60 for (int i = 0; i < DATA_COUNT; i++) {
shintamainjp 1:08658b9787d8 61 data[i] = 0;
shintamainjp 1:08658b9787d8 62 }
shintamainjp 1:08658b9787d8 63 if (thr < THRMIN) {
shintamainjp 1:08658b9787d8 64 thr = THRMIN;
shintamainjp 1:08658b9787d8 65 }
shintamainjp 1:08658b9787d8 66 if (thr > THRMAX) {
shintamainjp 1:08658b9787d8 67 thr = THRMAX;
shintamainjp 1:08658b9787d8 68 }
shintamainjp 1:08658b9787d8 69 threshold = thr;
shintamainjp 1:08658b9787d8 70 execute();
shintamainjp 0:5a0704efe081 71 }
shintamainjp 1:08658b9787d8 72
shintamainjp 0:5a0704efe081 73 void calibration() {
shintamainjp 1:08658b9787d8 74 uint32_t r = 0;
shintamainjp 1:08658b9787d8 75 for (int i = 0; i < DATA_COUNT; i++) {
shintamainjp 1:08658b9787d8 76 r += execute();
shintamainjp 1:08658b9787d8 77 wait_us(100);
shintamainjp 1:08658b9787d8 78 }
shintamainjp 1:08658b9787d8 79 r = r / DATA_COUNT;
shintamainjp 1:08658b9787d8 80 calval = r;
shintamainjp 0:5a0704efe081 81 }
shintamainjp 1:08658b9787d8 82
shintamainjp 0:5a0704efe081 83 bool sense() {
shintamainjp 1:08658b9787d8 84 data[index] = execute();
shintamainjp 1:08658b9787d8 85 index = (index + 1) % DATA_COUNT;
shintamainjp 1:08658b9787d8 86 uint32_t r = 0;
shintamainjp 1:08658b9787d8 87 for (int i = 0; i < DATA_COUNT; i++) {
shintamainjp 1:08658b9787d8 88 r += data[i];
shintamainjp 1:08658b9787d8 89 }
shintamainjp 1:08658b9787d8 90 r = r / DATA_COUNT;
shintamainjp 1:08658b9787d8 91 return (calval * threshold) < r;
shintamainjp 0:5a0704efe081 92 }
shintamainjp 0:5a0704efe081 93
shintamainjp 0:5a0704efe081 94 private:
shintamainjp 0:5a0704efe081 95
shintamainjp 0:5a0704efe081 96 uint16_t execute() {
shintamainjp 1:08658b9787d8 97 uint16_t r;
shintamainjp 1:08658b9787d8 98 analogin_init(&adc, mypin);
shintamainjp 1:08658b9787d8 99 r = analogin_read_u16(&adc) >> 4;
shintamainjp 0:5a0704efe081 100 gpio_init(&gpio, mypin, PIN_OUTPUT);
shintamainjp 0:5a0704efe081 101 gpio_write(&gpio, 1);
shintamainjp 1:08658b9787d8 102 return r;
shintamainjp 0:5a0704efe081 103 }
shintamainjp 0:5a0704efe081 104
shintamainjp 0:5a0704efe081 105 protected:
shintamainjp 0:5a0704efe081 106 PinName mypin;
shintamainjp 0:5a0704efe081 107 uint16_t calval;
shintamainjp 0:5a0704efe081 108 gpio_t gpio;
shintamainjp 0:5a0704efe081 109 analogin_t adc;
shintamainjp 1:08658b9787d8 110 static const int DATA_COUNT = 8;
shintamainjp 1:08658b9787d8 111 uint32_t data[DATA_COUNT];
shintamainjp 1:08658b9787d8 112 int index;
shintamainjp 1:08658b9787d8 113 int threshold;
shintamainjp 1:08658b9787d8 114 static const int THRMIN = 1;
shintamainjp 1:08658b9787d8 115 static const int THRMAX = 20;
shintamainjp 0:5a0704efe081 116 };
shintamainjp 0:5a0704efe081 117
shintamainjp 0:5a0704efe081 118 } // namespace mbed
shintamainjp 0:5a0704efe081 119
shintamainjp 0:5a0704efe081 120 #endif