Pro Micro Analog Read Noise

Hallo. Mal wieder ein Problem :slight_smile:

Board: China Pro Micro

Ich will mit einem Piezo-Sensor Vibrationen erfassen und ab einem bestimmten Wert einen kurzen LED-Strip von rot auf grün schalten (für kurze Zeit) und einen Mainboard-Speaker piepsen lassen.

Der Code:

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define LED_PIN 5
#define LED_COUNT 6
const int buzzer = 3;             

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

  Serial.begin(115200);

  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(255); // Set BRIGHTNESS to about 1/5 (max = 255)

  for (int i = 0; i < LED_COUNT; i++){    // Set all LEDs to red
 strip.setPixelColor(i, 255, 0, 0);
 strip.show();
  }
  
}



void loop() {

int val=analogRead(0); // Input piezo sensor
Serial.println(val);
delay(100);

  if (val > 500){
    
  for (int i = 0; i < LED_COUNT; i++){        // Set LEDs GREEN
 strip.setPixelColor(i, 0, 255, 0);
 strip.show();
  }

 tone(buzzer, 4700);
 delay(300);
 noTone(buzzer);
  
  delay(2000);

  for (int i = 0; i < LED_COUNT; i++){      // Reset LEDs RED
 strip.setPixelColor(i, 255, 0, 0);
 strip.show();
  }
  
  }


}

Als Piezo + Board mit 1MOhm + Zener Diode nutze ich folgendes:
https://www.amazon.de/gp/product/B082413VG8/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1

Nun zum Problem: Egal ob der Piezo an Pin 0 angeschlossen ist oder nicht, die Werte die mir der serielle Monitor ausgibt springen wild von 0-250 (ca) hin und her. Woran kann das liegen?

Danke!

Sollte da nicht A0 stehen?

Ein Piezo liefert eine Wechselspannung, d.h. abwechselnd positiv und negativ. Negative Spannungen kann kein Eingang sinnvoll verarbeiten.

Das Hin- und Herspringen ist völlig normal für eine Wechselspannung. Den Maximalwert für die Amplitude muß man per Code ermitteln, oder einen Schwellwert für die Auslösung eines Alarms vorgeben.

Nee, die 0 reicht. Hat mir combie die Tage schön erklärt, analogRead() biegt das passend hin.

Ich habe jetzt mal Folgendes im setup hinzugefügt:

void setup() {
  pinMode(A0, INPUT_PULLUP);
}

Damit bekomme ich am serial monitor relativ "konstante" Werte, es schwankt zwischen 1009-1015 ungefähr, das ist schon ein deutlich kleineres Delta als vorher.
Wenn ich den Piezo über den Widerstand lese passiert absolut gar nichts, lese ich den Piezo direkt aus also ohne Widerstand dann bringt der Werte um die 900 wenn ich ihn antippe. Sollte der Wert nicht eigentlich steigen?!

In einem Tutorial welches ich gesehen habe wird genau die von mir verwendete Piezo-Schaltung verwendet, dort gibt der serielle Monitor in Ruhe exakt 0 aus und bei antippen deutliche Werte im positiven Bereich. Wo liegt mein Fehler?

Wie, wo?

Ansonsten denke ich, das die Platine schon von Haus aus was falsches suggeriert.

Keyes ist richtig beschriftet - mit Code:
https://wiki.keyestudio.com/Ks0272_keyestudio_Analog_Piezoelectric_Ceramic_Vibration_Sensor

Hab ich jetzt mal so nachgebaut. Wenn ich den Sketch hochlade hab ich am Anfang einen Wert von etwas über 1000, tippe ich den Pieze an fällt der Wert auf ca 900 und bleibt dann eine weile so, tippe ich weiter an fällt der Wert plötzlich auf 0-20 und geht dann ohne erneut anzutippen von alleine wieder auf 700 und mehr hoch...

Kann es sein dass das Pro Micro dafür einfach ungeeignet ist? Ich werd es wohl am besten mal mit einem Nano versuchen

Nö, das liegt an dem Platinchen zu dem es weder eine ordentliche Beschreibung noch Beispielcode gibt. Oder an Deinen falschen Erwartungen, was für ein Signal der Sensor mit diesem Platinchen liefern kann.

Naja, klar ist das ne billige China-Platine, aber ich könnte wetten (ja, wissen tu ichs nicht) dass das 1:1 ein Rip-Off ist. Mit nem Widerstand und ner Diode wird man ja nicht so viel falsch machen können?
Ich hatte folgendes Tutorial gesehen:

Was mich wundert: Im Video geht GND auf GND und Plus auf A0, Signal wird ignoriert, damit bekommt er im Video ganz saubere Werte.
Im Link zum Wiki-Eintrag bekommt die Piezo-Platine 5V eingespeißt, GND geht auf GND, Signal geht auf A0.

Hier sind aber nur 2 Strippen dran. Wohl GND und Signal. Wo siehst Du Plus?

Gruß Tommy

Im Video? Er sagt: "Verwendet werden aber nur zwei Litzen, Plus und Minus". Aber ja, schaut man genau hin dann verwendet er schwarz und blau... Leider ist auf dem Board nicht zu erkennen welcher Ausgang welche Farbe hat, aber Rot für Plus und Blau für Signal wäre schon sinnvoll

Edit: Mal GND an GND und Signal an A0 geklemmt... Nach dem Upload ist mein Wert an A0 bei ca 30, schwankt aber wieder deutlich in Ruhe. Tippe ich den Piezo relativ kräftig an dann springt der Wert auf ca 600 und pegelt sich dann über einige Sekunden bei 400-500 ein, dort bleibt er dann... Ich versteh es nicht :smiley:

Der Piezo ist ein Kondensator, der sich hier über die Diode mit Gleichspannung auflädt. Dann fehlt ein Widerstand, der ihn wieder (langsam) entlädt. Oder den Analogeingang vorübergehend zum Digitalausgang machen und den Piezo auf LOW entladen. Evtl. mit Serienwiderstand zur Strombegrenzung des Ausgangs.

Ich hab jetzt nochmal ein paar passende Z-Dioden bestellt und bau die Schaltung inkl 1MOhm Widerstand nochmal selber auf, falls bis dahin keiner noch eine Idee hat melde ich mich dann was dieser Versuch gebracht hat, sobald die Dioden da sind

Du bist Dir schon bewußt daß Du die Neopixel hintereinander einschaltest aud nicht gleichzeitig. Der Unterschied ist zwar bei 6 Neopixel nicht gravierend aber bei vielen Neopixel sehr bemerkbar.

Willst Du alle Neopixel gleichzeitig einschalten dann muß das show aus der FOR Schleife raus.

  for (int i = 0; i < LED_COUNT; i++){        // Set LEDs GREEN
 strip.setPixelColor(i, 0, 255, 0);
  }
 strip.show();

Grüße Uwe

Wenn du uns auch mal den Link von dem tollen Tutorial posten würdest, dann könnten wir besser nachvollziehen was du uns mitteilen möchtest.

Ok, sorry, habe jetzt gesehen, das es nicht nur ein Bild ist.

Richtig ist schon, daß nur 2 Anschlüsse des Piezo-Sensor-Boards verwendet werden. Nämlich Signal (oder Sig oder S) an den Analog-Eingang und "-" (oder GND) an GND vom Arduino. Der "+"-Anschluss ist nirgendwo angeschlossen und führt eigentlich immer ins Leere.
Leider ist es (trotz der Schlichtheit des Moduls) nicht immer ein 1:1 Nachbau! Es gibt auch welche, bei denen "-" (schlecht verbaut oder schlecht kopiert) keinen Kontakt hat und nicht mit Widerstand und Diode verbunden ist! Überprüf also mal bitte, ob "-" auf dem Modul auch tatsächlich die nötige Verbindung zu diesen hat. Ansonsten können Spannungen weit über den zulässigen 5V deinen Analogpin erreichen und zerstören.
Ansonsten habe ich hier noch ein nettes Tutorial gefunden, das sich mit dem Piezo als Klopfsensor beschäftigt.

Danke für den Hinweis @uwefed

@derGeppi :
also GND Eingang zu GND/- Ausgang ist verbunden, allerdings quasi ohne Widerstand

Edit: Problem gelöst. Das Board ist tatsächlich falsch, oh man. Bei einem baugleichen Piezo-Board auf Amazon habe ich in den Rezensionen die Lösung gefunden:
Widerstand und Diode haben eine unverbundene Seite und gehen nicht auf GND. Völlig sinnlos. Hab jetzt die jeweils "offene" Seite von Widerstand und Diode auf dem Board mit GND am Steckverbinder verlötet und bekomme wenn ich "Signal" und "GND" mit dem Arduino verbinde ganz saubere Werte.