Piezosensor mit Arduino

Als vorbereitende Versuche für ein kleine Projekt von mir, wollte ich eine weitere Komponente neben dem Vibrationsmotor testen: Einen druckempfindlichen Piezo-Sensor, der über einen Arduino gesteuert drei LEDs zum Aufleuchten bringt, je nach Druckintensität.

Ex. 1: Druckempfindlichkeit des Piezosensors

Video: Live-Demonstration

Funktionsweise

Schaltplan
Abb.: Schaltplan

Piezo-Elemente können als polarisierte Spannungsquellen betrachtet werden, wobei die Spannung anhand des auf sie einwirkenden mechanischen Drucks sehr unterschiedlich sein kann. Daher ist hier eine Zener-Diode zwischengeschaltet, die Spannungen jenseits der 5V ableitet und somit den Eingang des Arduinos schützt. Ein zusätzlicher Widerstand soll dabei helfen den Stromfluss zu steuern und kann somit die Empfindlichkeit des Piezos steuern. Je höher der Widerstand, desto mehr Strom fließt in den Eingang des Arduino.
An die digitalen Pins 8, 9, und 10 sind drei verschiedenfarbige LEDs mit Vorwiderständen angeschlossen, die je nach Druckintensität aufleuchten sollen.

Anschlüsse des Piezo-Elements
Abb.: Anschlüsse des Piezo-Elements

Verwendete Bauteile

Aufbau & Funktionsweise

Aufbau der Schaltung
Abb.: Aufbau der Schaltung

Sketch

const int PIEZO_PIN = A0;

const int LED_PIN_GREEN  = 10;
const int LED_PIN_ORANGE = 9;
const int LED_PIN_RED    = 8;

const int THRESHOLD_1 = 150;
const int THRESHOLD_2 = 400;
const int THRESHOLD_3 = 950;

const int SENSITIVITY = 150;
int sensorValue = 0, oldSensorValue = 0;

void setup()
{
    pinMode(LED_PIN_GREEN,  OUTPUT);
    pinMode(LED_PIN_ORANGE, OUTPUT);
    pinMode(LED_PIN_RED,    OUTPUT);
}

void loop()
{
    sensorValue = analogRead(PIEZO_PIN);
    if (sensorValue >= SENSITIVITY && sensorValue > oldSensorValue) {
        oldSensorValue = sensorValue;
    }
    if (sensorValue < SENSITIVITY && oldSensorValue > 0) {
        oldSensorValue = 0;
    }

    if (oldSensorValue > THRESHOLD_3) {
        digitalWrite(LED_PIN_RED, HIGH);
        delay(150);
        digitalWrite(LED_PIN_RED, LOW);
    } else if (oldSensorValue > THRESHOLD_2) {
        digitalWrite(LED_PIN_ORANGE, HIGH);
        delay(150);
        digitalWrite(LED_PIN_ORANGE, LOW);
    } else if (oldSensorValue > THRESHOLD_1) {
        digitalWrite(LED_PIN_GREEN, HIGH);
        delay(1 50);
        digitalWrite(LED_PIN_GREEN, LOW);
    }
}

Ex. 2: Piezosensor über Interrupts verarbeiten

Eine weitere Möglichkeit einen Piezo-Sensor über einen Arduino anzusteuern ist mittels eines Interrupts. Allerdings kann hier nur ein binäres Signal ausgelesen werden, d.h. nur ob der Piezo ausgelöst wurde und nicht wie stark er gedrückt wurde.

Schaltplan
Abb.: Schaltplan

Verwendete Bauteile

Aufbau der Schaltung
Abb.: Aufbau der Schaltung

Sketch

const int PIEZO_PIN = 2;

const int LED_PIN  = 12;
const int LED_ON_THRESHOLD = 2000;

volatile bool ledOn = false;
unsigned long currentMillis = 0, lastTappedMillis = 0, lastLedOnMillis = 0;

void setup()
{
    Serial.begin(9600);
    pinMode(LED_PIN, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(PIEZO_PIN), handlePiezo, RISING);
}

void loop()
{
    currentMillis = millis();

    if (ledOn == true && currentMillis - lastLedOnMillis >= LED_ON_THRESHOLD) {
        digitalWrite(LED_PIN, LOW);
        ledOn = false;
        Serial.println("LED ready again");
    }
}

void handlePiezo()
{
    if(ledOn == false) {
        Serial.println("tapped");
        ledOn = true;
        lastLedOnMillis = millis();
        digitalWrite(LED_PIN, HIGH);
    }
}
zurück