Pages: [1]   Go Down
Author Topic: Problemino secret knock detecting door lock  (Read 824 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 76
Posts: 2099
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22762
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
e rileggendolo da setup, visto che lo esegue una sola volta all'accensione o dopo un reset
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

ivrea (to)
Online Online
Faraday Member
**
Karma: 86
Posts: 4946
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

my name is IGOR, not AIGOR

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22762
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 328
Posts: 22762
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


ivrea (to)
Online Online
Faraday Member
**
Karma: 86
Posts: 4946
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
}
  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.
« Last Edit: September 04, 2013, 07:51:45 am by nid69ita » Logged

my name is IGOR, not AIGOR

0
Online Online
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
2) 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.
smiley-mr-green

Quote
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..)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Potrebbero esser queste 2 le modifiche?
Code:
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

Code:
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  smiley
« Last Edit: September 04, 2013, 04:40:41 pm by leo72 » Logged

ivrea (to)
Online Online
Faraday Member
**
Karma: 86
Posts: 4946
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
secretCode[0]=10;   // scrivo cella
x=secretCode[4];            // leggo cella

Per leggere, usi un for da 0 a 19:
Code:
for(int i=0;i<maximumKnocks;i++)        
{ secretCode[i] = EEPROM.read(indirizzoeeprom+i);
}

Per scrivere:
Code:
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
Code:
int secretCode[maximumKnocks]={ 
in
Code:
byte secretCode[maximumKnocks]={
« Last Edit: September 04, 2013, 01:54:57 pm by nid69ita » Logged

my name is IGOR, not AIGOR

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Pages: [1]   Go Up
Jump to: