Skip to content

Commit 0663003

Browse files
committed
Implement touch button on Teensy 3.2
1 parent 04a17d6 commit 0663003

File tree

4 files changed

+150
-3
lines changed

4 files changed

+150
-3
lines changed

Configuration.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,18 @@
180180
*/
181181
#define BUTTON_TRESHOLD 300
182182

183+
// Buttons sind kapazitive Button (Teensy)
184+
#define TOUCHBUTTONS
185+
186+
//! Wie viele samples gesammelt werden, bis der Durchschnitt als stabil erachtet wird
187+
#define TOUCHSAMPLES 1500
188+
189+
//! Minimal Erhöhung des Wertes, um mal als berüht zu gelten
190+
#define TOUCHTHRESHOLD 30
191+
192+
//! Nummer der Samples die über dem Durchschnitt liegen müssen, vermeidet spontanes Rauschen
193+
#define NUMTOUCHSAMPLES 3
194+
183195
// ------------------ DCF77-Empfaenger ---------------------
184196
/*
185197
* Fuer wieviele DCF77-Samples muessen die Zeitabstaende stimmen, damit das DCF77-Telegramm als gueltig zaehlt?

Qlockthree.ino

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@
191191
#include "MyDCF77.h"
192192
#include "Button.h"
193193
#include "AnalogButton.h"
194+
#include "TouchButton.h"
194195
#include "LDR.h"
195196
#include "DCF77Helper.h"
196197
#include "Renderer.h"
@@ -213,7 +214,7 @@
213214
Serial-Monitor muss mit der hier angegeben uebereinstimmen.
214215
Default: ausgeschaltet
215216
*/
216-
// #define DEBUG
217+
#define DEBUG
217218
#include "Debug.h"
218219
// Die Geschwindigkeit der seriellen Schnittstelle. Default: 57600. Die Geschwindigkeit brauchen wir immer,
219220
// da auch ohne DEBUG Meldungen ausgegeben werden!
@@ -500,8 +501,8 @@ LedDriverLPD8806 ledDriver(13, 11);
500501
#define PIN_SPEAKER -1
501502
#elif defined(BOARD_TEENSY)
502503
LedDriverLPD8806 ledDriver(7, 14);
503-
#define PIN_MODE 15
504-
#define PIN_M_PLUS 16
504+
#define PIN_MODE 16
505+
#define PIN_M_PLUS 15
505506
#define PIN_H_PLUS 17
506507

507508
#define BUTTONS_PRESSING_AGAINST LOW
@@ -591,13 +592,21 @@ byte brightnessToDisplay;
591592
/**
592593
Die Tasten.
593594
*/
595+
#ifdef TOUCHBUTTONS
596+
TouchButton minutesPlusButton(PIN_M_PLUS);
597+
TouchButton hoursPlusButton(PIN_H_PLUS);
598+
DoubleTouchButton extModeDoubleButton(minutesPlusButton, hoursPlusButton);
599+
TouchButton modeChangeButton(PIN_MODE);
600+
#else
594601
Button minutesPlusButton(PIN_M_PLUS, BUTTONS_PRESSING_AGAINST);
595602
Button hoursPlusButton(PIN_H_PLUS, BUTTONS_PRESSING_AGAINST);
596603
Button extModeDoubleButton(PIN_M_PLUS, PIN_H_PLUS, BUTTONS_PRESSING_AGAINST);
597604
Button modeChangeButton(PIN_MODE, BUTTONS_PRESSING_AGAINST);
605+
#endif
598606

599607
// Startmode...
600608
Mode mode = STD_MODE_NORMAL;
609+
//Mode mode = EXT_MODE_TEST;
601610
// Merker fuer den Modus vor der Abschaltung...
602611
Mode lastMode = mode;
603612

TouchButton.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include "TouchButton.h"
2+
#include "Configuration.h"
3+
4+
5+
bool TouchButton::pressedRaw()
6+
{
7+
return getState();
8+
}
9+
10+
11+
bool TouchButton::pressed()
12+
{
13+
if (getState()) {
14+
if(millis() - _lastPressTime > BUTTON_TRESHOLD) {
15+
_lastPressTime = millis();
16+
return true;
17+
}
18+
}
19+
return false;
20+
}
21+
22+
/**
23+
* Wurde der Taster gedrueckt?
24+
*/
25+
boolean TouchButton::getState() {
26+
if (lastRead == millis())
27+
return state;
28+
boolean _retVal = false;
29+
30+
int t = touchRead(pin);
31+
samples++;
32+
33+
const float alpha=0.1;
34+
35+
// Moving exponential average
36+
idleAvg = (alpha * t) + (1.0 - alpha) * idleAvg;
37+
38+
if (t > idleAvg + TOUCHTHRESHOLD && samples > TOUCHSAMPLES)
39+
samplesTouched++;
40+
else
41+
samplesTouched=0;
42+
43+
if (t > idleAvg + TOUCHTHRESHOLD)
44+
Serial.printf("%d: t %d, tavg %.1f, %d -> %d\r\n", pin, t, idleAvg,(int) (t- idleAvg), samplesTouched);
45+
46+
state = (samplesTouched > NUMTOUCHSAMPLES);
47+
return state;
48+
49+
}
50+

TouchButton.h

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* Button
3+
* Kleine Klasse zum Entprellen der Tasten.
4+
*
5+
* @mc Arduino/RBBB
6+
* @autor Christian Aschoff / caschoff _AT_ mac _DOT_ com
7+
* @version 1.7
8+
* @created 18.2.2011
9+
* @updated 16.2.2015
10+
*
11+
* Versionshistorie:
12+
* V 1.1: - Kompatibilitaet zu Arduino-IDE 1.0 hergestellt.
13+
* V 1.2: - Optimierung hinsichtlich Speicherbedarf.
14+
* V 1.3: - Verbessertes Debugging.
15+
* V 1.4: - Doppel-Tasten-Abfrage ermoeglicht.
16+
* V 1.5: - Ueberlauf in millis() beruecksichtigt.
17+
* V 1.6: - Schalten gegen LOW ermoeglicht.
18+
* V 1.7: - Unterstuetzung fuer die alte Arduino-IDE (bis 1.0.6) entfernt.
19+
*/
20+
#ifndef TOUCHBUTTON_H
21+
#define TOUCHBUTTON_H
22+
23+
#include "Arduino.h"
24+
#include "Configuration.h"
25+
26+
class TouchButton {
27+
public:
28+
/**
29+
* Initialisierung mit dem Pin, an dem der Taster haengt.
30+
*
31+
* @param pin: der Pin, an dem die Touchfläche hängt
32+
*/
33+
TouchButton(byte pin): state(false), pin(pin), samples(0), samplesTouched(0), idleAvg(0) {}
34+
bool pressedRaw();
35+
bool pressed();
36+
bool getState();
37+
38+
private:
39+
bool state;
40+
uint8_t pin;
41+
int samples;
42+
int samplesTouched;
43+
double idleAvg;
44+
long lastRead;
45+
unsigned long _lastPressTime;
46+
};
47+
48+
49+
class DoubleTouchButton {
50+
TouchButton & b1;
51+
TouchButton & b2;
52+
unsigned long _lastPressTime;
53+
54+
public:
55+
DoubleTouchButton(TouchButton & button1, TouchButton & button2):
56+
b1(button1), b2(button2) {}
57+
58+
bool pressedRaw ()
59+
{
60+
return b1.pressedRaw() && b2.pressedRaw();
61+
}
62+
63+
bool pressed()
64+
{
65+
if (pressedRaw()) {
66+
if(millis() - _lastPressTime > BUTTON_TRESHOLD) {
67+
_lastPressTime = millis();
68+
return true;
69+
}
70+
}
71+
return false;
72+
}
73+
};
74+
75+
76+
#endif

0 commit comments

Comments
 (0)