Problemino secret knock detecting door lock

Salve a tutti sono appena entrato in questo fantastico mondo di arduino! Il mio problema è il seguente:
Ho appena concluso questo progetto http://www.instructables.com/id/Secret-Knock-Detecting-Door-Lock/ senza grossi problemi. Esso permette di aprire la porta mediante bussata letta da una sirena piezo.
Il mio problema sta nel fatto che se tolgo corrente il programma non ricorda il numero di bussate che io ho registrato e ogni volta va riprogrammato mediante tastino a bordo. C è la possibilità di salvare questo dato in qualche modo senza però perder la possibilita di riprogrammarlo e sostituirlo? Il programma è il seguente: http://www.instructables.com/files/orig/F1T/DII6/GIYWWK6R/F1TDII6GIYWWK6R.tmp
Grazie in anticipo per la risposta!

certamente.
salvando il valore in Eeprom http://arduino.cc/en/Reference/EEPROM

e rileggendolo da setup, visto che lo esegue una sola volta all'accensione o dopo un reset

Scusa ma sono proprio alle prime armi. Quando dovrei scrivere questa funzione? Ringrazio nuovamente

Dici che ad un certo punto "registri" il numero di bussate. Quel valore tu lo salvi in una variabile. Salvalo anche in EEPROM usando EEPROM.write per metterlo in una cella di memoria non volatile.

Quando avvii il programma, nel setup metterai un EEPROM.read per leggere quella stessa locazione di memoria ed avere il dato precedentemente salvato:

brunello:
e rileggendolo da setup, visto che lo esegue una sola volta all'accensione o dopo un reset

Scusa ma la varibile da salvare potrebbe esser questa: secretCode ?

Per me non è molto chiaro quello che vuoi fare.

Il vettore (o array) è secretCode.
Ma questa sequenza di quali bussate fanno aprire la porta sono già memorizzate nel programma Arduino.
Se resetti Arduino o gli togli corrente il programma dentro Arduino rimane. E quindi anche i valori stabiliti per secretCode[].
Logicamente se vuoi cambiare la sequenza allora devi cambiare il programma su PC e riscaricarlo su Arduino.

La sequenza che invece tu fai e che può essere giusta (e quindi apre la porta) oppure errata, mica la devi memorizzare!?!
E' come se uno volesse memorizzare la sequenza dei tentativi di aprire una cassaforte a combinazione.
La cosa importante è la combinazione della stessa, se la azzecchi si apre, altrimenti rimane chiusa.
Oppure non ho capito cosa intendi.

Se è un array, puoi salvare le singole celle in EEPROM e leggere l'array all'avvio invece che precaricarlo.

No ad ogni reset o tolta corrente il programma non ricorda piu la giusta seguenza per l apertura!

Ciò vuol dire che o non salvi i dati in EEPROM oppure che non li recuperi dalla EEPROM al successivo riavvio.

Ho capito.
Il programma ha una modalità "Programmabile".
It's also programmable. Press the programming button and knock a new knock and it will now only open with your new knock. By default the knock is "Shave and a Haircut" but you can program it with anything, up to 20 knocks long. Use your favorite song, Morse code, whatever.

Ma se la programmi, logicamente viene scritta in quel vettore e se spegni Arduino la perdi. E riparti con la sequenza fissata nel codice.

Come ha detto @leo72 devi modificare il programma. Nella fase di programmazione devi salvare la sequenza (quel vettore/array secretCode) in eeprom e nella funzione setup() tra le prime cose da fare rileggere da eeprom quei valori dentro al vettore/array secretCode.

Sembra che il salvataggio devi farlo qui:

}
	  return false; 	// We don't unlock the door when we are recording a new knock.

Tra la graffa chiusa e quel return false. Cerca quel commento.
Prima di quel pezzo prende la tua sequenza di bussata e la scarica dentro a secretCode, ma NON la salva in eeprom.

Andmal90:
Scusa ma sono proprio alle prime armi. Quando dovrei scrivere questa funzione? Ringrazio nuovamente

  1. This is not a project for a beginner! Read through it carefully and be sure you understand it before you start! I will not take time to answer questions that are already in the instructions or from people who have gotten in over their head.

:grin:

Prima di quel pezzo prende la tua sequenza di bussata e la scarica dentro a secretCode, ma NON la salva in eeprom.

Ovviamente ad ogni avvio poi la devi caricaricare eh.. Ricorda che ogni cella di EEPROM contiene un byte, quindi eventuali altri tipi di variabile vanno "smontati" e "rimontati" nella fase di caricamento/salvataggio (per esempio, un int sono 2 byte, un long o un float 4, etc..)

Potrebbero esser queste 2 le modifiche?

int indirizzoeeprom = 1;// Flag so we remember the programming button setting at the end of the cycle.

void setup() {
  secretCode = EEPROM.read(indirizzoeeprom);
  pinMode(lockMotor, OUTPUT);

e questa

 if (secretCode[i] > 0){                                   
          delay( map(secretCode[i],0, 100, 0, maxKnockInterval)); // Expand the time back out to what it was.  Roughly. 
          digitalWrite(greenLED, HIGH);
          digitalWrite(redLED, HIGH);
        }
        delay(50);
        EEPROM.write(indirizzoeeprom, secretCode);
      }
	  return false; 	// We don't unlock the door when we are recording a new knock.
  }

Grazie a tutti :slight_smile:

Quasi. La variabile secretCode è un array o vettore. E' come se fossero tante variabili tutte con lo stesso nome ma a cui puoi accedere individualmente con stesso nome ma indice diverso (da 0 a n-1), ad esempio

secretCode[0]=10;   // scrivo cella
x=secretCode[4];            // leggo cella

Per leggere, usi un for da 0 a 19:

for(int i=0;i<maximumKnocks;i++)        
{ secretCode[i] = EEPROM.read(indirizzoeeprom+i);
}

Per scrivere:

for(int i=0;i<maximumKnocks;i++)        
{ EEPROM.write(indirizzoeeprom+i,secretCode[i]);
}

Gli elementi del vettore secretCode sono int (2 byte) mentre in eeprom scrivi 1 byte alla volta, ma FREGATENE, in quanto i valori inseriti nel vettore sono tutti tra 0 e 100 (usa una map() dopo la lettura da analog pin)
ANZI, sarebbe anche meglio cambiare la dichiarazione

int secretCode[maximumKnocks]={

in

byte secretCode[maximumKnocks]={

Grazie per il software ora tutto perfetto. però ora non credo sia un problema di software ma di altro. dopo qualce ora di ottimo funzionamento il mio arduino (saldato da me utilizzando un ATMEGA328P-PU rispettando schemi e resistenze varie) risulta avere un problema. inizia a lampeggiare continuamente e velocemente il led verde (sintomo che legge variazioni dell ingresso analogico cioè della sirena) finche non va in blocco e si spegne tutto. non è che per usare gli ingressi analogici devo atulizzare degli accorgimenti nello schema elettrico?