185 lines
6.6 KiB
C++
185 lines
6.6 KiB
C++
/*********************************** 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"
|
|
|
|
TTP229::TTP229(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
|
|
} |