forked from arduino12/ttp229b-arduino
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTTP229.cpp
185 lines (176 loc) · 6.64 KB
/
TTP229.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*********************************** LICENCE **********************************\
| Copyright (c) 2014, A.E. TEC |
| All rights reserved. |
| |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions are met: |
| |
| * Redistributions of source code must retain the above copyright notice, |
| this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright notice, |
| this list of conditions and the following disclaimer in the documentation |
| and/or other materials provided with the distribution. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| POSSIBILITY OF SUCH DAMAGE. |
\******************************************************************************/
/************************************ USES ************************************\
| This library designed to communicate with the TTP229 chip from an Arduino |
| |
| It works with a TTP229 (16-Channel Digital Touch Capacitive Switch Sensor) |
| using the 2-wires serial interface protocol - only 2 arduino pins. |
\******************************************************************************/
/*********************************** CIRCUIT **********************************\
| General: |
| * TTP229 VCC to pin VCC |
| * TTP229 GND to pin GND |
| * TTP229 SCL to any pin you choose... |
| * TTP229 SDO to any pin you choose... |
| |
| 16 Buttons Mode (else 8 Buttons Mode): |
| * TTP229 TP2 to GND via 1 Megohm resistor! |
| # Must use the ReadKey16, GetKeys16... else use the ReadKey8, GetKeys8... |
| |
| Multi Keys Mode (else Single key Mode): |
| * TTP229 TP3 to GND via 1 Megohm resistor! |
| * TTP229 TP4 to GND via 1 Megohm resistor! |
| |
| 64Hz Sampling Rate (else 8Hz Sampling Rate): |
| * TTP229 TP5 to GND via 1 Megohm resistor! |
| |
| 2ms Wake Up Rate (else 4ms Wake Up Rate): |
| * TTP229 TP6 to GND via 1 Megohm resistor! |
| |
| 60sec Key On Timeout (else No Key On Timeout): |
| * TTP229 TP7 to GND via 1 Megohm resistor! |
| |
| Important: |
| * Must reconnect the TTP229 power so the mode changes will take effect |
| * The 1 Megohm resistors already exist on some TTP229 modules |
\******************************************************************************/
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include "TTP229.h"
void TTP229::begin(uint8_t sclPin, uint8_t sdoPin)
{
_sclPin = sclPin;
_sdoPin = sdoPin;
pinMode(_sclPin , OUTPUT);
pinMode(_sdoPin , INPUT);
digitalWrite(_sclPin, HIGH);
}
uint8_t TTP229::ReadKey8()
{
WaitForTouch();
Key8();
return _key8;
}
uint8_t TTP229::GetKey8()
{
if (IsTouch()) Key8();
return _key8;
}
uint8_t TTP229::ReadKeys8()
{
WaitForTouch();
Keys8();
return _keys8;
}
uint8_t TTP229::GetKeys8()
{
if (IsTouch()) Keys8();
return _keys8;
}
uint8_t TTP229::ReadKey16()
{
WaitForTouch();
Key16();
return _key16;
}
uint8_t TTP229::GetKey16()
{
if (IsTouch()) Key16();
return _key16;
}
uint16_t TTP229::ReadKeys16()
{
WaitForTouch();
Keys16();
return _keys16;
}
uint16_t TTP229::GetKeys16()
{
if (IsTouch()) Keys16();
return _keys16;
}
void TTP229::Key8()
{
_key8 = 0;
for (uint8_t i = 0; i < 8; i++)
if (GetBit()) _key8 = i + 1;
delay(2); // Tout
}
void TTP229::Keys8()
{
_keys8 = 0;
for (uint8_t i = 0; i < 8; i++)
if (GetBit()) _keys8 |= 1 << i;
delay(2); // Tout
}
void TTP229::Key16()
{
_key16 = 0;
for (uint8_t i = 0; i < 16; i++)
if (GetBit()) _key16 = i + 1;
delay(2); // Tout
}
void TTP229::Keys16()
{
_keys16 = 0;
for (uint8_t i = 0; i < 16; i++)
if (GetBit()) _keys16 |= 1 << i;
delay(2); // Tout
}
bool TTP229::GetBit()
{
digitalWrite(_sclPin, LOW);
delayMicroseconds(2); // 500KHz
bool retVal = !digitalRead(_sdoPin);
digitalWrite(_sclPin, HIGH);
delayMicroseconds(2); // 500KHz
return retVal;
}
bool TTP229::IsTouch()
{
uint16_t timeout = 5000; // 50ms timeout
while (digitalRead(_sdoPin)) // DV LOW
{
if (--timeout == 0) return false;
delayMicroseconds(10);
}
while (!digitalRead(_sdoPin)) // DV HIGH
{
if (--timeout == 0) return false;
delayMicroseconds(10);
}
delayMicroseconds(10); // Tw
return true;
}
void TTP229::WaitForTouch()
{
while (digitalRead(_sdoPin)); // DV LOW
while (!digitalRead(_sdoPin)); // DV HIGH
delayMicroseconds(10); // Tw
}