Go Down

Topic: [Risolto]semaforo con fotocellule e conto alla rovescia (Read 1 time) previous topic - next topic

Sep 11, 2012, 08:04 pm Last Edit: Sep 12, 2012, 12:31 pm by barons1985 Reason: 1
ciao a tutti, possiedo arduino 1, sto realizzando una piccola centralina per dei  semafori, l idea e quella di fare in modo che arduino esegua una riga di codice solo se le fotocellule ( o pulsante), e rimasto premuto per piu di 3 secondi, non so propio come fare il conto allarovescia,gentilmente mi potreste aiutate?
grazie a tutti

il codice che ho realizzato e il seguente:
#define verde1 13
#define rosso1 12
#define verde2 11
#define rosso2 10
#define pulsante 7

int val = 0; // conserva lo stato del pin di input



void setup(){
  pinMode (verde1, OUTPUT);
  pinMode (rosso1,OUTPUT);
  pinMode (verde2,OUTPUT);
  pinMode (rosso2,OUTPUT);
  pinMode (pulsante, INPUT);
  digitalWrite(pulsante,HIGH);
 
}

void loop(){
  val = digitalRead(pulsante); // legge
 
 
  if (val==LOW){
    digitalWrite(verde2, LOW);
    digitalWrite(rosso2, HIGH);
    digitalWrite(rosso1, HIGH);
    delay (5000);
    digitalWrite(verde1, HIGH);
    digitalWrite(rosso2,HIGH);
    digitalWrite(rosso1,LOW);
    delay(8000);
  }
  else{
    digitalWrite(rosso1,HIGH);
    digitalWrite(verde2,HIGH);
    digitalWrite(verde1,LOW);
    digitalWrite(rosso2, LOW);
   
  }
}

leo72

#1
Sep 11, 2012, 08:48 pm Last Edit: Sep 11, 2012, 10:32 pm by leo72 Reason: 1
Devi usare la funzione millis, che restituisce il numero di millisecondi dall'avvio di Arduino.
Quando rilevi il passaggio dalla fotocellula (o la pressione del pulsante), imposti una variabile con il contenuto di millis sommato all'intervallo che vuoi misurare, metti una variabile booleana a trueed entri in un ciclo while. All'interno del ciclo devi leggere costantemente il pin a cui hai collegato il sensore/pulsante. Nel momento in cui cambia di stato, esci dal while con break.
Altrimenti la condizione di chiusura del ciclo while è che millis sia maggiore del valore di millis sommato all'intervallo. Al di fuori del while controlli la variabile booleana: se è false, allora sei uscito dal ciclo per disattivazione della lettura (vuol dire che l'utente ha tolto il dito dal pulsante), se è true, significa che il sensore/pulsante è rimasto attivato per più dell'intervallo.

In pseudocodice:

Code: [Select]
uscita_programmata = millis + intervallo
pressione_continua = true
do
 if (lettura_sensora != stato_programmato)
    pressione_continua = false
   break
 endif
while (millis <= uscita_programmata)
if (pressione_continua == true)
 ....sensore interrotto per tutto l'intervallo
else
 ....dito staccato prima del tempo
endif

Te l'ho messo in pseudo codice perché devi essere tu a riportarlo in linguaggio Arduino, altrimenti non impari

Ciao, grazie per l aiuto! Solo non riesco a capire lostesso, sono alle prime armi, ad esempio nel setup devo mettere qual cosa? E nel loop? Grazie

leo72

Il controllo lo devi inserire nel loop al posto del tuo attuale check dello stato del pin collegato al sensore/pulsante. Poi la logica di lampeggio la metti successivamente.

ci sto provando in tutte le maniere prendendo spunto dai link di millis ecc, solo non riesco  :smiley-eek-blue:
potresti aiutarmi un po di piu?
grazie

leo72

Modifichi il loop così:
Code: [Select]
void loop() {
  unsigned long uscita_programmata = millis() + 3000; //3 secondi
  boolean pressione_continua = true;
  do {
    if (digitalRead(pulsante) == HIGH) { //oppure LOW, dipende dalla logica di funzionamento del tuo pulsante
      pressione_continua = false;
      break;
    }
  } while (millis() <= uscita_programmata);
  if (pressione_continua == true) {
    //  ....sensore premuto per tutto l'intervallo
  } else {{
    //  ....dito staccato prima del tempo
  }
}

#6
Sep 11, 2012, 10:32 pm Last Edit: Sep 11, 2012, 11:30 pm by barons1985 Reason: 1
Code: [Select]
arrivo fino a qui ma credo sia un gran casino

#define verde1 13
#define rosso1 12
#define verde2 11
#define rosso2 10
#define pulsante 7

int val = 0; // conserva lo stato del pin di input

void setup(){
  pinMode (verde1, OUTPUT);
  pinMode (rosso1,OUTPUT);
  pinMode (verde2,OUTPUT);
  pinMode (rosso2,OUTPUT);
  pinMode (pulsante, INPUT);
  digitalWrite(pulsante,HIGH);
}

void loop(){
  val = digitalRead(pulsante);
  // legge
  if (val==LOW){
uscita_programmata = millis + 3000;
pressione_continua = false
do
 if (lettura_sensora != stato_programmato)
   break
 endif
while (millis <= uscita_programmata)
if (pressione_continua == true)
digitalWrite(verde2, LOW);
    digitalWrite(rosso2, HIGH);
    digitalWrite(rosso1, HIGH);
    delay (5000);
    digitalWrite(verde1, HIGH);
    digitalWrite(rosso2,HIGH);
    digitalWrite(rosso1,LOW);
    delay(8000);


   
  }
  else{
    digitalWrite(rosso1,HIGH);
    digitalWrite(verde2,HIGH);
    digitalWrite(verde1,LOW);
    digitalWrite(rosso2, LOW);
   
  }
}

#7
Sep 11, 2012, 10:40 pm Last Edit: Sep 11, 2012, 11:50 pm by barons1985 Reason: 1
GRAZIE GRAZIE GRAZIE MILLE per l enorme aiuto che mi hai, da solo non credo proprio  che c e l avrei fatta,
funziona benissimo

se potesse tornare utile ad altri utenti:
Code: [Select]



#define verde1 13
#define rosso1 12
#define verde2 11
#define rosso2 10
#define pulsante 7

int val = 0; // conserva lo stato del pin di input

void setup(){
   pinMode (verde1, OUTPUT);
   pinMode (rosso1,OUTPUT);
   pinMode (verde2,OUTPUT);
   pinMode (rosso2,OUTPUT);
   pinMode (pulsante, INPUT);
   digitalWrite(pulsante,HIGH);
}


void loop() {
  unsigned long uscita_programmata = millis() + 3000; //3 secondi
  boolean pressione_continua = true;
  do {
    if (digitalRead(pulsante) == HIGH) { //oppure LOW, dipende dalla logica di funzionamento del tuo pulsante
      pressione_continua = false;
      break;
    }
  } while (millis() <= uscita_programmata);
  if (pressione_continua == true) {
     digitalWrite(verde2, LOW);
     digitalWrite(rosso2, HIGH);
     digitalWrite(rosso1, HIGH);
     delay (5000);
     digitalWrite(verde1, HIGH);
     digitalWrite(rosso2,HIGH);
     digitalWrite(rosso1,LOW);
     delay(8000);
    //  ....sensore premuto per tutto l'intervallo
  } else {digitalWrite(rosso1,HIGH);
     digitalWrite(verde2,HIGH);
     digitalWrite(verde1,LOW);
     digitalWrite(rosso2, LOW);
    //  ....dito staccato prima del tempo
  }
}


leo72

Ti ringrazio per i... ringraziamenti  :smiley-sweat:

Ti chiedo però di editare il tuo messaggio e racchiudere il codice all'interno degli appositi tag CODE che compaiono cliccando sull'icona "#" sopra alle faccine, almeno è più leggibile.

Scusa l ignoranza ma come devo fate per editare?
Per il codice credo di aver capito

leo72

Modifichi il tuo post, cliccando su "modify" proprio sopra ad esso. E poi racchiudi il codice come ti ho detto.

Go Up