Seguimi su Youtubue
Iscriviti
Se desideri, puoi effettuare un'iscrizione gratuita al forum per entrare nella nostra community.
Ricerca Avanzata
Pubblicità Google AdSense
Answers
Se necessiti di aiuto, clicca il pulsante "Cerco Aiuto" (disponibile anche per i non iscritti).
Ultimi argomenti
» libreria LiquidCrystal.h e LiquidCrystal_ I2C
Da papat Mar Ago 08, 2017 11:56 am

» libreria LiquidCrystal.h e LiquidCrystal_ I2C
Da papat Dom Ago 06, 2017 12:02 pm

» TOP 5 oggetti che perdi spesso
Da Poderak Gio Lug 13, 2017 4:26 pm

» arduino e ethernet shield tutorial 3
Da mariogori Ven Lug 07, 2017 8:52 pm

» Arduino comandato da cellulare
Da Poderak Ven Lug 07, 2017 6:17 pm

» Simulatore di navi: Traino nave in avaria - European Ship Simulator
Da Poderak Sab Lug 01, 2017 1:16 pm

» arduino e ethernet shield tutorial 3
Da Poderak Gio Giu 29, 2017 8:05 pm

» Farming Simulator 2018 logo
Da Poderak Ven Giu 23, 2017 3:29 pm

» Codice display a 7 segmenti - Arduino
Da fulvio Ven Giu 02, 2017 10:00 am

I postatori più attivi del mese
papat
 


Semaforo con millis aut./man.

Vedere l'argomento precedente Vedere l'argomento seguente Andare in basso

Semaforo con millis aut./man.

Messaggio Da Guido Laferrari il Gio Giu 23, 2016 5:47 pm

Ciao a tutti,
dopo aver capito più o meno la funzione millis ho provato realizzare uno sketch con questa funzione. Si tratta di gestire un comune semaforo stradale. Avrei due domande da sottoporti: per primo vorrei sapere se il codice è stato scritto nella maniera corretta, per secondo vorrei inserire un pulsante con il quale premendolo una prima  volta attivo il lampeggio del semaforo,premendolo una seconda volta resetto il lampeggio e così via. Ho provato ad inserirlo prima e dopo la funzione  millis ma non funziona,come e dove lo devo inserire? Se è possibile non scrivermi il codice, ma dimmi solo la logica. Ti ringrazio in anticipo

Guido

Codice:

int semaforo_rosso = 2;                    // led rosso  collegato al pin digitale  2
int semaforo_verde = 3;                    // led verde collegato al pin digitale   3
int semaforo_giallo = 4;                   // led giallo  collegato al pin digitale 4
int puls            = 5;
int val             = 0;
int stato           = 0;
int interval       = 5000;                 // intervallo di tempo per lampeggio semaforo
int contatore      = 0;                    // conta la sequenza del semaforo
long previousMillis = 0;                   // memorizza l'ultima volta l'intervallo è stato aggiornato 

void setup() {
 pinMode(semaforo_rosso,OUTPUT);           // imposta pin 2 come outpu
 pinMode(semaforo_verde,OUTPUT);           // imposta pin 3 come outpu
 pinMode(semaforo_giallo,OUTPUT);          // imposta pin 4 come outpu
 pinMode(puls,INPUT);
}

void loop() {
 val=digitalRead(puls);
 if(val==1){
  stato = 1 - stato;
  delay(30);
 }


 if (millis() - previousMillis > interval)  {
    previousMillis = millis ();   
    contatore++;
 }
 switch ( contatore ){

case 1 :
 digitalWrite(semaforo_rosso,LOW);  
 digitalWrite(semaforo_verde,HIGH);
 break;
 case 2 :  
 digitalWrite(semaforo_giallo,HIGH);
 break;
}
 if (contatore > 2 ){
 digitalWrite(semaforo_rosso,HIGH);
 digitalWrite(semaforo_verde,LOW);
 digitalWrite(semaforo_giallo,LOW);
 contatore=0;
 }
 }





avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedi il profilo dell'utente

Tornare in alto Andare in basso

Re: Semaforo con millis aut./man.

Messaggio Da Poderak il Gio Giu 23, 2016 6:38 pm

Ciao Guido, prima di tutto complimenti... Hai fatto passi da gigante dalla prima volta! Very Happy

Il codice è strutturato molto bene ed è leggibile Wink. Per quanto riguarda la tua seconda richiesta, se ho capito bene vuoi che con un pulsante se clicchi si disattiva e lampeggia e se riclicchi riparte a fare il suo mestiere.

Una cosa del genere l'ho fatta anch'io ma non con il millis ma bensì con il delay (il mio è poco ottimale mentre con il millis è meglio, quindi molto bravo per la scelta!! Wink). In pratica dovrai aggiungere nel codice il tuo pulsante e due variabili: Una che legge se il pulsante è premuto (quindi leggera 0 o 1) e una che ricorda lo stato del pulsante (nel primo stato i semafori lampeggiano mentre nel secondo i semafori funzionano correttamente). Per fare ciò dovrai prima di tutto leggere il pulsante e con un if cambiare la variabile stato. Continuando con il codice, dovrai fare due if nella quale nel primo if i semafori lampeggiando mentre nel secondo if il semaforo fa il suo lavoro. A grandi linee, in questo modo dovresti riuscire nel tuo progetto Very Happy.

Fammi sapere Ciao!
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4196
Crediti Crediti : 11726
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedi il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Semaforo con millis aut./man.

Messaggio Da Guido Laferrari il Mer Giu 29, 2016 6:08 pm

Ciao ,
sono riuscito a terminare il mio primo sketch da solo,ho portato alcune modifiche e grazie alle quali sono riuscito a realizzarlo come mi ero prefissato. In sostanza si tratta di questo: con il selettore aut./man. svolgo due funzioni ,quando è posizionato in manuale lampeggia solo il semaforo giallo,quando si passa in automatico parte la sequenza di un comune semaforo stradale . Ti sottopongo il codice così mi potrai dare un tuo giudizio. Ti ringrazio in anticipo.  
Guido 

Codice:
int semaforo_rosso  = 2;                  // led rosso  collegato al pin digitale  2
int semaforo_verde  = 3;                  // led verde collegato al pin digitale  3
int semaforo_giallo = 4;                  // led giallo  collegato al pin digitale 4
int selett          = 5;                  // selettore aut./manu.collegato al pin digitale 5
int val            = 0;                  // variabile dove memorizzare aut./man.
int contatore      = 0;                  // conta la sequenza del semaforo
int giallo_stato    = 0;                  // variabile per lampeggio in manuale
const long interval1          = 500;      // intervallo di tempo per lampeggio semaforo giallo in manuale
unsigned long previousMillis1 = 0;        // memorizza l'ultima volta che l'intervallo è stato aggiornato
const long interval          = 5000;      // intervallo di tempo per lampeggio semaforo in automatico
unsigned long previousMillis  = 0;        // memorizza l'ultima volta che l'intervallo è stato aggiornato
unsigned long time = 0;                    // variabile dove copio valore millis
                 
// usare " unsigned long " per le variabili che tengono il tempo
                                         
void setup() {
 pinMode(semaforo_rosso,OUTPUT);          // imposta pin 2 come outpu
 pinMode(semaforo_verde,OUTPUT);          // imposta pin 3 come outpu
 pinMode(semaforo_giallo,OUTPUT);          // imposta pin 4 come outpu
 pinMode(selett,INPUT);                    // imposta pin 5 come input
 time=millis();                            // copio valore millis
}


void loop() {
  time=millis();                          // copio valore millis
 
 val=digitalRead(selett);
 
 if (val==0){                              // val=0 semaforo in manuale
  digitalWrite(semaforo_rosso,LOW);
  digitalWrite(semaforo_verde,LOW);
  contatore = 0;
  previousMillis = time;                  // memorizzo il valore time nella previousMillis
 if (time-previousMillis1 >interval1){
  previousMillis1 = time ;
  if (giallo_stato == LOW){
    giallo_stato = HIGH;
  }
  else {
    giallo_stato  = LOW;
  }
 digitalWrite(semaforo_giallo,giallo_stato);
  }
  }
 if (val==1){                              // val=1 semaforo in automatico
  previousMillis1 = time ;                // memorizzo il valore time nella previousMillis1
 if (contatore==0){
 digitalWrite (semaforo_rosso,HIGH);
 digitalWrite(semaforo_giallo,LOW);
  }
 
 if (time - previousMillis > interval)  {
    previousMillis = time;                // dopo che si è verificato vero l'if memorizzo il valore time nella previousMillis
    contatore++;                          // incremento di 1 il valore del contatore
 }
 switch ( contatore ){
 case 1 :
 digitalWrite(semaforo_rosso,LOW); 
 digitalWrite(semaforo_verde,HIGH);
 break;
 case 2 : 
 digitalWrite(semaforo_giallo,HIGH);
 break;
 case 3 :
 digitalWrite(semaforo_verde,LOW);
 digitalWrite(semaforo_giallo,LOW);
 contatore=0;
 break;
 }
 }
 }


Ultima modifica di Admin il Mer Giu 29, 2016 6:51 pm, modificato 1 volta (Motivazione : sistemato layout messaggio)
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedi il profilo dell'utente

Tornare in alto Andare in basso

Re: Semaforo con millis aut./man.

Messaggio Da Poderak il Mer Giu 29, 2016 6:52 pm

Ciao, posso dirti che hai fatto passi da gigante? Very Happy

La struttura del codice è leggibile e addirittura hai commentato tutto! Direi che è il top del top. Che ne pensi di fare un piccolo video e di caricarlo su Youtube? Così fai anche una dimostrazione Razz.

Fammi sapere cosa ne pensi Ciao!
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4196
Crediti Crediti : 11726
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedi il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Re: Semaforo con millis aut./man.

Messaggio Da Guido Laferrari il Sab Lug 02, 2016 4:00 pm

Ciao
Ti ringrazio per le belle parole, per quanto riguarda il video e la dimostrazione non me la sento,ti ringrazio ancora per il tuo prezioso aiuto a risentirci al prossimo progetto.
Guido
avatar
Guido Laferrari
Livello due
Livello due

Messaggi Messaggi : 34
Crediti Crediti : 54
Reputazione Reputazione : 2
Data d'iscrizione Data d'iscrizione : 30.04.16

Vedi il profilo dell'utente

Tornare in alto Andare in basso

Re: Semaforo con millis aut./man.

Messaggio Da Poderak il Sab Lug 02, 2016 6:52 pm

Prego Guido, non preoccuparti. Al massimo puoi fare anche solo qualche foto e caricarle. Se non te la senti, nessun problema Very Happy.

Buona giornata Ciao!
avatar
Poderak
♔ Amministratore

Messaggi Messaggi : 4196
Crediti Crediti : 11726
Reputazione Reputazione : 186
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 18
Località Località : Brescia

Vedi il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Vedere l'argomento precedente Vedere l'argomento seguente Tornare in alto


 
Permessi di questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum