sensore analogico contatore suono slap

Mi scuso per la traduzione , la scrittura dalla Spagna ( in Spagna consiguó nessuna soluzione al mio problema e spero che i miei “vicini” mi può aiutare ) :slight_smile:

Sto usando per il mio progetto di un UNO Arduino + sensore sonoro ( avete GND , VCC , D0 , A0 )

Che cosa ho bisogno è quello di utilizzare l’uscita analogica del sensore sonoro ( con output digitale tenieno altri problemi e non può essere utilizzato ) e correre con applausi .
Arrivare a lavorare e dare 1 schiaffo " motore Up" 2 schiaffo " motore Down" , ma ho bisogno di lavorare diversamente. Come quando viene usato un contatore.

Ho bisogno di lavorare in questo modo :
1 schiaffo “motore up”
1 schiaffo “motore down. "
1 schiaffo” motore up" …
Sto lavorando con questo codice :

int sensorPin = A0;   // Entrada Analogica Sensor sonido 

int SubirMotor = 2;    // Salida 

int sensorValue = 0;  // variable para almacenar el valor del sensor

int knockUp;




void setup() {

  // declarar la relayPin como salida:

  pinMode(SubirMotor, OUTPUT);  

  knockUp = 0;

  digitalWrite(SubirMotor, LOW); 

  Serial.begin(9600);

}




void loop() {

  // leer el valor del sensor:

  sensorValue = analogRead(sensorPin);    




 long startTime = millis();

 while(millis() - startTime < 2000){ // Ajuste tiempo entre palmada y palmada

      sensorValue = analogRead(sensorPin); 

       if (sensorValue > 800)// Ajuste humbral nivel ruido 

       {

        knockUp = knockUp + 1;

        

        delay(200);

        digitalWrite(SubirMotor, HIGH);

        Serial.println(knockUp, DEC); 

       } 

     }

  if (knockUp == 2){
   delay(200);
   digitalWrite(SubirMotor, LOW); 

   

  }

  knockUp = 0;

}
Qualcuno può aiutarmi a cambiare a lavorare come voglio ?
grazie mille

Ciao, Hola, la traduzione è pessima, e non so se ho capito il problema.

A me sembra che devi solo , accendere HIGH, o spegnere LOW, un motore.

Vedi se una cosa del genere va bene.

int sensorPin = A0;   // Entrada Analogica Sensor sonido 

int SubirMotor = 2;    // Salida 

int sensorValue = 0;  // variable para almacenar el valor del sensor

int OnOff=0;




void setup() {

  // declarar la relayPin como salida:

  pinMode(SubirMotor, OUTPUT);  

  

  digitalWrite(SubirMotor, LOW); 

  Serial.begin(9600);

}




void loop() {

  // leer el valor del sensor:

  sensorValue = analogRead(sensorPin);    




 long startTime = millis();

 while(millis() - startTime < 2000){ // Ajuste tiempo entre palmada y palmada

      sensorValue = analogRead(sensorPin); 

       if (sensorValue > 800)// Ajuste humbral nivel ruido 

       {

            if(OnOff==0){
			    OnOff=1;
            }
			else
			    OnOff=0;
				
        

       } 
 }

  if (OnOff == 0){
  
      delay(200);
      digitalWrite(SubirMotor, LOW); 
  

  }
  else{
      delay(200);
      digitalWrite(SubirMotor, HIGH);
      

  } 

}

Secondo me vuole fare che battendo le mani una volta il motore si accende, battendole 2 volte si spegne.

Se con 1 battito, accende, e con 2 battiti, spegne, qualcosa del genere

int sensorPin = A0;   // Entrada Analogica Sensor sonido 

int SubirMotor = 2;    // Salida 

int sensorValue = 0;  // variable para almacenar el valor del sensor

int knockUp;




void setup() {

  // declarar la relayPin como salida:

    pinMode(SubirMotor, OUTPUT);  

    knockUp = 0;

    digitalWrite(SubirMotor, LOW); 

    Serial.begin(9600);

}




void loop() {

   // leer el valor del sensor:

        




    long startTime = millis();

    while(millis() - startTime < 2000){ // Ajuste tiempo entre palmada y palmada

      
       sensorValue = analogRead(sensorPin);
       if (sensorValue > 800)// Ajuste humbral nivel ruido 

       {

           knockUp++;
      

        
       } 

    }

  if (knockUp == 2){
      delay(200);
      digitalWrite(SubirMotor, LOW); 
     

  }
  else if(knockUP==1){
      delay(200);

      digitalWrite(SubirMotor, HIGH);

      Serial.println(knockUp, DEC); 

  }
  knockUp = 0;

}

ciao ! Non sono stato in grado di testare il codice torn24 , oggi pomeriggio vado a controllare.

Cercherò di spiegare di nuovo che cosa ho bisogno ( spero capirà) Ho un motore che solleva ( up ) e abbassa (down) una finestra. -Voglio solo 1 applausi e far funzionare il motore 10seg. Sovella ( up ) e stop. - 1 applausi e far funzionare il motore 10seg.. Abbassa (down ) e stop.

-1 applausi sovella (up) -1 applausi abassa (down) -1 applausi sovella (up) -1 applausi abassa (down) -1 applausi sovella (up) -1 applausi abassa (down) -1 applausi sovella (up) -1 applausi abassa (down) ..... Spero che ora tu possa capire .

la ringrazio molto !

Ho già provato il codice Torn24 e non funziona come voglio.... :confused:

ciclo rimane in questa parte del codice:

If (Off == 0){
  
      
      digitalWrite(SubirMotor, HIGH ); 
      delay (1000); 
      digitalWrite (SubirMotor,LOW); 

[/
fino a dare applausi e passare al successivo:
[code]
else{   
      digitalWrite(BajarMotor, HIGH);
      delay(1000);
      digitalWrite(BajarMotor,LOW);
   }

come posso modificarlo per fermare e non continuamente ripetere ciò che è dentro ( if e else) solo fare ciò che è in ( If ) , quando 1 applausi e si ferma e solo fare 1 applausi e faccio ciò che è in ( else)

Prova a vedere cosi.

Variabile OnOff, cambia valore, motore sale o motore scende.

Variabile eseguito, tiene conto se è stato eseguita l’operazione, in questo modo la esegue una sola volta.

int sensorPin = A0;   // Entrada Analogica Sensor sonido 

int SubirMotor = 2;    // Salida 

int sensorValue = 0;  // variable para almacenar el valor del sensor

int OnOff=0;

boolean eseguito=true;





void setup() {

  // declarar la relayPin como salida:

  pinMode(SubirMotor, OUTPUT);  

  

  digitalWrite(SubirMotor, LOW); 

  Serial.begin(9600);

}




void loop() {

  // leer el valor del sensor:

  sensorValue = analogRead(sensorPin);    




 long startTime = millis();

 while(millis() - startTime < 2000){ // Ajuste tiempo entre palmada y palmada

      sensorValue = analogRead(sensorPin); 

       if (sensorValue > 800)// Ajuste humbral nivel ruido 

       {

            if(OnOff==0){
			    OnOff=1;
				eseguito=false;
            }
			else{
			    OnOff=0;
				eseguito=false;
				
            }

       } 
 }

  if (OnOff == 0 && eseguito==false){
  
      digitalWrite(SubirMotor, HIGH ); 
      delay (1000); 
      digitalWrite (SubirMotor,LOW); 

	  eseguito=true;
  

  }
  else if(OnOff && eseguito==false){
      digitalWrite(BajarMotor, HIGH);
      delay(1000);
      digitalWrite(BajarMotor,LOW);
      eseguito=true;

  } 

}

Siamo vicini a risolverlo !! :) sei un genio Torn24!! Ho già provato il codice e necessario regolare qualcosa , che a volte continua a ripetere .....

Questo è ciò che rende:

-1 applausi sovella (up) -1 applausi abassa (down) -1 applausi sovella (up) -1 applausi sovella (up) -1 applausi abassa (down) -1 applausi abassa (down) -1 applausi abassa (down) -1 applausi abassa (down) -1 applausi sovella (up) -1 applausi abassa (down)

È un po ' instabile

Ho letto che forse potremmo risolvere il codice con l'aggiunta di (switch, case1, case2....)

cosa ne pensi?Mi soi un po ' ignorante....come potrei applicare questo ho trovato nel mio codice ?

if ( val && !valAnt && !activar)  { 
    i++;
    
    activar = true;
  }
  valAnt = val;

        
  if (activar)
  {
    switch(i) {
            case 2:
      
      
      
          digitalWrite(Led2, HIGH);   
          digitalWrite (Led3,HIGH);
          delay(1000);
          digitalWrite(Led2, LOW);
          digitalWrite (Led3,LOW);
          break;
               
           case 1:  

           digitalWrite(Led4, HIGH);  
          digitalWrite (Led5,HIGH);
          delay(1000);
          digitalWrite(Led4, LOW);
          digitalWrite (Led5,LOW);
          break;
      
     

        
          
      default: i = 0;
          break;
    }



    
    activar = false;
  }
  }

Ciao, non mostri il codice completo e quindi non so cosa viene eseguito effettivamente. Non ho il circuito per provare, e quindi non mi accordo di anomalie. Non penso che sei tanto male in linguaggio C, da come usi !variabile :)

1 applausi sovella (up) -1 applausi abassa (down) -1 applausi sovella (up) -1 applausi sovella (up) -1 applausi abassa (down) -1 applausi abassa (down) -1 applausi abassa (down) -1 applausi abassa (down) -1 applausi sovella (up) -1 applausi abassa (down)

Questo, col codice che ti ho postato, non so proprio come possa succedere, perché la variabile passa da 1 a 0, o da 0 a 1, e secondo me non può succedere, che avvenga 1-1 o 0-0-0-0, up down ???