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