[RISOLTO]Creare interruttore battimani

secondo me la pazienza l'ha persa lui ]:smiley:

@Cyclone: bello e semplice questo passa-banda, speriamo solo che le sue mani non producano frequenze da ali di pipistrello :smiley:

secondo me la pazienza l'ha persa lui

mmmm.... tu dici ? Sarebbe un peccato.....era ormai vicino alla soluzione più o meno definitiva...

mah scusate ho letto un po il topic cosi per curiosità ma in questo modo anche se sparo 3 colpi di pistola(per fare un esempio non troppo scabroso) mi si accende la luce o quello che c'è collegato al relay?
Capisco i vari filtri cercare di amplificare il rumore etc ma per me conviene fare in modo da temporizzare per bene lo sketch ovvero primo rumore incremento la variabile ,secondo rumore la reincremento , passano 5 secondi la azzero in questo modo c'è bisogno di 3 rumori consecutivi per accenderlo e ci sono meno possibilità di disturbi vari.
ps scusate se lo avevate già detto,volevo solo dare un consiglio :grin: cmq potreste usare un modulo di riconoscimento vocale forse e configurabile per i vari suoni :smiley:

mah scusate ho letto un po il topic cosi per curiosità ma in questo modo anche se sparo 3 colpi di pistola(per fare un esempio non troppo scabroso) mi si accende la luce o quello che c'è collegato al relay?
Capisco i vari filtri cercare di amplificare il rumore etc ma per me conviene fare in modo da temporizzare per bene lo sketch ovvero primo rumore incremento la variabile ,secondo rumore la reincremento , passano 5 secondi la azzero in questo modo c'è bisogno di 3 rumori consecutivi per accenderlo e ci sono meno possibilità di disturbi vari.
ps scusate se lo avevate già detto,volevo solo dare un consiglio cmq potreste usare un modulo di riconoscimento vocale forse e configurabile per i vari suoni

Ma era quello a cui volevamo arrivare......Se si usano dei filtri passa banda intanto si prendono in esame solo le frequenza più vicine possibili al clap e poi con il sw si fa in modo da scremare ancora il rumore facendo modo di prendere per buono un rumore più o meno uguale in frequenza ed ampiezza ripetuto per n volte......E' ovvio però che se uno ha la tosse e per sfiga la frequenza è simile al clap la luce(ad esempio)continuerà ad accendersi e spegnersi......toccherà correre lontano dal microfono :grin:

cyclone:
non voglio perdere le speranze neppure io....
facciamoloooo funzionareeeee

se i consigli di menniti non andranno a buon fine, ma non per colpa sua...
ti dò l'ultima chance ma ti devi sforzare tanto ma tantoooo e poi boh!

per non farti complicare la vita con le matematiche .. e con le TDS o teorie dei sistemi
ti allego uno schema di un filtro realizzato apposta per la tua applicazione con un cutoff a 15.92 Hz per quanto riguarda il fpa e
un altro cutoff a 4822.9 Hz relativo al fpb.

non saprei più come aiutarti :slight_smile: stasera ho battuto le mani come uno scemo per farti sto filtro.

Grazie ciclone,ieri sera ho finito di montare il tuo circuito , ma devo farti ancora delle domande pratiche :cold_sweat:
Ma il pinAUD del microfono va sempre sul pin A0 di arduino giusto?
Ancora una :stuck_out_tongue: , ma le uscite del LM358, pin1 e il pin7, dove li collego? :blush:
Non arrabbiarti x questa domanda.Grazie

XD XD XD

no, io non mi arrabbierò ]:smiley:

no, io non mi arrabbierò
si consiglia di visionare l'intero video, la scena della frase di riferimento comunque termina al minuto 3 e 30 sec circa :stuck_out_tongue_closed_eyes:

:sweat_smile:

Grazie ciclone,ieri sera ho finito di montare il tuo circuito , ma devo farti ancora delle domande pratiche
Ma il pinAUD del microfono va sempre sul pin A0 di arduino giusto?
Ancora una , ma le uscite del LM358, pin1 e il pin7, dove li collego?
Non arrabbiarti x questa domanda.Grazie

Dalle domande che hai fatto forse non hai capito il funzionamento di un filtro e in che modo si usa.......no problem,cerco di spiegartelo.
Il mic che hai tu rileva ed amplifica di 100 volte tutti i tipi di rumore e di conseguenza tutte le frequenze ,ecco perchè qualsiasi tipo di rumore tu faccia ,tramite la lettura dell'ingresso di arduino A0,si eccita il relè......per fare in modo che il relè si attivi solo con i rumori (frequenza)il più vicino possibile al rumore (frequenza) del battito di mani serve un dispositivo che riesca a far arrivare al pin analogico A0 di arduino solo le frequenze il più vicino possibile al battito di mani........Anche se il discorso in realtà sarebbe un po più complicato dovresti aver capito da solo dove devi mettere il filtro.....ovvero tra il mic e l'ingresso A0 di arduino.....
Quindi l'uscita del microfono ,nel tuo caso ,è quel pin 2 del microfono che ti ha disegnato cyclone e va collegata ad R1/C1,l'uscita del filtro è invece il pin 7 dell'LM358 e va collegata al pin A0 di arduino.......Tutti i Vcc vanno ai 5v di arduino,tutti i gnd vanno ai gnd di arduino.
Mentre ,quel filo che vedi collegato al pin 1 dell'LM358 penso lo abbia usato per verificare la frequenza di taglio del filtro passa alto......
Se vuoi approfondire il discorso in rete trovi un sacco di materiale in merito,basta cercare.....
Ciao

Grazie tonid sei sempre gentile, e chiaro.

Grazie tonid sei sempre gentile, e chiaro.

Figurati.....

Ciao ragazzi, come va'.... finalmente ho finito il mio lavoro e a quanto pare funziona, pero' secondo me ce un piccolo problema con il codice...
quando alimento il circuito si accende e spegne da solo per 12 volte, poi si ferma, poi batto le mani e sembra funzionare, continuo a battere le mani per 20 volte ,poi lultimo battito, cioe' il 21esimo si blocca, attendo circa 5 secondi do' un'altro battito di mani e ritorna ad accendersi e spegnersi di nuovo per 12 volte........
=( =( credo non sia normale.
potete farmi la cortesia di dare un'occhiata al codice, perche' non riesco a capire da dove provenga questa cosa, per favore e l'ultimo piacere che vi cerco =( Grazie

/*
* 
* Clapper project
* author: Manoj Kunthu
* last update: 6/5/11
*/


int clap = 1;
boolean enabled = true;
int sensorValue = 0;


int SIZE = 25;
int buffer[25];


int now = 0;
int average = 0;
int total = 0;
int offset = 30;
boolean initialized = false;


int out = 10;


const int inPin0 = A0; 
const int clapLed1 = 12;
const int clapLed2 = 11;


const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 3;       // the pin that the LED is attached to


// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button


void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(out, OUTPUT);
  
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  
  pinMode(clapLed1, OUTPUT);
  pinMode(clapLed2, OUTPUT);


  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);
  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      buttonPushCounter++;
    } 
  }
  // save the current state as the last state, 
  //for next time through the loop
  lastButtonState = buttonState;


  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin, HIGH);
    
    enabled = true;
  } 
  else {
    digitalWrite(ledPin, LOW);
    digitalWrite(clapLed1, LOW);
    digitalWrite(clapLed2, LOW);
    enabled = false;
  }


  if(enabled){
    sensorValue = analogRead(inPin0); 


    //insert the sensor value into the array
    if(initialized){          
      total = total - buffer[now] + sensorValue;    
    }          
    else{
      total = total + sensorValue;


      if(now + 1 >= SIZE)
        initialized = true;
    }


    //Find the average room noise level
    if(initialized)
      average = (total/SIZE) + offset; 
    else
      average = (total/(now+1)) + offset;
    
    if (sensorValue > average)
    {
      Serial.print(" AVE: ");
      Serial.print(average);
      Serial.print("    Sensor: ");
      Serial.println(sensorValue);
    }


    if (sensorValue > average+30)
    {
      
      digitalWrite(clapLed1, HIGH);
      
      Serial.print(" AVE: ");
      Serial.print(average);
      Serial.print("    Sensor: ");
      Serial.println(sensorValue);
      //clap *= -1;
      Serial.println("---Single req");
      delay(100); 


      int inc;
      for(inc = 0; inc<2000; inc++)
      {
        sensorValue = analogRead(inPin0); 
        //insert the sensor value into the array
        if(initialized){          
          total = total - buffer[now] + sensorValue;    
        }          
        else{
          total = total + sensorValue;


          if(now + 1 >= SIZE)
            initialized = true;
        }


        //Find the average room noise level
        if(initialized)
          average = (total/SIZE) + offset; 
        else
          average = (total/(now+1)) + offset;


        if (sensorValue > average)
        {
          digitalWrite(clapLed2, HIGH);
          Serial.print("--- AVE: ");
          Serial.print(average);
          Serial.print("    Sensor: ");
          Serial.println(sensorValue);
          clap *= -1;
          Serial.println("--------Double Clap");


          if(clap == 1){
            digitalWrite(out, HIGH);   // set the LED on 
          }
          else{
            digitalWrite(out, LOW);   // set the LED off
          }
          delay(1000); 
          break;
        }
        buffer[now] = sensorValue; 
        now = (now+1)%SIZE;
      }
      Serial.println("---Single ack");
      delay(500);
      Serial.println("done");
    }
    buffer[now] = sensorValue; 
    now = (now+1)%SIZE;


    if(average < 0 || average > 800)
    {
      initialized = false;
      
      for(now = 0;now < SIZE; now++)
      {
       buffer[now] = 0;
      }
      
      digitalWrite(out, LOW);
      total = 0;
      now = 0; 
      average =0;
      Serial.print(average);
      Serial.println("RESET");


    }
  }
  else
  {
    digitalWrite(3, LOW);
    Serial.println("disabled ");
  }
  digitalWrite(clapLed1, LOW);
  digitalWrite(clapLed2, LOW);
}

electro2:
Ciao ragazzi, come va'.... finalmente ho finito il mio lavoro e a quanto pare funziona, pero' secondo me ce un piccolo problema con il codice...
quando alimento il circuito si accende e spegne da solo per 12 volte, poi si ferma, poi batto le mani e sembra funzionare, continuo a battere le mani per 20 volte ,poi lultimo battito, cioe' il 21esimo si blocca, attendo circa 5 secondi do' un'altro battito di mani e ritorna ad accendersi e spegnersi di nuovo per 12 volte........
=( =( credo non sia normale.
potete farmi la cortesia di dare un'occhiata al codice, perche' non riesco a capire da dove provenga questa cosa, per favore e l'ultimo piacere che vi cerco =( Grazie

/*
  • Clapper project
  • author: Manoj Kunthu
  • last update: 6/5/11
    */

int clap = 1;
boolean enabled = true;
int sensorValue = 0;

int SIZE = 25;
int buffer[25];

int now = 0;
int average = 0;
int total = 0;
int offset = 30;
boolean initialized = false;

int out = 10;

const int inPin0 = A0;
const int clapLed1 = 12;
const int clapLed2 = 11;

const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 3;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {               
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(out, OUTPUT);
 
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
 
  pinMode(clapLed1, OUTPUT);
  pinMode(clapLed2, OUTPUT);

Serial.begin(9600);
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);
  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      buttonPushCounter++;
    }
  }
  // save the current state as the last state,
  //for next time through the loop
  lastButtonState = buttonState;

if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin, HIGH);
   
    enabled = true;
  }
  else {
    digitalWrite(ledPin, LOW);
    digitalWrite(clapLed1, LOW);
    digitalWrite(clapLed2, LOW);
    enabled = false;
  }

if(enabled){
    sensorValue = analogRead(inPin0);

//insert the sensor value into the array
    if(initialized){         
      total = total - buffer[now] + sensorValue;   
    }         
    else{
      total = total + sensorValue;

if(now + 1 >= SIZE)
        initialized = true;
    }

//Find the average room noise level
    if(initialized)
      average = (total/SIZE) + offset;
    else
      average = (total/(now+1)) + offset;
   
    if (sensorValue > average)
    {
      Serial.print(" AVE: ");
      Serial.print(average);
      Serial.print("    Sensor: ");
      Serial.println(sensorValue);
    }

if (sensorValue > average+30)
    {
     
      digitalWrite(clapLed1, HIGH);
     
      Serial.print(" AVE: ");
      Serial.print(average);
      Serial.print("    Sensor: ");
      Serial.println(sensorValue);
      //clap *= -1;
      Serial.println("---Single req");
      delay(100);

int inc;
      for(inc = 0; inc<2000; inc++)
      {
        sensorValue = analogRead(inPin0);
        //insert the sensor value into the array
        if(initialized){         
          total = total - buffer[now] + sensorValue;   
        }         
        else{
          total = total + sensorValue;

if(now + 1 >= SIZE)
            initialized = true;
        }

//Find the average room noise level
        if(initialized)
          average = (total/SIZE) + offset;
        else
          average = (total/(now+1)) + offset;

if (sensorValue > average)
        {
          digitalWrite(clapLed2, HIGH);
          Serial.print("--- AVE: ");
          Serial.print(average);
          Serial.print("    Sensor: ");
          Serial.println(sensorValue);
          clap *= -1;
          Serial.println("--------Double Clap");

if(clap == 1){
            digitalWrite(out, HIGH);   // set the LED on
          }
          else{
            digitalWrite(out, LOW);   // set the LED off
          }
          delay(1000);
          break;
        }
        buffer[now] = sensorValue;
        now = (now+1)%SIZE;
      }
      Serial.println("---Single ack");
      delay(500);
      Serial.println("done");
    }
    buffer[now] = sensorValue;
    now = (now+1)%SIZE;

if(average < 0 || average > 800)
    {
      initialized = false;
     
      for(now = 0;now < SIZE; now++)
      {
       buffer[now] = 0;
      }
     
      digitalWrite(out, LOW);
      total = 0;
      now = 0;
      average =0;
      Serial.print(average);
      Serial.println("RESET");

}
  }
  else
  {
    digitalWrite(3, LOW);
    Serial.println("disabled ");
  }
  digitalWrite(clapLed1, LOW);
  digitalWrite(clapLed2, LOW);
}

Nessuno puo aiutarmi xfavore..... :frowning:

Ciao electro2 , sinceramente non ci capisco molto da quel codice ma in ogni caso ,se fossi al posto tuo,lo riscriverei secondo le mie necessità,anche perchè il tuo schema elettrico ora è diverso.
Un modo semplice di creare un codice funzionante è quello di procedere a piccoli passi e verificarne il funzionamento.
Nel tuo caso inizierei a fare delle letture tramite l'analog read e,stampandole in serial monitor,controllare e capire il valore che ottieni quando batti le mani e quando no (ovvero leggerai il valore corrispondente al rumore di fondo che c'è nella stanza).....in base a questi valori potrai iniziare a studiare un modo che ti permetterà di farlo funzionare come vuoi tu.
Nell'ide ci sono diversi esempi che ti aiutano a capire come fare una lettura da un pin analogico e come poter stampare il valore ottenuto nel serial monitor.

Grazie tonid il problema e che ho gia' montato tutto su una scheda.... =( perche' quando ho provato su la breadboard no ho battuto le mani tante volte , avevo visto che funzionava e non ci ho fatto caso , e sono passato subito alla scheda. Ora come faccio a visualizzare i valori??

risolto problema codice......pero' ce un piccolo problema , alimento il circuito con un trasformatore da 5v e SI blocca il rele', quando invece prendo i 5v di arduino va' tutto correttamente....come devo fare? il trasformatore e di 5v 400mA, ho usato anche quello da 250mA, ma fa lo stesso problema

Stai alimentando il circuito del filtro con un alimentatore ed arduino da usb ? Se è così devi collegare insieme le gnd delle due alimentazioni.

tonid, avevo dimenticato di dirti che il filtro non lo misi piu' sono riuscito a mettere il potenziom.....ora va tutto a posto ma quando alimento il circuito (esterno) con trasformatori, non va affatto bene, se invece :0 alimento atduino con la porta usb, e nei pin 5v e gnd collego il circuito esterno, funziona..

non riesco a capire :astonished:

Se usi due alimentazioni le masse devono essere collegate insieme....
Tu alimenti arduino da usb ed il relè da un alimentatore esterno,le due gnd devi collegarle insieme.

forse non sono stato chiaro :stuck_out_tongue: ho messo atmega standalone sul circuito (finito) quando alimento il circuito con alimentatore esterno mi si blocca il rele' aperto e il microfono non manda segnali ecc. ecc. se poi invece di alimentarlo con un trasf. alimento con arduino cioe' metto i fili rigidi nei pin 5v e gnd di Arduino mi segui? e con la tensione di arduino alimento il mio circuito sulla millefori con (atmega standalone) , il circuito Funziona....Spero di essere stato chiaro, xche' mi sta' facendo impazzire :sweat_smile:

electro2:
forse non sono stato chiaro :stuck_out_tongue: ho messo atmega standalone sul circuito (finito) quando alimento il circuito con alimentatore esterno mi si blocca il rele' aperto e il microfono non manda segnali ecc. ecc. se poi invece di alimentarlo con un trasf. alimento con arduino cioe' metto i fili rigidi nei pin 5v e gnd di Arduino mi segui? e con la tensione di arduino alimento il mio circuito sulla millefori con (atmega standalone) , il circuito Funziona....Spero di essere stato chiaro, xche' mi sta' facendo impazzire :sweat_smile:

=( =( =( =( =( =( =( =( =( =( =( =( =(