In diesem Beitrag möchte ich dir zeigen wie du mit zwei kapazitiven Touch Sensoren ein Relaisshield steuern kannst.
Ziel
Das Ziel dieses Projektes ist es mit einem Touch Sensor ein Relais zu schalten welches “selbständig” nach 5 Sekunden abfällt und der andere Touch Sensor ein Relais schalten kann.
Hintergrund zu diesem kleinen Projekt
Die Idee zu diesem Projekt kam über ein Kommentar zum Beitrag Arduino Projekt: Relaiskarte mit Reedkontakten steuern.
Solltest du auch Ideen haben oder Hilfe benötigen, dann kommentiere einfach den entsprechenden Beitrag oder schreibe mir per E-Mail oder über das Kontaktformular.
benötigte Bauteile für dieses Projekt
Für den Nachbau dieses Projektes benötigst du folgende Bauteile:
- einen Arduino UNO*,
- ein USB Datenkabel
- zwei kapazitive Touch Sensoren,
- min. ein zweifach Relaisshield
- diverse Breadboardkabel,
- ein 170 / 400 Pin Breadboard
* Du kannst natürlich auch jeden anderen Microcontroller der Arduino Familie nutzen. Du benötigst lediglich 4 digitale Pins sowie GND und 5V somit kannst du auch den etwas günstigeren Arduino Nano verwenden.
Zusätzlich verbaue ich noch eine grüne, 5mm LED (mit dazugehörigem 220 Ohm Widerstand)
Aufbau & Anschluss
Bauteil | Arduino UNO |
---|---|
LED | |
Anode | digitaler Pin D5 |
Kathode | GND |
kapazitiver Touch Sensor I | |
GND | GND |
I/O | digitaler Pin D9 |
VCC | 5V |
kapazitiver Touch Sensor II | |
GND | GND |
I/O | digitaler Pin D8 |
VCC | 5V |
zweifach Relaisshield | |
VCC | 5V |
IN1 | digitaler Pin D7 |
IN2 | digitaler Pin D6 |
GND | GND |
Programmieren
Für das Programmieren des Sketches verwende ich die Arduino IDE. Du benötigst für das Programm keine zusätzlichen Bibliotheken!
Schritt 1 – definieren der Pins
Zunächst definieren wir an welche Pins wir die Sensoren / Aktoren angeschlossen haben. Ich verwende hier die Schreibweise mit “#define” natürlich kannst du auch mit “int sensor = 5;” arbeiten, das Ergebnis ist jeweils das gleiche. Der Vorteil mit “#define” ist das weniger Speicherplatz belegt / reserviert wird.
#define led 5 #define relais1 6 #define relais2 7 #define touch1 8 #define touch2 9
Schritt 2 – definieren welche Pins als Ein / Ausgang dienen sollen
Nachdem wir definiert haben an welche Pins die Sensoren / Aktoren angeschlossen sind müssen wir noch definieren ob diese als Eingang (für die Touch Sensoren) oder als Ausgang (LED & Relaisshield) agieren sollen.
void setup() { pinMode(led, OUTPUT); pinMode(relais1, OUTPUT); pinMode(relais2, OUTPUT); pinMode(touch1, INPUT); pinMode(touch2, INPUT); }
Zusätzlich wird in der Funktion “setup” noch die Relais initial deaktiviert.
digitalWrite(relais1, HIGH); digitalWrite(relais2, HIGH);
Schritt 3 – lesen der Zustände der kapazitiven Touch Sensoren
Mit der Funktion “digitalRead” können wir lesen ob der Touch Sensor berührt wurde. die Funktion liefert uns ein HIGH / 1 zurück wenn dieser berührt wurde, ansonsten LOW oder 0.
void loop() { if(digitalRead(touch1)==HIGH){} if(digitalRead(touch2)==HIGH){} }
Schritt 4 – aktivieren / deaktivieren der Relais
In die zuvor geschriebenen If-Bedingungen schreiben wir nun welche Aktion stattfinden soll.
Wenn der Touch Sensor 1 betätigt wird soll das Relais1 sowie die LED aktiviert werden.
Wenn der Touch Sensor 2 betätigt wird soll das Relais2 aktiviert bzw. deaktiviert werden.
int relais2Status = 0; void loop() { if(digitalRead(touch1)==HIGH){ digitalWrite(relais1, LOW); digitalWrite(led, HIGH); } if(digitalRead(touch2)==HIGH){ relais2Status = relais2Status==0?1:0; digitalWrite(relais2, relais2Status); } }
Schritt 5 – starten / stoppen eines “Timers” für ein Relais
Im letzten Schritt programmieren wir eine Funktion welche prüft ob eine Zeitspanne überschritten wurde um dann die LED sowie das Relais zu deaktivieren.
Wir benötigen dazu eine Konstante welche den Wert für den Abstand zwischen zwei Zeiten festlegt sowie eine Variable zum speichern des letzten Zeitstempels.
const int PAUSE = 5000; int lastMillis = 0; void setup(){ doTimer(); lastMillis = millis(); ... } void doTimer(){ int currentMillis = millis(); if((currentMillis - PAUSE) > lastMillis){ lastMillis = currentMillis; digitalWrite(relais1, HIGH); digitalWrite(led, LOW); } }
der fertige Code
#define led 5 #define relais1 6 #define relais2 7 #define touch1 8 #define touch2 9 int relais2Status = 0; const int PAUSE = 5000; int lastMillis = 0; void setup() { pinMode(led, OUTPUT); pinMode(relais1, OUTPUT); pinMode(relais2, OUTPUT); pinMode(touch1, INPUT); pinMode(touch2, INPUT); digitalWrite(relais1, HIGH); digitalWrite(led, LOW); digitalWrite(relais2, LOW); lastMillis = millis(); } void loop() { doTimer(); if(digitalRead(touch1)==HIGH){ digitalWrite(relais1, LOW); digitalWrite(led, HIGH); } if(digitalRead(touch2)==HIGH){ relais2Status = relais2Status==0?1:0; digitalWrite(relais2, relais2Status); } } void doTimer(){ int currentMillis = millis(); if((currentMillis - PAUSE) > lastMillis){ lastMillis = currentMillis; digitalWrite(relais1, HIGH); digitalWrite(led, LOW); } }