Go Down

Topic: azzerare una variabile (Read 659 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy