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 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.
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