Primo programma: Sensore di movimento e gestione led

Stavo cercando di tirare su il primo programma con Arduino ONE, un minimo di funzionalità la ho raggiuntà ma ora sto cercando di ottimizzarlo al massimo.
Il programma deve semplicemente leggere il valore di un sensore di movimento a vibrazione (M524*) che funziona con una pallina che apre e chiude un interruttore ritornando diciamo uno 0 e 1 (non sono esperto in elettronica però!)
Ho consultato il data sheet trovato in rete e ho montato il tutto sull'Arduino:

Al pin digitale 4 ho messo il sensore, la sua gnd la ho collegata lla GND tra i pin analogici poi ho messo la resistenza(10k) di pull up tra 5v sull'arduino e il sensore.
Anche sui led ho messo delle resistenze (da 2.2k) perchè ho letto sul sito che è meglio fare così onde evitare problematiche al device.

Insomma, per ora fa quel poco che ho chiesto di fare.. quando riceve una scossa si accende il led verde a cui ho impostato un delay perchè altrimente varierebbe acceso spento velocissisamente
Vi posto il codice opportunamente commentato:

int valSensore = 0; //dichiaro variabile per la lettura del valore del sensore di movimento
int sensore = 4; //dichiaro che al pin 4 c'è il sensore di movimento

void setup(){
pinMode(13,OUTPUT); // Inizializzo pin 13 a cui c'è collegato il Led Rosso
pinMode(9,OUTPUT); // Inizializzo pin 9 a cui c'è collegato il Led Verde
pinMode(sensore,INPUT);
}

void loop(){
  
  valSensore = digitalRead(sensore); //leggo il valore del sensore
  if (valSensore != 0) //se diverso da 0
  {
    digitalWrite(9,HIGH); //Accendo il led verde e lo tengo acceso per 0.5s
    delay(500);
  }
  else //in qualsiasi altro caso
  {
    digitalWrite(9,LOW); //spendo il led verde e accendo quello rosso <- !! 
    digitalWrite(13,HIGH);
  }
}

Ora vorrei semplicemente capire perchè non si spegne il led rosso in altro caso! Avevo risolto ma avevo riscontrati altri problemi!
Sicuramente devo impostare un delay(); da qualche parte per ovviare a questi rapidi cambiamenti stato!

Inoltre, stavo anche cercando di sviluppare una eventuale versione due in cui ha seconda dell'intensità della vibrazione accenderò certi LED.
Ho notato che impostando un delay prima dell'IF con più o meno valore riuscivo a gestire molto sommariamente l'intensità.. vorrei qualche delucidazione in merito!

Federico0:
Inoltre, stavo anche cercando di sviluppare una eventuale versione due in cui ha seconda dell'intensità della vibrazione accenderò certi LED.
Ho notato che impostando un delay prima dell'IF con più o meno valore riuscivo a gestire molto sommariamente l'intensità.. vorrei qualche delucidazione in merito!

con il sensore collegato al pin digitale, dubito che riuscirai a leggere l'intensità del sensore. Su quei pin avrai solo due valori 0 e 1.
Devi collegare il sensore ad un pin analogico per individuare l'intensità della vibrazione.... ma dipende anche dal sensore: se il sensore fornisce un segnale digitale (0 vibra e 1 non vibra o viceversa) noi avrai mai l'informazione sull'intensità di vibrazione.

posta il link del datasheet del sensore.

Non penso ritorni una intensità di vibrazione perchè dallo schema alla fine c'è un interruttore o passa la corrente o non passa e quindi penso che si possa usare anche sul pinning digitale di arduino, pensavo di agire con una sorta di campionamento ? non saprei!
Comunque qui trovi il datasheet.

conta gli impulsi HIGH, poi attivi un timer al primo impulso e termini il timer quando non arrivano più impulsi entro chessò 20 ms, sai quanto tempo è durata la vibrazione in ms e +/- dal num di impulsi l'intensità.

ciao

questa mi sembra un ottima soluzione, forse un po' troppo avanzate per ora ma voglio provare a realizzarla!

Grazie!

la soluzione indicata da pablos è una buona soluzione in quanto la durata dell'impulso dipende dalla quantità di energia assorbita dal sensore durante l'urto.

Secondo il datasheet puoi collegate il sensore anche ad un pin analogico e seguendo lo schema del damping, al posto del 7414 lo mandi al pin analogico di arduino.
La resistenza massima fornita dal dispositivo è di 100 Ohm ma non ho capito se è proporzionale alla vibrazione (non viene specificato o almeno io non l'ho visto).
Puoi fare una prova e vedere se funzica... in questo caso, al pin di arduino dovresti avere una tensione compresa tra 0 e 2.5 V a sencondo dell'intensita di vibrazione del sensore.

Federico0:
Stavo cercando di tirare su il primo programma con Arduino ONE, ...

Che modello é il Arduino ONE??

Ciao Uwe

scusate, non stavo pensando molto e mi è venuto da scrivere one anzichè uno.

In ogni caso il fine settimaa ho avuto un po' di impegni e non sono potuto stare molto al computer.

Solo domenica ho trovato un po' di tempo per riguardare un po' il codice.

Ho fatto una nuova versione che praticamente uso la porta seriale per calcolare quanti impulsi riceve all'urto e rendermene conto e poi accendo un led approssimatamente alla velocità con cui vibra

Spero non abbiate letto il post precedente!

// Contatore di impulsi v2.1

int sensore = 4; // pin in cui ce il sensore
int clock = 0; //imposto la durata a 0

void setup() {
   Serial.begin(9600); //inizializzo la porta seriale
   pinMode(12,OUTPUT); //inizializzo LED
}
void loop() {
 
 pinMode(sensore,OUTPUT); // Chiudo il sensore per un po' 
 delay(50);
 pinMode(sensore,INPUT); // Riapro il sensore per ancora meno 
 clock = pulseIn(sensore,HIGH); //con la funziona pulseIn ne leggo il cambio di stato in quanto siamo collegati ad un pin digitale
 Serial.print("Impulsi: "); //preparo il testo da visualizzar nel serial monitor
 Serial.println(clock);
 delay(5); //richiudo e
 
 if (clock > 0) //faccio un controllo che il clock  sia > 0, se è così
 {
    digitalWrite(12,HIGH); //accendo e spengo il led alla velocità (in modulo però) del clock
    delay(clock % 3);
    digitalWrite(12,LOW);
    delay(clock % 3);
 }
 
}

Con questa versione aggiornata ho ovviato il problema precedente che il led si accendeva e spegneva anche quando non vibrava, però sembra funzionare.

Cosa dite?

Scusa, perchè hai usato un salto goto quando il loop stesso viene ripetuto all'infinito?

ciao

era nella vecchia versione infatti mi sono accorto ora che non serviva e lo stavo togliendo!