Problema con Piezzo come rivelatore di vibrazioni

Buon giorno,
dopo un po' di prove sono al mio primo progetto con uno scopo.

Il programma dovrebbe accendere 3 led ogni volta che il piezzo viene sollecitato e progressivamente spegnerli. Se viene risollecitato si riaccendono e ripartono a calare progressivamente (in allegato lo schema). uso arduino Uno R3.

lo sketch:

int Movimento=0;
const int PinMovimento=A0;
const int PinMov=2;
const int PinLed=3;
const int PinLed2=5;
const int PinLed3=9;
unsigned int residuoMovimento=0;
unsigned int tempi=millis();
unsigned int tempodireazione=100;
unsigned int sensibilita=2;
unsigned int a=0;
char dba=1;

void ricarica(int quanto){
  a++;
  if (a<5){
  residuoMovimento=255;
  if (dba){    Serial.print("\t a: ");}
  if (dba){    Serial.println(a);}
  }
}

void setup() {
if (dba){Serial.begin(9600);}
pinMode(PinMov,OUTPUT);
pinMode(PinLed,OUTPUT);
pinMode(PinLed2,OUTPUT);
pinMode(PinLed3,OUTPUT);
}

void loop() {
    Movimento=analogRead(PinMovimento);
    //delay(2);
    if (Movimento>sensibilita){
if (dba){    Serial.print("\t Movimento: ");}
if (dba){    Serial.println(Movimento);}
    ricarica(Movimento);
if (dba){    Serial.print("\t residuoMovimento: ");}
if (dba){    Serial.println(residuoMovimento);}
    }
    if (((millis()-tempi)>tempodireazione) && (residuoMovimento>0)){
      residuoMovimento=residuoMovimento-5;
if (dba){      Serial.println(constrain(residuoMovimento,0,255));}
      analogWrite(PinLed, constrain(residuoMovimento,0,255));
      analogWrite(PinLed2, constrain(residuoMovimento,0,255));
      analogWrite(PinLed3, constrain(residuoMovimento,0,255));
      tempi=millis();
      if (residuoMovimento==0){a=0;}
    }
}

Problema1: quando collego 1 solo led il piezzo ha una sensibilità ragionevole, quando sono collegati 3 led praticamente sempre va in loop registrando un micro movimento, ho sistemato un po' le cose ritardando la lettura successiva e introducendo una tolleranza ma qualche volta va in loop leggendo sempre lo stesso valore anche con valori maggiori.

Problema2: se collegato via usb i cicli hanno un tempo, se lo collego via usb ad un alimentatore (quello della apple 1A-5V) il ciclo è tutto sballato (molto più istantaneo).

avete un suggerimento su dove ricercare il problema? Credo che il problema stia nei collegamenti o nel metodo in cui ho collegato l'hardware.

La variabile a è un bruttissimo sistema per uscire dal loop quando ci entra ma non è un sistema decoroso...
Grazie,
T.

Un dischetto piezo, per usarlo come rilevatore di vibrazioni, andrebbe sempre collegato usando un diodo, o meglio ancora uno zener, per proteggere il pin di ingresso ... questo perche' i dischi piezo, prima di tutto, producono tensione che puo avere polarita' sia positiva che negativa, secondo il verso in cui sono flessi dalle vibrazioni, e secondo, se le vibrazioni sono forti, e' un'attimo trovarsi con impulsi anche di alcune decine di volt, sia pure brevi, e friggere un pin ... quindi, resistenza da 100 ohm in serie, seguita da uno zener fra il pin e massa (zener da 5V, catodo al pin), sarebbero sempre da usare ... :wink:

Quindi mi suggerisci di aggiungere una resistenza100ohm+diodo tra il piezo e il collegamento al pin A0.
Pensi sia questo il problema o questa è comunque una indicazione di massima per questo genere di circuito?

Potrebbe risolvere il problema 1 (verifico), ma mi sfugge ancora qualcosa per il problema 2.

Ti ringrazio molto.
T.

Up date, il problema 2 era di diversa natura, mettendo un buon numero di controlli nel mezzo mi sono accorto che salvavo i valori millis() in una variabile int e non long e quindi passato un certo tempo tutti i confronti sballavamo.

Rimane il problema 1 che non si è risolto, forse il piezo non è il sistema corretto per rilevare il movimento?
Grazie,
T.

Dipende da che tipo di movimento ... i piezo sono migliori per vibrazioni, impulsi brevi e veloci, e cosi via ,,, se devi rilevare vibrazioni piu lente, un sistema elettromagnetico (bobina e calamita, detto in parole povere), e' piu efficente ... se devi rilevare spostamenti lenti ed anche misurarli, una bobina trasmittente e due riceventi coassiali sono ancora meglio ... dipende tutto dal tipo di vibrazione ... inoltre anche i piezo, se devono funzionare come rilevatori di vibrazione, funzionano meglio se sono fissati solo da un lato, magari con un piccolo pesettino incollato dall'altro lato ...