Go Down

Topic: aiuto con codice timer (Read 2126 times) previous topic - next topic

M4gnotta

ok ci riprovo. ma usando quello che ho fatto fin'ora come faccio semplicemente a tenere in memoria tre pressioni del pulsante e alla terza far suonare il buzzer? almeno intanto fa grossomodo quello che deve poi continuo a perfezionarlo

PaoloP

Prova così, l'ho buttato di fretta
Code: [Select]
//dichiarazione costanti: sono tutti i pin assegnati
const int Pulsante = 8;
const int led1rosso = 7;
const int led2rosso = 6;
const int led1giallo = 4;
const int led2giallo = 5;
const int led1verde = 2;
const int led2verde = 3;
const int ledARMED = 9;
const int ledDISARMED = A0;
const int Buzzer = A1;
const int Combinazione = A2;
const int PulsanteTerminale = A3;

//dichiarazione variabili. stato pulsante e buzzer.
int old_statopulsante = LOW;
int old_statopulsanteterminale = LOW;
int old_statocombinazione = LOW;
int statopulsante = 0;
int statoled = 0;
int statobuzzer = 0;
int statocombinazione = 0;
int statopulsanteterminale = 0;
int tentativi = 0;

unsigned long T0 = 0;
unsigned long T1 = 0;
unsigned long Tint = 0;
unsigned int Tindex = 0;

void setup () {
  delay(1000);
  Serial.begin(9600);

  //definisco i pin di output
  pinMode(led1verde, OUTPUT);
  pinMode(led2verde, OUTPUT);
  pinMode(led1giallo, OUTPUT);
  pinMode(led2giallo, OUTPUT);
  pinMode(led1rosso, OUTPUT);
  pinMode(led2rosso, OUTPUT);
  pinMode(ledARMED, OUTPUT);
  pinMode(ledDISARMED, OUTPUT);
  pinMode(Buzzer, OUTPUT);

  //definisco i pin di input
  pinMode(Pulsante, INPUT);
  pinMode(PulsanteTerminale, INPUT);
  pinMode(Combinazione, INPUT);

  T0 = millis();
  Serial.print(F("Go at "));
  Serial.print(T0);
  Serial.println(F(" milliseconds."));   
}

void loop(){
  digitalWrite(ledDISARMED, HIGH);

  statopulsante = digitalRead(Pulsante); //Lettura stato pulsante
  statocombinazione = digitalRead(Combinazione); //Lettura stato pulsante terminale
  statopulsanteterminale = digitalRead(PulsanteTerminale); //Lettura stato pulsante terminale
  delay(20);

  //se il pulsante è premuto lo stato è HIGH e avvia il ciclo
  if ((statopulsante == HIGH) && (old_statopulsante == LOW)){
    statopulsante = 1 ;
    Serial.println(F("Armed - start countdown..."));
  }

  if (statopulsante == 1) { //accendo tutti i led ed inizio il countdown
    armed();
  }
  else {
    disarmed();
    Serial.println(F("Disarmed."));
  }

  //codice che include il terminale nel processo
  //se il pulsante è premuto lo stato è HIGH controlla la combinazione il ciclo
  if ((statocombinazione == HIGH) && (old_statocombinazione == LOW)){
    statocombinazione = 1 ;
    Serial.println(F("combinazione"));
  }

  //se il pulsante è premuto lo stato è HIGH e avvia il ciclo
  if ((statopulsanteterminale == HIGH) && (old_statopulsanteterminale == LOW)){
    statopulsanteterminale = 1 ;
    Serial.println(F("terminale"));
  }

  if ((statocombinazione == HIGH) && (statopulsanteterminale == HIGH)){
    Serial.println(F("All stop"));
    digitalWrite(ledDISARMED, HIGH);
    digitalWrite(led1rosso, LOW);
    digitalWrite(led2rosso, LOW);
    digitalWrite(led1giallo, LOW);
    digitalWrite(led2giallo, LOW);
    digitalWrite(led1verde, LOW);
    digitalWrite(led2verde, LOW);
    digitalWrite(ledARMED, LOW);
  }

  if ((statocombinazione == LOW) && (statopulsanteterminale == HIGH)){
    tentativi++;
    digitalWrite(Buzzer, HIGH);
    delay (100);
    digitalWrite(Buzzer, LOW);
    Serial.println(F("tentativi"));
    Serial.println(tentativi);
  }

  if (tentativi = 3){
    Serial.println(F("Hai raggiunto 3 tentativi"));
    digitalWrite(ledDISARMED, LOW);
    digitalWrite(led1rosso, LOW);
    digitalWrite(led2rosso, LOW);
    digitalWrite(led1giallo, LOW);
    digitalWrite(led2giallo, LOW);
    digitalWrite(led1verde, LOW);
    digitalWrite(led2verde, LOW);
    digitalWrite(ledARMED, HIGH);
    digitalWrite(Buzzer, HIGH);
    delay(1000);
    digitalWrite(Buzzer, LOW);
    delay(500);
    digitalWrite(Buzzer, HIGH);
    delay(1000);
    digitalWrite(Buzzer, LOW);
    delay(500);
    digitalWrite(Buzzer, HIGH);
    delay(3000);
    digitalWrite(Buzzer, LOW);
    delay(500);
  }
}

void armed(){
  T1 = millis();
  if ( (T1-T0)>Tint ) {
    Tindex++;
    Serial.print(F("Index: "));
    Serial.println(Tindex);

    switch(Tindex){
    case 1:
      Tint +=5000;
      break;

    case 2:
      digitalWrite(ledDISARMED, LOW);
      digitalWrite(led1rosso, HIGH);
      digitalWrite(led2rosso, HIGH);
      digitalWrite(led1giallo, HIGH);
      digitalWrite(led2giallo, HIGH);
      digitalWrite(led1verde, HIGH);
      digitalWrite(led2verde, HIGH);
      digitalWrite(ledARMED, HIGH);
      //countdown totale minuti 30
      Tint +=300000;
      break;

    case 3:
      digitalWrite(led1verde, LOW);
      Tint +=300000;
      break;

    case 4:
      digitalWrite(led2verde, LOW);
      Tint +=300000;
      break;

    case 5:
      digitalWrite(led1giallo, LOW);
      Tint +=300000;
      break;

    case 6:
      digitalWrite(led2giallo, LOW);
      Tint +=300000;
      break;

    case 7:
      digitalWrite(led1rosso, LOW);
      Tint +=300000;
      break;

    case 8:
      digitalWrite(led2rosso, LOW);
      Tint +=250;
      break;

    case 9:
      digitalWrite(Buzzer, HIGH);
      Tint +=1000;
      break;

    case 10:
      digitalWrite(Buzzer, LOW);
      Tint +=500;
      break;

    case 11:
      digitalWrite(Buzzer, HIGH);
      Tint +=1000;
      break;

    case 12:
      digitalWrite(Buzzer, LOW);
      Tint +=500;
      break;

    case 13:
      digitalWrite(Buzzer, HIGH);
      Tint +=3000;
      break;

    case 14:
      digitalWrite(Buzzer, LOW);
      Tint +=500;
      break;

    default:
      break;
    }
  }
}

void disarmed(){
  digitalWrite(ledDISARMED, LOW);
  digitalWrite(ledARMED, LOW);
}



Ho cambiato i pin perché mi serviva liberare la seriale.
Dopo caricato lo sketch apri il monitor seriale.

I pin analogici li puoi usare come digitali, funzionano!  :smiley-mr-green:

M4gnotta

non va  :smiley-red:

come si accende suona diretto. non fa fare nulla  =(

PaoloP

Come hai collegato i pulsanti? Hai messo le pull-down?
Ho corretto il codice del countdown non la logica del programma.
Puoi spiegare qual'e la sequenza di azioni che vuoi che faccia il programma e quale deve essere la corretta sequenza dei pulsanti da premere?

M4gnotta

dunque.

1: accensione e led DISARMED accesi. attesa input pulsante (non il terminale,quello centrale)

2: pressione pulsante centrale --> accensione 5 sec DISARMED poi si spengono, un BIP e si accende il countdown con i led ARMED.

3: durante il countdown il programma attende input che sono 2. combinazione e pulsante del terminale. se entrambe le condizioni sono HIGH si spegne tutto e si accende solo i led DISARMED.  se si preme 3 volte il pulsante del terminale ma l'input della combinazione è LOW si blocca tutto e suona come se fosse finito il countdown.

4: alla fine di tutto,sia che sia stato premuto 3 volte il pulsante sia che sia terminato il tempo si deve resettare e ricominciare aspettando ancora il via con il pulsante centrale.


PaoloP

Quindi dopo aver acceso Arduino si deve accendere il led Disarmed e restare in attesa della pressione del pulsante centrale (che chiamerei ROSSO)
Premuto il pulsante ROSSO per armare il dispositivo si deve spegnere il led disarmed, fare bip e dopo 5 secondi iniziare tutta la sequenza del countdown.
Durante il conteggio si possono premere il pulsante VERDE (terminale) e BLU (combinazione).
Se si preme tre volte il pulsante verde il conteggio è interroto.
Se si premono contemporaneamente i pulsanti VERDE e BLU si torna alla condizione iniziale.

Dal fatto che usi stato e old_stato per ogni pulsante immagino che tu voglia che il pulsante venga registrato solo se viene premuto e rilasciato e non tenuto premuto.
Giusto?



leo72


nessuna news?

Devi darcela tu  ;)
Hai scritto il programma seguendo le indicazioni di Paolo?

M4gnotta

no non ce la posso fare. siamo già fuori portata per le mie capacità

lesto

Ti sottovaluti..
Comunque se speri che qualcuno ti scriva il codice questo forumon èil luogo giusto, qui si impara aA far da se
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up