sostituzione sensore vibrazione da digitale ad analogico con piezoelettrico

Non faccio in tempo ad acquistarlo ora...5 è il valore che ho potuto osservare con lo sketch knock di Arduino(nel monitor)...io voglio provarlo con l inserimento analogico, come posso fare? Non riesco a sostituirlo

Ragazzi ci ho provato fino ad ora senza alcun risultato. Ho acquistato comunque il modulo di vibrazione regolabile sia in digitale che in analogico e mi dovrebbe arrivare tra un po di giorni. Nel frattempo, qualcuno può aiutarmi a sistemare lo stesso questo sketch? Non riesco a sostituire il sensore...l ho associato ad uno stato (impostando un soglia) da dove calcolare il tutto, ma niente...se qualcuno può aiutarmi, Sono proprio curioso di provarlo....grazie

Scusate se insisto,ma proprio nessuno può aiutarmi ad aggiungere questo tipo di sensore? Ho provato in tutti i modi,ma niente... Ho acquistato il modulo da voi consigliato ( sinceramente ne ho acquistati 2) in modo tale da poterlo usare tranquillamente come sensore digitale, ma per ora mi servirebbe quello analogico

Continuo a NON capire dove trovi il problema ... nel codice ? ... nel collegamento del sensore ?

In ogni caso ti è già stato più volte spiegato che:

1. L'esempio "knock" è sbagliato
2. che senza amplificare il segnale con un operazionale difficilmente ci farai qualche cosa
3. che un segnale analgico proveniente da un piezo va sopra e SOTTO lo zero, cosa che NON è ammissibile per un pin di Arduino e quindi occorre comunque eliminare le semionde negative

Quindi, tu, esattamete, dove hai problemi ?

Guglielmo

A scrivere il programma, ho associato uno stato impostando una soglia dove passare da high a low, ma non riesco..

Emanuele1993:
A scrivere il programma, ho associato uno stato impostando una soglia dove passare da high a low, ma non riesco..

Metti il codice aggiornato che hai scritto (... mi raccomando, racchiuso tra i tag CODE) e spiega il punto che ti da problemi ...

Guglielmo

ecco

#define       knockSensor  A0
#define       pinPiezo   11
#define       ledsensore 9
byte          statoPiezo = LOW;
byte          ledsensorestato = LOW;
byte          sensStat = 0;
unsigned long sensTime;
byte          soundStat = 0;
unsigned long soundTime;  
const int     threshold = 5;  
byte          sensorReading = 0;      
   

//-----------------------------------------------------------------------------
void setup()
{
    delay(1000);
    Serial.begin(9600);
    Serial.println("avvio programma");
    pinMode(pinPiezo, OUTPUT);
    pinMode(ledsensore, OUTPUT);
}
//-----------------------------------------------------------------------------
void loop()
{
    gestKnok();
    gestSens();
    gestSound();
}
//-----------------------------------------------------------------------------
void gestKnok(){
  sensorReading = analogRead(knockSensor);
  if (sensorReading >= threshold) {
    ledsensorestato = !ledsensorestato;
    digitalWrite(ledsensore, ledsensorestato);
  }
  
  }


void gestSens()
{
    byte sens = digitalRead(ledsensore);
    switch (sensStat)
    {
        case 0:  // attende sensore HIGH
            if (sens)
            {
                sensTime = millis();  // memorizza tempo attuale
                sensStat = 1;         // passa a stato 1
            }
            break;

        case 1:  // conteggio 4 sec, torna a stato zero se sens LOW
            if (!sens)
                sensStat = 0;
            else if (millis() - sensTime >= 5000)  // se timeout 5 secondi
            {
                statoPiezo = HIGH;
                Serial.println("Stato high");
                sensStat = 3;
            }
            break;

        case 3:  // attende sensore LOW, poi torna a stato zero
            if (!sens)
            {
                statoPiezo = LOW;
                Serial.println("Stato low");
                sensStat = 0;
            }
    }
}
//-----------------------------------------------------------------------------
void gestSound()
{
    switch (soundStat)
    {
        case 0:
            if (statoPiezo) { soundStat = 3; break; }
            tone(pinPiezo, 1397, 600);
            soundTime = millis();
            soundStat = 1;
            break;

        case 1:
            if (statoPiezo) { soundStat = 3; break; }
            if (millis() - soundTime >= 600)
            {
                tone(pinPiezo, 1175, 600);
                soundStat = 2;
            }
            break;

        case 2:
            if (statoPiezo) { soundStat = 3; break; }
            if (millis() - soundTime >= 18000) soundStat = 0;
            break;

        case 3:
            if (!statoPiezo) { soundStat = 0; break; }
            tone(pinPiezo, 1175, 600);
            soundTime = millis();
            soundStat = 4;
            break;

        case 4:
            if (!statoPiezo) { soundStat = 0; break; }
            if (millis() - soundTime >= 600)
            {
                tone(pinPiezo, 1175, 600);
                soundStat = 5;
            }
            break;

        case 5:
            if (!statoPiezo) { soundStat = 0; break; }
            if (millis() - soundTime >= 3000) soundStat = 3;
    }
}
[code]

Si, ma se spieghi anche cosa fanno le varie funzioni facciamo prima eh ...

Intanto, comunque, dopo la "sensorReading = analogRead(knockSensor);" metti una bella "Serial.println(sensorReading);" così ti rendi conto dei valori che stai leggendo ... ::slight_smile:

Hai amplificato i segnale analogico? Hai protetto l'ingresso da valori di tensione negativi rispetto alla massa come ti è stato più volte detto ?

Guglielmo

Non ho amplificato il segnale perchè i valori rilevati per il mio uso vanno più che bene. comunque non l ho protetto, ho inserito solo resitenza da 1Mohm tra + e - .
comunque ora vi spiego la funzione:
-oggetto si muove emette bip bip a distanza di 18 s
-oggetto si ferma emette bip bip a distanza di 2 s
-solo se l oggetto rimane fermo per 5 secondi, si attiva lo stato fermo altrimenti continua il conteggio dei 18 s(movimento). ovviamente quest ultimo conta parallelamente al conteggio di verifica

Emanuele1993:
... comunque ora vi spiego la funzione ...

... non intendevo questo :smiley: ... intendevo che mi devi spiegare, in dettaglio, COSA fanno (... o cosa tu pensi facciano), secondo te, le varie funzioni del codice:

Cosa fa la gestKnok() ? Cosa fa la gestSens() ? Cosa fa la gestSound() ?

Guglielmo

Gestknok gestisce il sensore vibrazione, quando cambiare lo stato in base alla soglia.
Gestsens gestisce gli stati fermo,mosso e il conteggio di verifica
Gestasound gestisce i suoni in base agli stati

gpb01:
Hai amplificato i segnale analogico? Hai protetto l'ingresso da valori di tensione negativi rispetto alla massa come ti è stato più volte detto ?

Guglielmo

Una domanda per il fatto dell'ampiezza del segnale, senza amplificare non si potrebbe iniziare ad usare analogReference(INTERNAL) che per un 328 porta il fondoscala dell AD a 1,1 V, oppure un analogReference(EXTERNAL) e collegare al pin Analog-ref una tensione di 0,5 V giusto per vedere se legge qualche cosa?

Io ho fatto così partendo dall'esempio "knock", ho impostato analogReference(INTERNAL) giusto per leggere qualche valore.

Certo bisogna eliminare la parte negativa, si potrebbe fare "alzando" il riferimento dello 0 a metà della tensione di riferimento con un partitore, in questo modo "leggo" 512 senza nessun impulso e non appena il piezzo viene sollecitato l'ingresso si muove tra 0 e 1024.

Giuseppe

Allegato.jpg

Io sinceramente sono partito da un esempio in cui era inserita la funzione mesuramentTP e ho visto il valore che servirebbe al mio progetto, poi l ho testato con l esempio knock di Arduino impostando la soglia da me preferita e va piuttosto bene...

Emanuele1993:
Gestknok gestisce il sensore vibrazione, quando cambiare lo stato in base alla soglia.
Gestsens gestisce gli stati fermo,mosso e il conteggio di verifica
Gestasound gestisce i suoni in base agli stati

Quindi quella che NON ti funziona è la prima ? Quella che rivela il knok ? ... hai messo la Serial.println() che ti ho detto ? Che valori ottieni ?

Guglielmo

Guglielmo non sono a casa ora e non riesco a provare,appena torno provo e t faccio sapere i valori. Grazie per l aiuto a tutti

buongiorno, ho provato con il
Serial.println(sensorReading);

e i valori ottenuti vanno da 0 a un valore che si accosta ai 400. Per la sensibilità a me richiesta, è perfetto:) problema: non avvengono i cambi di stato come dovrebbero avvenire:) sto provando ma niente.
cosa sto sbagliando?
grazie

Per scoprire cosa sbagli, continua come hai fatto ora .. inserisci Serial.println() nei vari punti e verifichi che avvenga quello che veramente tu pensi debba avvenire ... si chiama "fare debug" :smiley: :smiley: :smiley:

Guglielmo

okok:) ci provo

piccola modifica al programma. inserendo il serial println (ledsensorestato) ho notato che parte con il valore 0 e poi dopo averlo colpito un po di volte rimane fisso su 1.Perchè? Inoltre (come ho scritto precedentemente) facendo la prova con il solo sensore analogico , ho ottenuto valori che vanno da 0 a 400 circa(dipende dall'intensità), ma siccome la soglia da me scelta è bassa(quindi deve essere sensibile) va più che bene:)

#define       knockSensor  A0
#define       pinPiezo     11
#define       ledsensore   9
byte          statoPiezo = LOW;
byte          ledsensorestato = LOW;
byte          sensStat = 0;
unsigned long sensTime;
byte          soundStat = 0;
unsigned long soundTime;  
const int     threshold = 10;  
byte          sensorReading = 0;      
   

//-----------------------------------------------------------------------------
void setup()
{
    delay(1000);
    Serial.begin(9600);
    Serial.println("avvio programma");
    pinMode(pinPiezo, OUTPUT);
    pinMode(ledsensore, OUTPUT);
}
//-----------------------------------------------------------------------------
void loop()
{
    gestKnock();
    gestSens();
    gestSound();
}
//-----------------------------------------------------------------------------
void gestKnock()
{
  sensorReading = analogRead(knockSensor); 
 if (sensorReading >= threshold) {
    ledsensorestato = !ledsensorestato;
    digitalWrite(ledsensore, ledsensorestato);
  }
 }

void gestSens()
{
    byte sens = digitalRead(ledsensorestato);
       Serial.println(ledsensorestato);
    switch (sensStat)
    {
        case 0:  // attende sensore HIGH
            if (sens)
            {
                sensTime = millis();  // memorizza tempo attuale
                sensStat = 1;         // passa a stato 1
            }
            break;

        case 1:  // conteggio 5 sec, torna a stato zero se sens LOW
            if (!sens)
                sensStat = 0;
            else if (millis() - sensTime >= 5000)  // se timeout 5 secondi
            {
                statoPiezo = HIGH;
                Serial.println("Stato high");
                sensStat = 3;
            }
            break;

        case 3:  // attende sensore LOW, poi torna a stato zero
            if (!sens)
            {
                statoPiezo = LOW;
                Serial.println("Stato low");
                sensStat = 0;
            }
    }
}
//-----------------------------------------------------------------------------
void gestSound()
{
    switch (soundStat)
    {
        case 0:
            if (statoPiezo) { soundStat = 3; break; }
            tone(pinPiezo, 1397, 600);
            soundTime = millis();
            soundStat = 1;
            break;

        case 1:
            if (statoPiezo) { soundStat = 3; break; }
            if (millis() - soundTime >= 600)
            {
                tone(pinPiezo, 1175, 600);
                soundStat = 2;
            }
            break;

        case 2:
            if (statoPiezo) { soundStat = 3; break; }
            if (millis() - soundTime >= 18000) soundStat = 0;
            break;

        case 3:
            if (!statoPiezo) { soundStat = 0; break; }
            tone(pinPiezo, 1175, 600);
            soundTime = millis();
            soundStat = 4;
            break;

        case 4:
            if (!statoPiezo) { soundStat = 0; break; }
            if (millis() - soundTime >= 600)
            {
                tone(pinPiezo, 1175, 600);
                soundStat = 5;
            }
            break;

        case 5:
            if (!statoPiezo) { soundStat = 0; break; }
            if (millis() - soundTime >= 3000) soundStat = 3;
    }
}[code]

fatto:):):slight_smile:

#define       knockSensor  A0
#define       pinPiezo     11
#define       ledsensore   9
byte          statoPiezo = LOW;
byte          ledsensorestato = LOW;
byte          sensStat = 0;
unsigned long sensTime;
byte          soundStat = 0;
unsigned long soundTime;  
const int     threshold = 10;  
byte          sensorReading = 0;      
   

//-----------------------------------------------------------------------------
void setup()
{
    delay(1000);
    Serial.begin(9600);
    Serial.println("avvio programma");
    pinMode(pinPiezo, OUTPUT);
    pinMode(ledsensore, OUTPUT);
}
//-----------------------------------------------------------------------------
void loop()
{
    gestKnock();
    gestSens();
    gestSound();
}
//-----------------------------------------------------------------------------
void gestKnock()
{
  sensorReading = analogRead(knockSensor); 
  Serial.println(sensorReading);
 if (sensorReading >= threshold) {
    ledsensorestato = HIGH;
 }else {ledsensorestato = LOW;
 }
    digitalWrite(ledsensore, ledsensorestato);
  }
 

void gestSens()
{
    byte sens = digitalRead(ledsensorestato);
       
    switch (sensStat)
    {
        case 0:  // attende sensore HIGH
            if (sens)
            {
                sensTime = millis();  // memorizza tempo attuale
                sensStat = 1;         // passa a stato 1
            }
            break;

        case 1:  // conteggio 5 sec, torna a stato zero se sens LOW
            if (!sens)
                sensStat = 0;
            else if (millis() - sensTime >= 5000)  // se timeout 5 secondi
            {
                statoPiezo = HIGH;
                Serial.println("Stato high");
                sensStat = 3;
            }
            break;

        case 3:  // attende sensore LOW, poi torna a stato zero
            if (!sens)
            {
                statoPiezo = LOW;
                Serial.println("Stato low");
                sensStat = 0;
            }
    }
}
//-----------------------------------------------------------------------------
void gestSound()
{
    switch (soundStat)
    {
        case 0:
            if (statoPiezo) { soundStat = 3; break; }
            tone(pinPiezo, 1397, 600);
            soundTime = millis();
            soundStat = 1;
            break;

        case 1:
            if (statoPiezo) { soundStat = 3; break; }
            if (millis() - soundTime >= 600)
            {
                tone(pinPiezo, 1175, 600);
                soundStat = 2;
            }
            break;

        case 2:
            if (statoPiezo) { soundStat = 3; break; }
            if (millis() - soundTime >= 18000) soundStat = 0;
            break;

        case 3:
            if (!statoPiezo) { soundStat = 0; break; }
            tone(pinPiezo, 1175, 600);
            soundTime = millis();
            soundStat = 4;
            break;

        case 4:
            if (!statoPiezo) { soundStat = 0; break; }
            if (millis() - soundTime >= 600)
            {
                tone(pinPiezo, 1175, 600);
                soundStat = 5;
            }
            break;

        case 5:
            if (!statoPiezo) { soundStat = 0; break; }
            if (millis() - soundTime >= 3000) soundStat = 3;
    }
}
[code]