zurück

Piezosensor mit Arduino

20.11.2017

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 sind polarisiert, d.h. der Strom fließt durch sie (oder aus ihnen heraus) in einer bestimmten Richtung. Daher sollte immer ein hoher Widerstand (hier: 1MΩ) parallel zum Piezo geschaltet werden, um den analogen Input-Pin vor der entstehenden Spannung aus dem Piezo zu schützen.
An die digitalen Pins 8, 9, und 10 sind drei verschiedenfarbige LEDs mit Vorwiderständen angeschlossen, die je nach Druckintensität aufleuchten sollen.

Verdrahtung des Piezo
Abb.: Verdrahtung des Piezo

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);
    }
}