Pages: [1]   Go Down
Author Topic: [Risolto]semaforo con fotocellule e conto alla rovescia  (Read 1148 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
    
   }
 }
« Last Edit: September 12, 2012, 05:31:39 am by barons1985 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: September 11, 2012, 03:32:22 pm by leo72 » Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Modifichi il loop così:
Code:
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
  }
}
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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);
    
   }
 }
« Last Edit: September 11, 2012, 04:30:12 pm by barons1985 » Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:


 #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
  }
}
« Last Edit: September 11, 2012, 04:50:09 pm by barons1985 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Pages: [1]   Go Up
Jump to: