Touch Sensor Library for Proteus V2.0: two Arduino UNOs with red TTP223 touch modules, the TTP223 Advance pop-up Touch page with the finger held on the pad and OUT HIGH, and the TEP Serial Monitor in its Simple interface

Touch Sensor Library for Proteus V2.0 (TTP223 + Arduino)

2.5K Views
40
700
60
25
60
PCBWay

Hello friends, I hope you all are doing great. Today, I am going to share the new Touch Sensor Library for Proteus V2.0. It simulates the popular TTP223 capacitive touch module: the small red board with a round touch pad that works like a push button without any moving parts. With this Touch Sensor Library for Proteus, you touch the pad with the mouse or with buttons, and your Arduino reads the I/O pin exactly as it reads a real module: LOW while the pad is free and HIGH while a finger is on it.

Version 2.0 is the next version of our touch sensor library, built around the behaviour of the real chip: the calibration after power-on, the slower first touch while the chip sleeps, the four jumper modes, the max on time and cover sheets in front of the pad. You get two devices: TTP223 Simple, with a touch scene on the schematic, and TTP223 Advance, with a pop-up window and four measured touch sensor test tools. The new TTP223 Arduino Proteus demo is a touch lamp on two Arduino UNOs, shown in the compact Simple interface of our TEP Serial Monitor. Have you used an earlier version? Then jump to "What's New" below.

NOTICE: This library is very special to our team. Our TTP223 model has the chip's calibration, its low-power and fast response times, the four jumper modes, the max on time with its re-calibration, cover sheets, and an event log that measures every touch. It took our team a lot of hard work, many test runs and many design changes. Your feedback is the fuel that keeps us going, so please tell us what you think in the comments below or in the Touch Sensor Library board of our forum. And if our free libraries help you, you can buy us a coffee. So, let's get started with the Touch Sensor Library for Proteus:

Touch Sensor Library for Proteus V2.0: two Arduino UNOs with red TTP223 touch modules, the TTP223 Advance pop-up Touch page with the finger held on the pad and OUT HIGH, and the TEP Serial Monitor in its Simple interface
Figure: The touch lamp demo in Proteus 8.5: NODE 1 (Simple) and NODE 2 (Advance), U2's Touch page with Hold pressed ("touch detected - OUT active", touch #22 after 220.000 ms) and U4 printing "Touched! #22 - lamp OFF".

What is the TTP223 Touch Sensor?

The TTP223, made by Tontek, is a single-key capacitive touch chip. A finger near its pad adds a tiny capacitance, and the chip measures that change. When the change is big enough, the chip switches its output pin. The TTP223 is best known on a small red module with a round touch pad. That module carries the TTP223-BA6, a six-pin chip marked "223B", together with one LED and two solder jumpers, A and B. On the real module, the chip, the LED and the jumpers sit on the back, and the pad side is plain.

A touch pad has no moving parts and no mechanical contact, and it even works through a thin plastic or glass panel. That makes the TTP223 a favourite for touch lamps, hidden switches behind a front panel and simple user interfaces. The module has three pins: I/O (the output), VCC and GND. The chip drives I/O HIGH and LOW itself, so your Arduino needs no pull-up resistor and no library to read it.

The TTP223 at a Glance

TTP223 module in numbers
FeatureValue
ChipTTP223-BA6 from Tontek, marked "223B" on the module
Supply2.0 to 5.5 V
OutputI/O, the chip's CMOS output: it drives 0 V and VCC itself
PinsI/O, VCC, GND (VCC is in the middle on every module)
ResponseAt most about 60 ms in fast mode and 220 ms in low-power mode (datasheet, at 3 V)
ReleaseAbout 60 ms after the finger is lifted
CalibrationAbout 0.5 s after power-on
ModesFour, set with solder jumper A (AHLB) and jumper B (TOG)
Max on timeNone in the BA6 datasheet; users report 7 to 12 s
CoversWorks through a few mm of plastic or glass; no metal in front of the pad
LEDOne, lit while I/O is HIGH

Touch Sensor Terms You Will See in This Article

Touch sensor terms
TermMeaning
Capacitive touchSensing a finger by the small capacitance it adds to the pad
BaselineThe pad's "nothing touched" value, learned during the calibration
ThresholdHow far above the baseline the signal must rise to count as a touch
SignalIn our model: the finger's effect as a multiple of the threshold (3.0 x on the bare pad)
CalibrationThe chip measures its baseline; touches are ignored meanwhile
Low-power modeThe chip sleeps and checks the pad only now and then, so a touch takes up to 220 ms
Fast modeAfter a touch, the chip stays awake for 12 s and answers in 60 ms
Response / releaseThe delay from the finger's contact to OUT, and from the lift to OUT
AHLBThe chip's active-high / active-low option, set by jumper A
TOGThe chip's toggle option, set by jumper B
Momentary / toggleOUT follows the finger / OUT flips on each touch
Max on timeAfter a very long touch, the chip re-calibrates and OUT goes back to idle
OUTThe module's I/O pin, as the panels call it

How the TTP223 Decides a Touch

Calibration After Power-On

For about 0.5 s after power-on, the chip measures the pad and stores that value as its baseline, and it ignores touches. A finger on the pad at that time becomes the "nothing touched" reference: the chip ignores it until it is lifted, and then re-calibrates for 1 s. So never touch the pad in the first half second; the demo sketch waits 0.6 s for the same reason.

Response Time: Sleeping and Awake

The TTP223-BA6 on these modules sleeps in its low-power mode, so the first touch after a quiet time takes up to 220 ms to reach the output. A touch wakes the chip into fast mode for 12 s, and then it answers in 60 ms. The release always takes 60 ms. These are the datasheet's maximum values at 3 V, and our model uses them exactly. A contact shorter than the response time is not reported at all.

The Max On Time

Hold the pad for a long time and the output drops back to idle, although your finger is still there. The chip re-calibrates, and your finger becomes the new baseline. The BA6 datasheet gives no number for this, but users report 7 to 12 s; our model uses 10 s (the MAXON property). Lift the finger, give the chip a moment for its 1 s re-calibration, and touch again.

Cover Sheets in Front of the Pad

The pad senses through a thin plastic or glass panel, so you can hide it behind the front of your project. A thicker cover weakens the signal. Our model gives each cover a signal factor against the threshold: bare pad 3.0 x, plastic 2 mm 2.0 x, glass 5 mm 1.6 x and wood 10 mm 0.6 x. Below 1.0, the chip never sees the touch. These factors are our estimates, not datasheet values.

The Two Jumpers and the Four Modes

The two solder jumpers select the chip's options. Jumper A is AHLB, the output level, and jumper B is TOG, the mode. Both open is the factory setting:

The four TTP223 modes (A = AHLB, B = TOG)
Jumper AJumper BOUT idleWhen touchedMode
OpenOpenLOWHIGH while touchedMomentary, active HIGH (factory setting)
ClosedOpenHIGHLOW while touchedMomentary, active LOW
OpenClosedLOWFlips on each touchToggle, starts LOW
ClosedClosedHIGHFlips on each touchToggle, starts HIGH

The module's LED follows the output: it is lit while I/O is HIGH. With jumper A closed, it therefore lights while the pad is NOT touched.

What's New in Touch Sensor Library for Proteus V2.0

Our team has shared earlier versions of a touch sensor library for Proteus. Version 2.0 is a new design around the real TTP223 behaviour:

  • Two devices in TEPTTP223.LIB: TTP223 Simple (TTP223TEP) with the touch scene on the sheet, and TTP223 Advance (TTP223ADVTEP) with a pop-up window.
  • A live red TTP223 board: the pad glows cyan, amber or violet, the module's LED follows OUT, and the PWR and EDGE LEDs and the animated TOUCH VIEW screen are TEP additions.
  • The chip's timing: the 0.5 s calibration, 220 ms while the chip sleeps, 60 ms when it is awake and on release, short contacts not reported, and the 10 s max on time with its re-calibration.
  • Four jumper modes and four cover sheets, set with buttons, a click on the mode table or the properties.
  • An event log with measured values: every contact with its signal, every touch and release with its delay, and how long OUT was active.
  • Four measured test tools on the Advance device: Mode table, Response time, Max on time and Cover sweep.
  • A two-UNO touch lamp demo with our TEP Serial Monitor instead of the Virtual Terminal, plus serial commands for the lamp mode and the active level.
  • A lighter simulation: the panels redraw only what changed, and the two-UNO demo ran at about 0.6 x real time in our Proteus test with the pop-up open.
  • A small package: about 1.40 MB, without the C++ source code.

Touch Sensor Library for Proteus: Simple vs Advance

Both devices run the same model with the same properties; only the panel differs:

TTP223 Simple vs Advance
FeatureSimpleAdvance
Full TTP223 model (calibration, response times, four modes, max on time, covers)✔✔
Red TTP223 board: pad glow, PWR / LED / EDGE LEDs, jumpers A and B, TOUCH VIEW screen✔✔
Touch scene on the schematic: side view, mode table, last 10 s, buttons✔✘
Panel you close with a red X and open again with the board button✔✘
Pop-up window you can move, resize, minimise and open again with OPEN PANEL✘✔
THE SENSOR card: the signal, the measured response and release, asleep or awake, the max on time left✘✔
Event log with the measured delays✘✔
Mode table, Response time, Max on time and Cover sweep tools✘✔
TEP Dark / Light theme, text size, Help page with Copy diagnostics✘✔

Choose Simple to keep everything beside your circuit, and Advance when your sheet is full or you want hard numbers. The demo has one of each.

Download Touch Sensor Library for Proteus

Click the button below to download Touch-Sensor-Library-for-Proteus-v2.0.zip (about 1.40 MB, without the C++ source code):

Touch Sensor Library for Proteus V2.0
  • README.txt: a detailed guide to the files, the wiring, the model, the test tools and real hardware.
  • Proteus Library Files: TEPTTP223.LIB (both devices), TEPSERIALMON.LIB and our Arduino UNO library ArduinoV3TEP.LIB / ArduinoV3TEP.IDX.
  • Proteus Model Files: TEPTTP223.DLL and TEPSERIALMON.DLL.
  • Proteus Simulation: TTP223-Touch-Lamp-ArduinoUnoV3.pdsprj, TTP223_Touch_Lamp.hex (both UNOs run it) and copies of both DLLs.
  • Arduino Code: TTP223_Touch_Lamp.ino, the demo sketch. It needs no Arduino library.

No Proteus yet? Read How to Download and Install Proteus 7 and 8. New to libraries? Follow How to Install a New Library in Proteus.

How to Install Touch Sensor Library for Proteus

  1. Close Proteus and extract the whole zip file.
  2. Copy the four files from Proteus Library Files into the LIBRARY folder, usually C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\LIBRARY (on some PCs C:\ProgramData\Labcenter Electronics\Proteus 8 Professional\LIBRARY).
  3. Copy TEPTTP223.DLL and TEPSERIALMON.DLL into the MODELS folder.
  4. Start Proteus, press P and search for TTP223 (or Touch). You get the Simple and the Advance device (category Sensors > Touch).

Updating from an earlier version? Replace its LIB and DLL files, delete TEPTTP223.IDX if there is one in LIBRARY, and pick the part again in your designs to get the V2.0 board. Tested in Proteus 8.5; Proteus 7 is not supported.

The TTP223 Board in Proteus

We drew the module as a clean TEP board in the red of the real one: the round touch pad with its white printed ring, the TTP223 chip marked "223B", the LEDs, the solder jumpers A and B and the I/O VCC GND header at the bottom. The real module has its chip, LED and jumpers on the back; our symbol shows everything on one face. Here is U1, the Simple device, after the calibration:

TTP223 Simple board in Proteus after the calibration: the red module with its round pad, the PWR LED lit, jumpers A and B open, the TOUCH VIEW screen at signal 0.0 x and the TTP223 TOUCH SCENE panel saying READY - TOUCH THE PAD
Figure: U1 (Simple), ready: "READY - TOUCH THE PAD", OUT LOW, MOMENTARY, ACTIVE HIGH, 0 touches.

The TOUCH VIEW Screen

Above the board, the TOUCH VIEW screen shows what the chip measures over the last 4 s: the finger's signal (cyan) against the chip's baseline and its threshold (amber, at 1), with an OUT lane at the bottom that turns green while OUT is active. The number at the top right is the signal right now, as a multiple of the threshold. In the image above it is 0.0 x: no finger on the pad.

Pinout

The three pins have the names and the order of the real module:

TTP223 pins in Proteus (I/O VCC GND, left to right)
PinWhat it doesDemo connection
I/OThe output, driven HIGH and LOW by the chipArduino D2
VCCPower (2.0 to 5.5 V on a real module)+5 V terminal
GNDGroundGround

LEDs and Indicators

Board animations (the same on both devices)
IndicatorWhat it shows
Round padGlows cyan while a touch is reported, blinks amber while the chip calibrates, and glows violet while a finger is ignored; hold the mouse button on it to put a finger on the pad
PWR LED (red)Lit while the module has power (a TEP addition)
LED (red)The module's own LED: lit while OUT is HIGH, as on the real board
EDGE LED (amber)Lights for 0.3 s on every change of OUT (a TEP addition)
Jumpers A and BGold pads, with a silver solder blob when closed; click one to solder or open it
TOUCH VIEWThe signal against the baseline and the threshold, last 4 s (a TEP addition)
PANEL / OPEN PANEL, SIMPLE / ADVANCEThe panel button and the device badge

Only the one red LED is on the real board. The PWR and EDGE LEDs, the board button and the TOUCH VIEW screen are TEP additions that make the simulation easier to follow.

Component Properties

TTP223 properties (double-click the sensor > Edit Properties)
PropertyMeaningDefault
JUMPERAOPEN (active HIGH) or CLOSED (active LOW)OPEN
JUMPERBOPEN (momentary) or CLOSED (toggle)OPEN
COVERNONE, PLASTIC, GLASS or WOODNONE
MAXONThe max on time in s, 0 = OFF, up to 10010
RESPONSEAUTO (low power 220 ms, fast 60 ms) or FAST (always 60 ms)AUTO
CALTIMEThe power-on calibration time, 0.1 to 5 s0.5
STARTUP, or HOLD: a finger on the pad at Run (it becomes the baseline and is ignored until lifted)UP
PANELOPEN or CLOSED: the Simple device's panel at RunOPEN

A bad value is logged in the Simulation Log and the default is used. The Advance device has no PANEL property; its window has its own "open at Run" setting instead.

TTP223 Simple: The Touch Scene on the Sheet

Beside the Simple board sits the TTP223 TOUCH SCENE panel (on the right of the image above):

The TTP223 Simple touch scene
PartWhat it does
Header, red XTTP223 TOUCH SCENE; the X closes the panel
BannerThe state in words, such as READY - TOUCH THE PAD
SIDE VIEWThe module on its spacers on a table, the cover sheet and the finger; the label names the cover and says whether it works
Mode tableThe four jumper settings with OUT idle and what a touch does; the current one is blue; click a row to set both jumpers
OUT AND FINGER - LAST 10 sThe finger on the pad and the OUT level
ReadoutsOUT, MODE, TOUCHES (since power-on) and OUT ACTIVE (how long OUT is or was active)
FINGERTAP (0.3 s on the pad), HOLD (until RELEASE), RELEASE, DOUBLE TAP and LONG HOLD (past the max on time)
COVER SHEET ON THE PADNONE, PLASTIC 2 mm, GLASS 5 mm and WOOD 10 mm
JUMPER A (AHLB), JUMPER B (TOG)OPEN: ACTIVE HIGH or CLOSED: ACTIVE LOW; OPEN: MOMENTARY or CLOSED: TOGGLE

The finger reaches the pad 120 ms after your click, because it travels down first. The banner has a message for every state, from CALIBRATING - DON'T TOUCH THE PAD to MAX ON TIME - RE-CALIBRATED, OUT BACK TO IDLE, LIFT THE FINGER and NO TOUCH DETECTED - THE COVER IS TOO THICK.

HOLD: a Touch Is Detected

TTP223 Simple board in Proteus with HOLD pressed: the pad glowing cyan, the module LED lit, the TOUCH VIEW at signal 3.0 x with a green OUT lane, and the banner TOUCH DETECTED - OUT ACTIVE
Figure: HOLD: "TOUCH DETECTED - OUT ACTIVE", OUT HIGH, 1 touch, OUT active for 4.14 s.

Click HOLD. The finger comes down on the bare pad, cyan touch-field arcs appear around it, and the banner turns green: TOUCH DETECTED - OUT ACTIVE. On the board, the pad glows cyan and the module's LED lights, because OUT is HIGH. The TOUCH VIEW signal jumps to 3.0 x the threshold, far above the amber line, and its OUT lane turns green. In the timeline, the OUT step comes just after the start of the finger bar: that gap is the response time. The OUT ACTIVE readout counts up while you hold (4.14 s in the image). Click RELEASE to lift the finger.

Holding the Board's Pad with the Mouse

TTP223 Simple board in Proteus with the round pad held down with the mouse: the pad glowing cyan, the TOUCH VIEW signal stepping up to 3.0 x the threshold, OUT HIGH and the banner TOUCH DETECTED - OUT ACTIVE
Figure: The board's pad held with the left mouse button: signal 3.0 x, OUT HIGH, 1 touch, OUT active for 0.70 s so far.

You can also touch the board itself. Press and hold the left mouse button on the round pad, and the finger comes down. The pad glows cyan, the TOUCH VIEW signal steps from 0 to 3.0 x the threshold, the OUT lane turns green, and the banner says TOUCH DETECTED - OUT ACTIVE. The HOLD button lights too, because the finger is held. Let go, and the finger lifts: the banner returns to READY - TOUCH THE PAD, OUT goes LOW, and OUT ACTIVE shows how long the touch lasted (1.40 s in our test).

PLASTIC 2 mm and Jumper B: the Module Toggles Itself

TTP223 Simple board in Proteus with a 2 mm plastic cover and jumper B closed: the solder blob on jumper B, the side view label PLASTIC 2 mm COVER - WORKS, the toggle row selected and the banner TOGGLED ON - TOUCH AGAIN TO SWITCH OFF
Figure: PLASTIC 2 mm and CLOSED: TOGGLE: after one tap, OUT stays HIGH: "TOGGLED ON - TOUCH AGAIN TO SWITCH OFF".

Now click PLASTIC 2 mm and CLOSED: TOGGLE. A plastic sheet lies on the pad in the side view ("PLASTIC 2 mm COVER - WORKS"), the third row of the mode table turns blue, and jumper B on the board gets its silver solder blob. Tap once. The finger goes up again, but OUT stays HIGH, and the banner says TOGGLED ON - TOUCH AGAIN TO SWITCH OFF. The MODE readout says TOGGLE, ACTIVE HIGH, and the TOUCH VIEW shows signal 0.0 x (no finger) with a green OUT lane. The module itself is now a toggle switch: the next touch sends OUT LOW again.

This matters for your sketch. The demo sketch already toggles the lamp on every touch, so with a module that toggles by itself it should follow the pad instead: that is the LAMP FOLLOW command (see below).

Closing the Panel

Click the red X. The panel disappears, the board button says PANEL: CLOSED, and the module keeps working with its pad, LEDs, jumpers and TOUCH VIEW. Click the button to bring the panel back:

TTP223 Simple board in Proteus with the panel closed: the PANEL: CLOSED button, the SIMPLE badge and the TOUCH VIEW screen above the red module
Figure: The panel closed: PANEL: CLOSED; the board and its TOUCH VIEW stay live.

TTP223 Advance: The Pop-Up Touch Window

The Advance device keeps only the board on the schematic. Here is U2:

TTP223 Advance board in Proteus: the red module with the TOUCH VIEW screen, the PWR LED lit, the OPEN PANEL button and the ADVANCE badge
Figure: U2 (Advance) with OPEN PANEL and the ADVANCE badge.

At Run, the "TEP TTP223 Advance" pop-up opens with the look of our TEP Serial Monitor and no Windows title bar: move it by its header, resize or minimise it, and open it again with OPEN PANEL after you close it. The header shows the state (here U2 · OUT LOW; it can also say TOUCHED, CALIBRATING, TESTING or NO POWER), the Touch and Test tabs and the palette (theme), gear (Settings) and ? (Help) icons. A row of chips below the header repeats OUT, the mode, the signal and the touches.

The Touch Page

TTP223 Advance Touch page in Proteus after two taps: the side view, THE SENSOR card with OUT LOW, response 60.000 ms in fast mode and release 60.000 ms, the finger, cover and jumper buttons, the last 10 seconds and the event log
Figure: The Touch page after two taps: 2 touches, OUT active 0.30 s last, response 60.000 ms (fast mode), the chip awake.

Next to the SIDE VIEW, THE SENSOR card lists the state, OUT, the mode, the finger, the cover, the signal against the threshold, the touches, how long OUT was active, the measured response and release, the BA6 mode (asleep or awake) and the max on time. Below it come the same finger, cover and jumper buttons as on the Simple panel, THE LAST 10 SECONDS in three lanes (finger, touch reported, OUT active) and the EVENT LOG, newest first.

I clicked Tap twice here. Read the event log from the bottom up. The first tap ended at 17.841 s: "OUT LOW - back to idle, it was active 0.14 s". In the second one, the finger touches the pad at 19.401 s with a signal of 3.0 x the threshold, and the chip reports TOUCH #2 - 60.000 ms after the contact (fast mode). The finger leaves after 0.30 s, and the chip reports RELEASED - 60.000 ms after the lift. OUT was active for 0.30 s.

Why was OUT active for only 0.14 s after the first tap? A TAP keeps the finger on the pad for 0.3 s. The first touch woke the sleeping chip and took 220 ms, and the release took 60 ms, so OUT was active for 0.3 - 0.22 + 0.06 = 0.14 s. The second tap came within 12 s, the chip was awake, and OUT followed the finger with 60 ms on both edges: 0.30 s. THE SENSOR card now says "awake - low power in 10.6 s": the 12 s awake window counting down.

Holding the Finger On

TTP223 Advance Touch page in Proteus with Hold pressed: touch detected - OUT active, the finger on the pad for 1.08 s, OUT active for 0.86 s, response 220.000 ms in low-power mode and the max on time with 9.1 s left
Figure: Hold, later in the run: touch #22 came 220.000 ms after the contact (low-power mode); the max on time has 9.1 s left.

Later in the same run, after the test tools, I clicked Hold. The chip had been quiet for a long time, so it was asleep again: TOUCH #22 - 220.000 ms after the contact (low-power mode). THE SENSOR card turns green: "touch detected - OUT active", the finger on the pad for 1.08 s and OUT active for 0.86 s, exactly 0.22 s less. The max on time counts down: "10 s - 9.1 s left". In the featured image at the top, the same hold has reached 6.68 s, with 3.5 s left.

The older lines in the log come from the Cover sweep below. At 168.461 s, the finger touched the pad through the 10 mm wood with a signal of only 0.6 x the threshold, and the log says "Contact ignored - the cover is too thick".

The Test Page: Four Measured Touch Sensor Test Tools

The four tools on the Test tab move the finger, set the jumpers or the cover, and read only the I/O pin and the model's event log. So every number is what OUT really did, measured with the simulation clock. Each tool puts the jumpers and the cover back when it ends, shows "-" in its tiles until it has a result, and ends with a bold "Good for:" line. All results below come from U2 in our Proteus 8.5 run.

1. Mode Table: What Do Jumpers A and B Do?

TTP223 Mode table test in Proteus: four settings measured, 4 of 4 match the datasheet, touch to OUT 60.000 ms and lift to OUT 60.000 ms, an OUT chart per jumper setting and the table of measured levels
Figure: Mode table, all four settings: 4 of 4 match the datasheet, and OUT follows a touch and a lift in 60.000 ms.

Good for: "choosing the jumpers - what OUT does in each of the four modes, measured on the pin." Choose All four or As set and click Run test. For each setting, the tool makes two touches, reads OUT before, while touched and after each lift, and compares the result with the TOG / AHLB table of the datasheet:

Mode table (U2, two touches per setting)
A / BIdleTouch 1Lift 1Touch 2Lift 2MeasuredDatasheet
open / openLOWHIGHLOWHIGHLOWmomentary, active HIGHmatches
closed / openHIGHLOWHIGHLOWHIGHmomentary, active LOWmatches
open / closedLOWHIGHHIGHLOWLOWtoggle, active HIGHmatches
closed / closedHIGHLOWLOWHIGHHIGHtoggle, active LOWmatches

The chart shows the difference at a glance. In the momentary modes, OUT copies the finger bars, inverted when jumper A is closed. In the toggle modes, OUT changes only at each touch and stays there after the lift. The top tiles add the timing: 4 of 4 settings measured and matching, touch to OUT 60.000 ms (fast mode) and lift to OUT 60.000 ms.

2. Response Time: Sleeping vs Awake

TTP223 Response time test in Proteus: first touch 220.000 ms in low-power mode, then 60.000 ms in fast mode, release 60.000 ms, the bar chart with the datasheet maximum lines, short contacts of 30, 60, 90 and 150 ms and a row per touch
Figure: Response time, 3 touches: the tall first bar is the sleeping chip (220.000 ms); the 30 ms contact is not reported.

Good for: "knowing how fast a touch reaches OUT - 220 ms while the chip sleeps, 60 ms when awake." Choose 3 or 10 touches, held 400 ms each. The first touch must find the chip asleep, so the tool first waits until 12 s have passed since the last touch, with a countdown. Then it makes the touches after a flat lead-in, and finally it tries four short contacts in fast mode.

Response time, 3 touches of 400 ms (U2, RESPONSE AUTO)
TouchBA6 modeContact to OUTLift to OUTOUT active
1low power220.000 ms60.000 ms0.24 s
2fast60.000 ms60.000 ms0.40 s
3fast60.000 ms60.000 ms0.40 s

The orange bar reaches the dashed 220 ms line, the datasheet maximum in low-power mode; the green and blue bars sit on the 60 ms line. The OUT active times show the cost of a sleeping chip: 0.24 s instead of 0.40 s for the same 400 ms touch. Under SHORT CONTACTS, 30 ms is not reported, while 60, 90 and 150 ms are, so the shortest contact seen is 60 ms. Do you want 60 ms all the time? Set RESPONSE to FAST.

3. Max On Time: Why a Long Press Drops Out

TTP223 Max on time test in Proteus: OUT active for 10.000 s, then OUT LOW - idle with the finger still on, a tap 0.52 s after the lift ignored during the re-calibration and a tap 1.62 s after the lift reported in 60 ms
Figure: Max on time: OUT drops after 10.000 s with the finger still on; after the lift, a tap at +0.52 s is ignored and one at +1.62 s is reported.

Good for: "knowing why a long press drops out after about 10 s - and that the finger must be lifted." The tool holds the finger on for MAXON 10 s + 3 s, lifts it, and then taps 0.52 s and 1.62 s after the lift. Its table tells the story:

Max on time (U2, MAXON 10)
AtWhat happenedMeasured
0.000 sThe finger lands on the padThe contact
0.220 sThe chip reports the touchOUT HIGH, 220.000 ms after the contact
10.220 sThe max on time strikesOUT back to idle - active 10.000 s
10.220 sThe finger stays on 3 s more0 new touches, OUT stays LOW
13.220 sThe finger is liftedThe re-calibration starts (1 s)
13.740 sA tap 0.52 s after the liftIgnored - the chip re-calibrates
14.220 sThe re-calibration is doneReady again
14.840 sA tap 1.62 s after the liftReported - 60.000 ms (fast mode)

The finger was on the pad for 13.2 s, but OUT was active for only 10.000 s. At the max on time, the chip re-calibrated with the finger on it, so the 3 extra seconds gave no new touch. After the lift, the 1 s re-calibration runs (the violet band in the chart), and the tap inside it is ignored. The tap after it is reported in 60 ms, because the chip is still awake. With MAXON 0 (OFF), the tool holds the finger for 15 s, and OUT stays active the whole time.

4. Cover Sweep: Which Panel Still Works?

TTP223 Cover sweep test in Proteus: reported through 3 of 4 covers, smallest margin GLASS 5 mm 1.6 x, WOOD 10 mm too thick, and the bar chart of the signal against the touch threshold
Figure: Cover sweep: NONE 3.0 x, PLASTIC 2 mm 2.0 x and GLASS 5 mm 1.6 x are reported; WOOD 10 mm (0.6 x) is too thick.

Good for: "choosing the panel in front of the pad - which material and thickness still work." Choose All four or As set. The tool makes one touch through each cover, held 400 ms, and reads the chip's signal against its threshold and what OUT did from the event log:

Cover sweep (U2; the signal factors are our estimates)
CoverSignalReportedContact to OUTLift to OUTOUT while touched
NONE3.0 xyes220.000 ms (low power)60.000 msHIGH
PLASTIC 2 mm2.0 xyes60.000 ms60.000 msHIGH
GLASS 5 mm1.6 xyes60.000 ms60.000 msHIGH
WOOD 10 mm0.6 xno - too thick--LOW

Every bar above the dashed threshold line (1.0) is reported: 3 of 4 covers. Glass has the smallest margin, 1.6 x, so a thicker glass would be risky. The 10 mm wood gives only 0.6 x: no touch, and OUT stays LOW. The first touch, through no cover, took 220 ms, because the chip had fallen asleep after the Max on time test. The tools refuse to start, with the reason, when the module has no power or another test runs; Response time and Max on time also refuse when the cover is too thick.

Settings and Help

The gear opens Settings: the theme (TEP Dark or Light), the text size (Small, Normal or Large), whether the window opens at Run, and a button that resets the window size.

Settings page of the TTP223 Advance pop-up: theme TEP Dark or Light, text size Small, Normal or Large, open the panel at Run on or off, and reset the window size
Figure: Settings, saved for your Windows user under HKCU\Software\TheEngineeringProjects\TEP TTP223 Advance.

Turn "Open the panel at Run" off, and the window waits until you click OPEN PANEL on the module. The ? icon opens Help & Support: eight cards with their links (the touch sensor board of our forum to report a bug or suggest a feature, this article, a check for updates, donate, our website and the forum), and Copy diagnostics for a bug report: the sensor, the board, the measured values, the events and the test results. A links.ini file next to the DLL can change the links.

Help and Support page of the TTP223 Advance: eight cards with their links to the touch sensor forum board, this article, the donate page, the website and the forum, and the Copy diagnostics button
Figure: Help & Support: every card shows its link; TEP TTP223 Advance v2.0, build 2026-10-09, TEPTTP223.DLL.

TTP223 Touch Lamp with Arduino in Proteus

Open TTP223-Touch-Lamp-ArduinoUnoV3.pdsprj from the Proteus Simulation folder, with TTP223_Touch_Lamp.hex and both DLLs beside it. Its two Arduino UNOs from our Arduino Library for Proteus V3.0 run the same HEX file:

  • NODE 1 - SIMPLE: UNO 1 (ARD1) with the TTP223 Simple (U1) and Serial Monitor U3.
  • NODE 2 - ADVANCE: UNO 2 (ARD2) with the TTP223 Advance (U2) and Serial Monitor U4.

The "lamp" is the UNO's own LED on pin 13. The green LED with its 220 ohm resistor on A0 comes from our demo template; this sketch does not use it.

TTP223 Arduino Proteus circuit running: two Arduino UNOs, the TTP223 Simple with its touch scene, the TTP223 Advance and two TEP Serial Monitors, under the title Touch Sensor Library for Proteus V2.0
Figure: The whole circuit running, without the pop-up windows: NODE 1 - SIMPLE (U1, U3) and NODE 2 - ADVANCE (U2, U4).

Wiring

Demo wiring (the same on both UNOs)
FromToWhy
TTP223 VCC / GND+5 V terminal / groundPower (the PWR LED lights)
TTP223 I/OArduino D2The touch output: HIGH = touched with the factory jumpers
Arduino pin 13The UNO's on-board LEDThe lamp
Serial Monitor RXD / TXD / GNDArduino D1 (TX) / D0 (RX) / groundShows what the Arduino prints, sends what you type
Serial Monitor RXD2Not connectedI/O is one logic line, and the sketch prints what it sees

The chip drives I/O HIGH and LOW itself, so the pin needs no pull-up resistor. D0 and D1 are the UNO's hardware serial pins (see our Introduction to Arduino UNO).

The Arduino Code

The sketch is a touch lamp: every touch switches the lamp, and the Serial Monitor reports each touch with a counter and the held time. It uses no Arduino library. First, the two pins:

const int TOUCH_PIN = 2;      // TTP223 I/O pin
const int LAMP_PIN = 13;      // the "lamp": the UNO's on-board LED

In setup(), I/O becomes an input, the lamp starts off, and the sketch waits 0.6 s for the chip's calibration before it says Ready. The last start line names this library version:

void setup() {
  pinMode(TOUCH_PIN, INPUT);  // the TTP223 drives the pin HIGH and LOW itself, no pull-up needed
  pinMode(LAMP_PIN, OUTPUT);
  digitalWrite(LAMP_PIN, LOW);
  Serial.begin(9600);
  Serial.println("TTP223 Touch Lamp - The Engineering Projects");
  Serial.println("Waiting 0.6 s while the TTP223 calibrates (don't touch the pad)...");
  delay(600);
  Serial.println("Ready - touch the pad to switch the lamp.");
  Serial.println("Touch Sensor Library for Proteus V2.0 - type HELP for the commands.");
}

One function reads the pad. With the factory jumpers, HIGH means touched; after the ACTIVE LOW command, LOW means touched:

bool readTouched() {
  bool high = digitalRead(TOUCH_PIN) == HIGH;    // HIGH = finger on the pad (default)
  return activeLow ? !high : high;
}

The loop reads the commands first, so that ACTIVE LOW or ACTIVE HIGH takes effect before the pin is read:

void loop() {
  readCommands();                                  // (first: ACTIVE LOW / HIGH changes what the pin means)
  bool touched = readTouched();

When the finger lands, the sketch counts the touch, switches the lamp (in FOLLOW mode, it switches it on) and notes the time:

  if (touched && !wasTouched) {                    // the finger just landed
    touchCount++;
    setLamp(followMode ? true : !lampOn);          // switch the lamp (FOLLOW: on)
    touchStart = millis();
    Serial.print("Touched! #");
    Serial.print(touchCount);
    Serial.print(" - lamp ");
    Serial.println(lampOn ? "ON" : "OFF");
  }

When the finger is lifted, the sketch measures how long the pad was held, keeps the longest time and prints it. Then it checks the pad again after 1 ms, about 1000 times a second:

  if (!touched && wasTouched) {                    // the finger was lifted
    lastHeld = millis() - touchStart;
    if (lastHeld > longestHeld) longestHeld = lastHeld;
    if (followMode) setLamp(false);
    Serial.print("Released (held ");
    printHeld(lastHeld);
    Serial.println(")");
  }

  wasTouched = touched;
  delay(1);                                        // check the pad about 1000 times a second
}

The held time is measured on the I/O pin, so it equals the time OUT was active, not the time your finger was on the pad. printHeld() rounds it to 0.01 s:

void printHeld(unsigned long ms) {
  ms += 5;
  Serial.print(ms / 1000);
  Serial.print('.');
  unsigned long hundredths = (ms % 1000) / 10;
  if (hundredths < 10) Serial.print('0');
  Serial.print(hundredths);
  Serial.print(" s");
}

LAMP FOLLOW makes the lamp copy the pad, which is what you need when jumper B is closed and the module toggles by itself:

  } else if (strcmp(text, "LAMP FOLLOW") == 0) {
    followMode = true;
    setLamp(wasTouched);
    Serial.println("Lamp mode: FOLLOW - the lamp is on while the pad is touched.");

ACTIVE HIGH and ACTIVE LOW change what the pin means. The sketch reads the pad again at once, so the change itself never prints a "Touched!":

  } else if (strcmp(text, "ACTIVE HIGH") == 0 || strcmp(text, "ACTIVE LOW") == 0) {
    activeLow = text[7] == 'L';
    wasTouched = readTouched();                  // the new meaning of I/O now - no "Touched!" for it
    if (followMode) setLamp(wasTouched);

HELP prints three short lines that fit the Serial Monitor's Simple interface:

void printHelp() {
  Serial.println("Commands: HELP, STATUS, RESET, LAMP TOGGLE / FOLLOW, ACTIVE HIGH / LOW");
  Serial.println("  LAMP TOGGLE: each touch switches the lamp; FOLLOW: on while touched");
  Serial.println("  ACTIVE LOW: I/O LOW means touched (jumper A closed on the module)");
}

To change the sketch, export a new HEX file and load it into both UNOs; see How to get the HEX file from Arduino. New to Arduino? Start with our Arduino Tutorial for Beginners.

Serial Monitor Commands

Commands of the demo sketch, upper or lower case (quick buttons: U3 STATUS, LAMP FOLLOW, LAMP TOGGLE, HELP; U4 STATUS, ACTIVE LOW, ACTIVE HIGH, HELP)
CommandWhat it does
HELPThe command list (three lines)
STATUSTwo lines: the pad, I/O, the lamp, the touches, the held times (last and longest), the active level and the lamp mode
RESETThe touch counter back to 0
LAMP TOGGLEEach touch switches the lamp (at start)
LAMP FOLLOWThe lamp is on while the pad is touched (for jumper B closed)
ACTIVE HIGHI/O HIGH means touched (jumper A open, at start)
ACTIVE LOWI/O LOW means touched (jumper A closed)

Nothing is printed periodically: the sketch prints a line only when something happens or when you send a command, and every line is shorter than 80 characters. After a LONG HOLD, for example, STATUS answers "Status: pad free, I/O LOW, lamp ON, touches: 3" and "held: last 10.00 s, longest 10.00 s; active HIGH; lamp TOGGLE" (the README's example). An unknown command gets "Unknown command: FOO - type HELP".

How to Run the Demo

  1. Press Run. Both Serial Monitors (9600 baud) and U2's pop-up open, and U3 and U4 print the four start lines. The pads blink amber while the chips calibrate; then the banner says READY.
  2. On U1's panel, click TAP, and TAP again within 12 s: the first touch takes 220 ms, the second only 60 ms. Then hold the board's round pad with the mouse, and try DOUBLE TAP, LONG HOLD, the covers and a row of the mode table.
  3. Close U1's panel with its red X, and open it again with PANEL: CLOSED on the board.
  4. On U2, use the Touch page, then the four tools on the Test tab. If you close jumper A, send ACTIVE LOW on U4, so that the sketch reads the pad right.
  5. Close U2's window and open it again with OPEN PANEL.

Touch Sensor Proteus Simulation Results

The Serial Monitor in Its Simple Interface

Both monitors in this demo run in the Simple interface of our TEP Serial Monitor, as in every monitor screenshot here. Only the log, the send box and one slim toolbar row stay visible (baud rate, follow, pause, search and clear), so the window stays small.

  • Switch to it: right-click the log and choose Simple interface, or press Ctrl+Shift+U.
  • Back to the full view: click the corner button (the expand arrows at the top right), press Esc or Ctrl+Shift+U, or right-click and choose Full interface.
  • Your choice is remembered.

Type commands such as STATUS or LAMP FOLLOW in the send box and press Enter; the quick buttons come back with the full view. Read all about the monitor in TEP Serial Monitor Advance for Proteus.

Start-Up and the First Two Taps

TTP223 Arduino Proteus start-up in the TEP Serial Monitor Simple interface: the four start lines, then Touched! #1 - lamp ON, Released (held 0.14 s), Touched! #2 - lamp OFF and Released (held 0.30 s)
Figure: U4 in the Simple interface: the four start lines, then the two taps of U2's Touch page.
TTP223 Touch Lamp - The Engineering Projects
Waiting 0.6 s while the TTP223 calibrates (don't touch the pad)...
Ready - touch the pad to switch the lamp.
Touch Sensor Library for Proteus V2.0 - type HELP for the commands.
Touched! #1 - lamp ON
Released (held 0.14 s)
Touched! #2 - lamp OFF
Released (held 0.30 s)

These are the two taps of the Touch page above, now seen by the Arduino on UNO 2. The held times are the measured OUT active times: 0.14 s for the first tap, which woke the sleeping chip, and 0.30 s for the second. The lamp on pin 13 went on with the first touch and off with the second.

The Test Tools, Seen by the Arduino

TEP Serial Monitor Simple interface in Proteus: Touched! #16 to #22 with Released (held 0.15 s), (held 10.00 s), (held 0.30 s), (held 0.24 s) and twice (held 0.40 s)
Figure: U4 after the tools: the 150 ms contact, the 10.00 s long press, the tap after the re-calibration, three covers and the Hold.
Touched! #16 - lamp OFF
Released (held 0.15 s)
Touched! #17 - lamp ON
Released (held 10.00 s)
Touched! #18 - lamp OFF
Released (held 0.30 s)
Touched! #19 - lamp ON
Released (held 0.24 s)
Touched! #20 - lamp OFF
Released (held 0.40 s)
Touched! #21 - lamp ON
Released (held 0.40 s)
Touched! #22 - lamp OFF

The test tools move the finger, so the Arduino sees their touches too, and every held time matches a tool's measurement:

  • #16, held 0.15 s: the 150 ms short contact of the Response time tool.
  • #17, held 10.00 s: the Max on time tool. The finger stayed 3 s longer, but OUT was active for 10 s only.
  • #18, held 0.30 s: its tap 1.62 s after the lift. The tap at 0.52 s gave no line, because the chip ignored it.
  • #19 to #21, held 0.24, 0.40 and 0.40 s: the Cover sweep through no cover (the chip was asleep: 220 ms), plastic and glass. The 10 mm wood gave no line at all.
  • #22: the Hold of the featured image, with the finger still on.

This is the strongest test of the library: the times the Arduino measured on its pin agree with the model's own event log and with the test tools.

Troubleshooting

  • The first touch takes longer than the next ones: correct. The sleeping chip needs up to 220 ms; RESPONSE FAST makes it 60 ms always.
  • OUT drops back while the finger is still on the pad: the max on time (MAXON, 10 s). The chip re-calibrates; lift the finger and touch again.
  • A touch is ignored right after Run: the chip calibrates for 0.5 s. A finger on the pad at that time (START HOLD) is ignored until it is lifted.
  • No touch with WOOD 10 mm: the cover is too thick (a signal of 0.6 x the threshold).
  • The sketch prints "Touched!" when you close jumper A: it still reads HIGH as touched. Send ACTIVE LOW.
  • With jumper B closed, the lamp changes only on every second touch: the module already toggles. Send LAMP FOLLOW.
  • The Test tab says "Cannot start: ...": the message gives the reason (no power, another test is running, or the cover is too thick).
  • The part is not simulated, no panel or no monitor window: TEPTTP223.DLL or TEPSERIALMON.DLL is missing from MODELS and the project folder; click OPEN MONITOR on a closed monitor.
  • The Advance pop-up does not appear: click OPEN PANEL on the board, or turn "Open the panel at Run" back on in Settings.
  • The red X does not close the Simple panel: the design holds an older symbol. Replace TEPTTP223.LIB, delete TEPTTP223.IDX and pick the part again.

Things to Know Before Using a Real TTP223 Module

The demo sketch uses no library, so it runs unchanged on a real UNO with a real module. Keep in mind:

  • Supply: the module works from 2.0 to 5.5 V, and I/O swings between 0 V and VCC, so it suits both 3.3 V and 5 V boards. Check the pin order on your board's silkscreen.
  • No pull-up: I/O is the chip's own CMOS output; connect it straight to a digital pin.
  • Jumpers: A and B are solder pads on the back. Set them with the power off (in the model, a change applies at once).
  • Max on time: users report the output dropping after 7 to 12 s of continuous touch; it is not in the BA6 datasheet.
  • Covers: a few mm of plastic or glass work; keep metal away from the pad. Test your own panel, because our cover factors are estimates.

Limitations of the Simulation

  • Not modelled: the analog capacitance and the chip's sampling, the effect of the supply voltage on the timing (the model uses the 3 V maximum values), the 4 s re-calibration cycle while not touched (only the 1 s re-calibration after an ignored finger), the finger's size and position on the pad, water or noise on the pad, and real cover materials beyond the four presets.
  • The model is our own implementation, written from the published TTP223 datasheet and module descriptions; it contains no third-party code. The HEX file contains the Arduino AVR core 1.8.6, which includes LGPL-licensed code; its source code is on GitHub.
  • Speed: about 0.6 x real time for the two-UNO demo (24.5 s simulated in 41.1 s, with U2's window open on the Test page, U1's panel animating and both monitors open).
  • Tested in Proteus 8.5 in October 2026 (the demo, both panels, the four tools, the board pad held with the mouse and every screenshot here) and with 1,440 automatic PC checks, all passed, 29 of them with the real demo sketch on two UNOs. Proteus 7 is not supported.

Do you need more digital sensors for the same kind of sketch? See our Infrared Sensor Library for Proteus V2.0 for obstacles and our PIR Sensor Library for Proteus V4.0 for motion. For a knob instead of a touch pad, try our Rotary Encoder Library for Proteus.

So, that was all about the Touch Sensor Library for Proteus V2.0. I hope the live TTP223 board, the touch scene, the event log and the four test tools make the touch module easy to understand, so your touch lamp or hidden switch works the first time you wire a real module. If you use the Touch Sensor Library for Proteus in a project, please share your feedback in the comments or in our forum, and if you have any questions, ask in the comments and I will help you out. Till the next tutorial, take care and have fun!


Comments

0

Join the conversation