Go Down

Topic: azzerare una variabile (Read 530 times) previous topic - next topic

jack7893

Buongiorno a tutti,
innanzitutto mi presento, sono uno studente di liceo scientifico di Venezia e ho iniziato da poco, anzi diciamo che devo ancora iniziare, ad avvicinarmi al mondo arduino. Ma iniziamo con il problema vero e proprio: sto costruendo una casetta sull'albero e per rendere il tutto più hitech avrei intenzione di mettere una scala attivata grazie ad un germotor. il tutto però vorrei fosse attivato da una password di 3 o più cifre. oggi sono riuscito a creare un codice che, con 3 pulsanti ognuno dei quali aumenta rispettivamente una variabile di 100, 10, 1, arriva ad un codice prestabilito. il problema sta nel fatto che oltre riuscire a far azzerare il codice dopo che ha raggiunto la password prestabilita, vorrei che si riuscisse a farlo azzerare dopo tipo 10 secondi che i pulsanti non vengono schiacciati. ho provato svariate volte ma non riesco. di seguito posto anche lo sketch se qualcuno riuscisse a consigliarmi cosa modificare ne sarei molto grato.


const int led = 2;
const int b = 22;
const int b2=26;
const int b3=30;
int var;
int code=624;

void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(b, INPUT);
  pinMode(b2, INPUT);
  pinMode(b3, INPUT);
  var=0;
}
void loop(){
  if (digitalRead(b)==HIGH){  //unità
      var++;
    delay(200);
  }
  else{
    var=var;
  }
  if (digitalRead(b2)==HIGH){  // decine
    var=10+var;
    delay(200);
  }
  else{
    var=var;
  }
  if (digitalRead(b3)==HIGH){  // centinaia
    var=100+var;
    delay(200);
  }
  else{
    var=var;
  }
  Serial.println(var, DEC);
  if (var==code) {
    digitalWrite(led, HIGH);
    delay(150);
    digitalWrite(led, LOW);
    delay(75);
    digitalWrite(led, HIGH);
    delay(2000);
   
    var=0;
  }
  else{
    digitalWrite(led,LOW);
    }

}
   

qsecofr

perchè scrivi in giro var=var? ...toglierei proprio l'else...
comunque la funzione che fa per te è il millis... ritorna i millisecondi trascorsi da quando hai acceso il coso...

dovresti scrivere cosette di questo tipo... te le butto giù di istinto poi tu correggile e metti maiuscole e punti e virgola a profusione dove vanno messi  :)

quando dichiari le variabili globali tienti due var così:

long oldMillis;
long newMillis;

poi in setup() vai a scrivere un bel
oldMillis = millis();

poi nel loop() vai a fare
Code: [Select]
newMillis = millis()
if (newMillis - oldMillis > 10000) //10 secondi di timeout... casomai cala o cresci
{
var =0; // cancello la variabile
oldMillis = millis() //ricomincio con il conto...


};


   


magari all'interno dell'if potresti fare anche una cosa del genere per generare qualche lampeggio veloce
int i;
for (i= 0; i <4; i++)
{ digitalWrite(led,HIGH);
  delay(300);
digitalWrite(led,LOW);
delay(200);


};

leo72

Io farei diversamente.
Premesso che la password è numerica ed è lunga x caratteri, assegnerei ai 3 tasti la funzione "incremento di 1", "spostamento a dx", conferma.
In questo modo l'inserimento della combinazione diverrebbe tipo lo sgancio di quei lucchetti da bici a dischi combinatori numerici.
Esempio: la tua password è 4356
All'inizio il display visualizza 0000, la 1a cifra a sx lampeggia. Premendo "incremento di 1" per 4 volte, porti il display a 4000, poi premi "spostamento a dx" e imposti il 3. Ecc.. Se sull'ultima cifra premi per errore "spostamento a dx", semplicemente il cursore torna alla prima cifra a dx. Premendo "conferma" viene controllata la password immessa.

Prevedi anche una password supervisore, per poter cambiare la password di accesso a "runtime", senza bisogno di scollegare il tutto e di attaccarci un PC per l'operazione. Salvi le 2 password in EEPROM e le leggi all'avvio. In caso una delle 2 password venga cambiata, la sovrascrivi sulla EEPROM.

Per le funzioni temporali controlla l'esempio BlinkWithoutDelay che è allegato all'IDE, troverai un modo per poter eseguire una certa azione trascorso un tot periodo di tempo senza bloccare il codice, continuando quindi a gestire l'input dell'utente.

Go Up