Go Down

Topic: Domanda x un progetto (Read 647 times) previous topic - next topic

electro2

Ciao volevo farvi vedere questo progetto http://www.instructables.com/id/Secret-Knock-Detecting-Door-Lock/?ALLSTEPS#step1 credo che parecchi sapranno gia' di cosa si tratta, io pero' avevo in mente di sfruttarlo per una specie di battimani, in effetti invece del motoriduttore metterei un rele'....pero' guardando il codice http://www.instructables.com/files/orig/F1T/DII6/GIYWWK6R/F1TDII6GIYWWK6R.tmp  , non riesco a capirci niente, e su come modificarlo, se notate il video il motoriduttore si aziona quando trova il suono registrato, pero' non torna indietro con lo stesso suono. voglio farvi capire che se metto il rele' con il suono registrato, la "luce" si accende, e come faccio per spegnerla?  posso modificare il codice permettendo al motoriduttore di richiudere la porta? o spegnere la "luce"?
mi farebbe piacere capire sia dal lato rele' e sia per la questione della porta...
Grazie mille per il vostro aiuo.

leo72

Mi pare che il software non "registri" il suono ma bensì memorizza la sequenza di colpi, cioè distingue fra colpi brevi e colpi lunghi e gli intervalli fra i colpi, per costruire così una sequenza che diventa la "chiave".

Ovviamente per modificare il codice ed il progetto servono conoscenze un pò più evolute di quelle necessarie per far lampeggiare un LED, difatti l'autore lo spiega bene che questo non è un progetto per principianti.

electro2

si lo so' percio' ho chiesto aiuto a voi,   non si puo' fare niente per il lavoro che vorrei fare? sai cose' non riesco a trovare niente di semplice in rete. trovo il solito flip flop micropfonico , il solito battimani di elettronica in, ecc ecc.  capisci, niente di bello con arduino solo questi. allora trovato questo  e ho chiesto a voi.

Dario Gogliandolo

Ciao, tempo fa anche io avevo visto quel progetto allora avevo deciso di costruirlo solo che anzichè usare il programma fatto da lui ne ho riscritto un io totalmente da 0. Nel mio programma ho fatto in modo che quando il buzzer rileva dei battiti, registri in un array l'intervallo di tempo (in millis) che è passato dal battito precedente a quello corrente ed una volta raggiunto il numero di battiti previsto, i valori contenuti nell'array appena popolato venivano confrontati con i valori di un array precedentemente popolato (direttamente da codice) che conteneva "la password", tenendo conto di una tolleranza. Il tuo problema è abbastanza semplice, basterebbe far restare in ascolto il buzzer fino a quando non sente 2 battiti che abbiano un intervallo di tempo fra di loro precedentemente definito (300 millisecondi?) e magari setta una variabile di tipo boolean stabilendo la posizione del relè...

questo è il programma che avevo scritto io (molto sporco): come vedrai è moooolto più piccolo di quello originale, ma fa il suo lavoro...
Quote

int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 13;      // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor
long previousMillis = 0;
long interval = 100;
long millisTrascorsi=0;
int lunghezzaCodice = 7;
int codiceSegreto[10] = {0, 375, 165, 150, 320, 650, 325, 0, 0, 0};
//int codiceSegreto[10] = {0, 185, 190, 340, 510, 200, 185, 0, 0, 0};
int codiceCorrente[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int puntVett=0;
void setup() {
  Serial.begin(9600);
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin, OUTPUT);  
}

void loop() {
  unsigned long currentMillis = millis();
  // read the value from the sensor:
 if(currentMillis - previousMillis > interval) {
        sensorValue = analogRead(sensorPin);    
  // turn the ledPin on
        if (sensorValue != 0)
            {
                digitalWrite(ledPin, HIGH);
                //while(sensorValue != 0);
                //delay(0);
                
                    if (puntVett<=lunghezzaCodice){
      
                    if (puntVett==0)
                          {
                          Serial.println("Inizio codice");
                          codiceCorrente[0]=0;
                          puntVett++;
                          previousMillis = currentMillis;
                          Serial.println(0);
                          }
                    else
                          {
                          long diffMillis = currentMillis - previousMillis;
                          codiceCorrente[puntVett] = diffMillis;
                          previousMillis = currentMillis;
                          Serial.println(diffMillis);
                          puntVett++;
                          }
                          digitalWrite(ledPin, LOW);
            }
    if (puntVett == lunghezzaCodice)
    
            {
                Serial.println("fine codice");
                puntVett=0;
                /////////////////////////////////// CONFRONTO
                confronto();
             }
             else
                {
                    digitalWrite(ledPin, LOW);
    
                }
              }
 }
}

void confronto()
{
                 boolean codiceCorretto;
                Serial.println("Inizio confronto");
                long tolleranza = 75;
                     for (int i = 0; i<=lunghezzaCodice; i++)
                           {
                            long minVal = codiceSegreto-tolleranza;
                            long maxVal = codiceSegreto+tolleranza;

                                  if (codiceCorrente > minVal && codiceCorrente < maxVal)
                                        {
                                            Serial.print("Valore ");
                                            Serial.print(i);
                                            Serial.println(" OK");
                                            codiceCorretto = true;
                                        }
                                  else
                                        {
                                            Serial.print("Valore ");
                                            Serial.print(i);
                                            Serial.println(" NO");
                                            codiceCorretto = false;
                                            break;
                                        }

              /////////////////////////////////// FINE CONFRONTO
                          }
                    if (codiceCorretto==true)
                          {
                                Serial.println("Codice corretto: APRO");
                                for (int b = 0; b<5; b++)
                                      {
                                            digitalWrite(ledPin, HIGH);
                                            delay(250);
                                            digitalWrite(ledPin, LOW);
                                            delay(250);
                                      }
                          }
                    else
                          {
                                Serial.println("Codice errato");
                                for (int b = 0; b<11; b++)
                                      {
                                            digitalWrite(ledPin, HIGH);
                                            delay(100);
                                            digitalWrite(ledPin, LOW);
                                            delay(100);
                                      }
                          } 
}

Video demonstration of my Dashboard OBDII -> http://goo.gl/m8Pqp

electro2

perdona la mia ignoranza nel programmare, ma il codice tuo e quello originale in effetti fanno lo stesso lavoro ? lo ai solo semplificato giusto?

Dario Gogliandolo

si, ma il mio non ti permette di cambiare la password senza ricompilare il programma, ed altri piccoli accorgimenti che migliorano l'esperienza finale. Ad esempio un'altra differenza è che nel mio programma la lunghezza della password deve essere impostata da codice, mentre quello del progetto iniziale può avere una lunghezza variabile, tanto che la password viene verificata solo dopo che è passato un certo intervallo di tempo dall'ultimo battito. Tutto questo non è niente di impossibile, io non l'ho implementato perchè non mi interessava... Ti ripeto comunque che il codice che ho postato è molto sporco, infatti credo che ci siano variabili inutilizzate che andrebbero rimosse...
Video demonstration of my Dashboard OBDII -> http://goo.gl/m8Pqp

Go Up