Arduino Forum

International => Italiano => Hardware => Topic started by: Puso on Jul 28, 2017, 06:35 pm

Title: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 28, 2017, 06:35 pm
Salve
premesso che sono alle prime armi,
sto tentando di realizzare il mio primo programma concreto,IL SEMAFORO.
Ora avendo gia scritto un programma per prendere confidenza,ho ipotizzato un incrocio ed i semafori che lavorano nella loro sequenza,poi pero mi sono posto un problema;

e se arriva un Vecchio che preme il pulsante Pedonale,che succede?

Nulla,perchè se ho capito bene o lo preme in un preciso istante del LOOP,oppure resta li e continua ad invecchiare.

Mi è venuto in mente una soluzione elettrotecnica(in cui sono più ferrato) in cui il pulsante si comporta ON quando viene premuto e ritorna OFF dopo un certo periodoe E QUI in ELETTRONICA ed PROGRAMMAZIONE per ignoranza mi sono arenato.

DOMANDA:

1 esiste una programmaziione che legge un input digitale DURANTE ed INDIPENDENTE dal LOOP?
2  se non esiste,come posso replicare la mia soluzione elettrotecnica,il più semplicemente possibile, magari con un transistor (che sono la mia dannazione e non mi entrano in testa)?


Grazie se mi rispondete
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: ORSO2001 on Jul 28, 2017, 06:55 pm
Ciao Puso,

presentati nell'apposita sezione QUI. (https://forum.arduino.cc/index.php?topic=113640.0)

poi per fare quello vuoi ti ci sono diversi modi...anche solo software.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 28, 2017, 07:00 pm
ho cliccato
 ma non ho capito  dove devo scrivere.

scusate ma non sono pratico dei forum
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: ORSO2001 on Jul 28, 2017, 07:10 pm
ciao...ti sei già presentato...non so perchè ma prima non vedevo il tuo post di presentazione...detto questo se fai una ricerca nei miei post ...un po' di tempo fa...ho postato quello che ti serve.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 28, 2017, 07:14 pm
ciao orso
grazie per avermi risposto

io non sono piu un ragazzino e faccio fatica atrovare i tuoi post e non leggo inglese( è come i transitor,non mi entrano in testa).

puoi darmi qualche riferimento?
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 28, 2017, 07:21 pm
in pratica mi son messo dalla parte del vecchietto che preme un pulsante per attraversare un passaggio pedonale mentre è in esecuzione un CICLO.

e mi trovo al punto che o mi studio tutto il ciclo e premo il pulsante al momento opportuno, oppure;
-resto li fino a diventare una mummia.
-ci provo e passo durante il cilo LOOP, rischiando di farmi investire.
-oppure mi arrangio con un semolice Relè ed un Timer (ELETTROTECNICA).
-oppure qualkuno mi aiuta e mi da un alternativa.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: ORSO2001 on Jul 28, 2017, 07:58 pm
ciao...

bhe...al momento ho scritto solo nella sezione in italiano...per cercare nei post di qualcuno basta che clicchi sulla suo icona/avater...ho il dubbio che il tuo sketch faccia tanto uso della funzione delay()...no buono!

se non vuoi fare un po' di ricerca nei vari post devo dirti di dare un occhio QUI (https://www.arduino.cc/en/Reference/Millis) e QUI (https://www.arduino.cc/en/Reference/AttachInterrupt)
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Jul 28, 2017, 08:05 pm
alternative:

monostabile che memorizza il fatto di aver premuto un tasto almeno per un tempo superiore ad un ciclo di loop
santo 555 aiutami tu

ma un metodo del genere è concettualmente arcaico

usare un interrupt, connesso al pulsante
funziona certamente, ma è come sparare con un 88/70 contro una zanzara
uno spreco di risorse

pensiero laterale
far gestire la cosa alla setup invece che alla loop
il pulsante invece che normalmente aperto è normalmente chiuso, e taglia l'alimentazione di arduino
una pressata, l'arduino resetta e riparte la setup
si potrebbe anche usare direttamente il pin reset

ma questi son metodi da macellaio, non da veri programmatori

secondo me la soluzione vera è tenere la loop veloce,velocissima ed eseguire le azioni di accensione/spegnimento delle luci non in funzione di una delay, ma di un test sulla millis

io farei così

per cominciare una funzione di "comando luci" che riceve in ingresso un array di char
ad ogni elemento dell'array associo una terna di luci, e una lettera che indica lo stato
del tipo RGRG indica rosso sulla palina 1 giallo( col verde) sulla palina 2
e via così

così comandare il semaforo diventa semplice
comanda_luci("RGRG");

se questo va passerei a scrivere nella loop una cosa del tipo

if tempo>millis()....{
comanda_luci(quello che serve)
tempo=millis()+nuova attesa
}

appena fatto questo , che richiede il tempo minimo tecnico
posso controllare il pulsante
e naturalmente iniziare la nuova sequenza che serve

si potrebbe pensare ad una array di strutture
-configurazione luci
-tempo che deve durare

la loop si limita a ciclare l'array principale
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 09:03 am
Si lo ammetto
 tanto uso della funzione delay per rendere i semafori abbastanza realistici(in tutto il loop dura circa 20 secondi)

credo che anche utilizzando

if tempo>millis()....{
comanda_luci(quello che serve)
tempo=millis()+nuova attesa
}

tutto il ciclo completo dei semafori durerebbe sempre 20 secondi.

Potrei aggiungere ulteriori delay velocissimi in modo da far lampeggiare i led velocissimamente (cosi l'occhio umano li percepirebbe accesi) ed in mezzo ad ogni stringa infilarci la lettura del pulsante,ma per farlo dovrei scrivere uno sketch lungo come la bibbia e i vangeli assieme.

Ammetto anche  che utilizzare il Reset oppure NE555........sono state le prime 2 soluzioni che mi sono venute in mente e per il momento vedo poche alternative.

In realtà  mi servirebbe una funzione che stia ell'esterno del LOOP e che agisca comunque.

Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: astrobeed on Jul 29, 2017, 09:16 am
ma questi son metodi da macellaio, non da veri programmatori
Mi sono appena reso conto che nessuno in questo forum, ma anche su i vari libri per Arduino, ha mai spiegato come si deve scrivere un programma, a partire dal fatto che usare una variabile di tipo int per definire i pin è uno spreco assurdo della ram, risorsa preziosa e limitata sulle piccole mcu, per finire col fatto che il ciclo main(), loop() su Arduino, deve essere ripetuto il maggior numero possibile di volte al secondo e che nessuna funzione deve essere bloccante e/o impegnare la cpu per più di pochi ms.
Se oggi trovo un'oretta libera da dedicare alla cosa vedo di preparare un pdf che spiega, almeno il minimo sindacale, come si deve scrivere un programma.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 09:33 am
 :smiley-confuse:
nel frattempo mi dici se al mio problema esiste un metodo alternativo a quelli da macellaio.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Claudio_FF on Jul 29, 2017, 09:38 am
Quote from: Puso
Potrei aggiungere ulteriori delay velocissimi in modo da far lampeggiare i led velocissimamente (cosi l'occhio umano li percepirebbe accesi) ed in mezzo ad ogni stringa infilarci la lettura del pulsante,ma per farlo dovrei scrivere uno sketch lungo come la bibbia e i vangeli assieme
Ci sei quasi, l'idea del "velocissimo spezzettato" per fare più cose assieme è corretta, ma probabilmente non l'implementazione a cui pensi. In realtà è più semplice (macchine a stati finiti), attendiamo il post di Astro per avere qualcosa di pratico su cui discutere.

Tra l'altro, se riesci a fare uno schema a relè/temporizzatori/pulsanti "classici", tradurlo in funzioni logiche equivalenti è un altro modo ancora per affrontare il problema.

In entrambi i casi il loop dovrebbe procedere a diverse migliaia di cicli completi al secondo.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: PaoloP on Jul 29, 2017, 09:45 am
Io creerei una struttura del genere
Code: [Select]
void loop(){
controllopulsanti();
controllotempo();
comandasemafori();
}

il codice deve girare sempre senza delay usando la funzione millis() per determinare lo stato di accensione delle varie luci.
Userei poi una struttura per definire i semafori e passare i parametri da una funzione all'altra.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 09:57 am
Fare uno schema a relè/temporizzatori/pulsanti "classici", tradurlo in funzioni logiche equivalenti potrei anche riusirci,resta il fatto che il LOOP,legge le righe in fila ed una volta che è partito non posso aggiungere o toglier niente.

Anche utilizzando la struttura che consigli,resta sempre il fatto che il ciclo completo dei semafori durerebbe 20 secondi e dovrei premere il pulsante al momento giusto per fargli leggere lo stato differente.

mi sa che devo preparmi davvero ad uno sketch lungo come la divina commedia.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: PaoloP on Jul 29, 2017, 10:30 am
Non stai pensando quadrimensionalmente! (cit.)

Anche se una lampadina deve rimanere accesa 20 secondi, il loop() non deve durare 20 secondi.
Il ciclo loop() deve durare una frazione di secondo e deve essere sufficientemente breve da intercettare la pressione del pulsante.

Esempio:
Code: [Select]
void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= 20000) {
    previousMillis = currentMillis;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }

}

Il led si accende e si spegne ad intervalli di 20 secondi. il ciclo dura meno di un millisecondo.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 10:46 am
potrebbe essere la soluzione...mo ci provo grazie per il momento
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 11:06 am
mi da errore....ho fatto copia incolla ed ho solo corretto il setup
Code: [Select]


void setup() {
pinMode(31, OUTPUT);
pinMode(33, OUTPUT);  

}



void loop() {
 unsigned long currentMillis = millis();

 if (currentMillis - previousMillis >= 20000) {
   previousMillis = currentMillis;
   if (ledState == LOW) {
     ledState = HIGH;
   } else {
     ledState = LOW;
   }
   digitalWrite(ledPin, ledState);
 }

}
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Jul 29, 2017, 11:06 am
credo che anche utilizzando

if tempo>millis()....{
comanda_luci(quello che serve)
tempo=millis()+nuova attesa
}

tutto il ciclo completo dei semafori durerebbe sempre 20 secondi.

il ciclo completo certamente

Ma non la loop
Che sarebbe velocissima...

E che naturalmente interromperebbe il ciclo

Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 11:13 am
perfetto prima avevo le idee confuse...adesso sto pensando seriamente di fargli leggere il pulsante quando voglio io ......con un martello
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: -zef- on Jul 29, 2017, 11:30 am
secondo me vuoi fare il passo più lungo della gamba, inizia a far lampeggiare due led con tempi diversi con millis(), poi intercetta la pressione di un pulsante e fai fare qualcosa di conseguenza ai due led, che so che rimangano accesi per 2  secondi.... una volta che hai le idee ben chiare su come gestire millis() e leggere un input lo espandi per realizzare tutto il semaforo
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 11:35 am
mi sa che hai ragione ...è meglio che ricomincio con qualcosa di più semplice....anche perche non so programmare ripeto sono alle prime armi.

anche se il semaforo mi sembrava semplice.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Claudio_FF on Jul 29, 2017, 12:30 pm
Quote from: Puso
mi da errore....ho fatto copia incolla
Molti esempi danno per scontato che determinati nomi presenti nel codice sono variabili o costanti che vanno definite da altre parti. In particolare previousMillis e ledState sono due variabili globali da definire all'inizio del programma, e ledPin è  una costante, che va sempre definita in precedenza. Gli errori del compilatore dovrebbero permettere di capire cosa si è scritto in modo errato e in quale riga.

Quella è comunque la via giusta, il loop cicla continuamente alla massima velocità e testa continuamente il verificarsi di qualche condizione. Solo nell'istante in cui una condizione risulta vera allora si esegue quanto contenuto nell'if (e le operazioni da eseguire a loro volta non devono bloccare o durare molto tempo).

Quote
Fare uno schema a relè/temporizzatori/pulsanti "classici", tradurlo in funzioni logiche equivalenti potrei anche riusirci,resta il fatto che il LOOP,legge le righe in fila ed una volta che è partito non posso aggiungere o toglier niente.
Non ho capito cosa intendi con aggiungere/togliere. Lo schema seguente è un classico marcia/arresto, con in più un timer per l'arresto dopo tot (facciamo 5 minuti):



Questo è un esempio di istruzioni da mettere nella funzione loop, che rappresentano pari pari il circuito:

Code: [Select]
byte STA = digitalRead(STA_PIN);
byte STO = digitalRead(STO_PIN);
A = (A | STA) & !T1out & !STO;
if (!A) { T1time=millis();  T1out=0; } else if (millis() - T1time >= 300000) T1out = 1;
digitalWrite(OUT_PIN, A);

NOTA: si assume che i pulsanti premuti diano un 1 in lettura, e che la luce si accenda con un 1 in scrittura

NOTA2: STA_PIN, STO_PIN, OUT_PIN, sono costanti che indicano i pin usati, mentre A, T1time, T1out, sono variabili di lavoro definite in precedenza:
Code: [Select]
#define STA_PIN  2
#define STO_PIN  3
#define OUT_PIN  4
byte A = 0;
byte T1out = 0;
unsigned long T1time = millis();


Nonostante il tempo del processo timer sia di cinque minuti (300mila ms), il loop gira alla massima velocità e i pulsanti vengono letti continuamente (ad occhio almeno diecimila volte al secondo).

NOTA3: in un circuito reale con pulsanti/contatti meccanici bisogna anche effettuare il debounce (filtro antirimbalzo) degli ingressi.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 01:24 pm
intendo che :
lo schema elettromeccanico funziona
probabilmente ance come lo hai riportato in funzione logica funziona

pero mettiamo per ipotesi che durante il tempo in cui il timer tiene eccitato il relè, arriva un che vuole accendere una lampadina

a livello elettrotecnico baterebbe mettere in parallelo un interuttore con la lampadina e se arriva uno che la vuole accendere basta che schiaccia l'interruttore indipendentemente da cosa sta facendo il timer (non gli interessa)

a livello logico invece dovrebbe aspettare che il timer abbia finito il suo lavoro.


non so se mi sono spiegato

sorry
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 01:30 pm
-pulsante-
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 29, 2017, 01:39 pm
ecco secondo me ci correbbero dei LOOP in parallelo.....mentre adesso mi sembra che ci sia un unico LOOP che funziona in serie

spero di sbagliarmi
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Claudio_FF on Jul 29, 2017, 02:27 pm
Quote from: Puso
a livello elettrotecnico baterebbe mettere in parallelo un interuttore con la lampadina e se arriva uno che la vuole accendere basta che schiaccia l'interruttore indipendentemente da cosa sta facendo il timer (non gli interessa)

a livello logico invece dovrebbe aspettare che il timer abbia finito il suo lavoro.
No, visto che l'intera serie di istruzioni è sempre valutata/eseguita migliaia di volte al secondo, basta aggiungere una o due righe per leggere il nuovo interruttore e scrivere la nuova uscita (lo schema si può complicare a piacere con quanti elementi e timer indipendenti si vuole).

Quote
secondo me ci correbbero dei LOOP in parallelo.....mentre adesso mi sembra che ci sia un unico LOOP che funziona in serie
Quello che mi sembra sfugga è il fatto che l'esecuzione di quella serie di istruzioni dura in ogni caso pochi microsecondi (una quindicina), quindi ogni singolo componente dello schema viene virtualmente "eseguito" in parallelo a tutti gli altri ogni pochi microsecondi. La logica e i tempi del processo complessivo sono formati da innumerevoli cicli del loop principale.

NOTA: ad ogni nuovo ciclo i dati di lavoro sono rappresentati dalle letture attuali degli ingressi, e dalle variabili impostate nei cicli precedenti (stato).

Quote
anche se il semaforo mi sembrava semplice
Il semaforo monotask si, ma come in pratica in tutti i progetti "reali" ci si è trovati subito ad avere bisogno del multitasking (cooperativo), che richiede un diverso approccio/design. È abbastanza carne al fuoco tutta in una volta  ;)
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: ORSO2001 on Jul 29, 2017, 02:41 pm
Ciao Puso,

forse... e dico forse...per dimostrare la vera differenza che c'è tra usare delay() e millis() prova ad eseguire questi due sketch che ad ogni secondo scrivono su monitor quanti cicli il loop() ha eseguito in un secondo.

con delay()

Code: [Select]
unsigned long ciclo = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(1000);
  Serial.println(ciclo);
  ciclo++;
}


con millis():
Code: [Select]
unsigned long ciclo = 0;
unsigned long tempo;

void setup() {
  Serial.begin(9600);
  tempo = millis();
}

void loop() {
  if (millis() - tempo == 1000) {
    Serial.println(ciclo);
    tempo=millis();
  }
  ciclo++;
}


...se poi vuoi comunque che il pulsante premuto abbia precedenza su tutto...si deve andare di interrupt...
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: PaoloP on Jul 30, 2017, 10:22 am
mi da errore....ho fatto copia incolla ed ho solo corretto il setup
Il codice pubblicato non è completo perché lo trovi già pronto tra gli esempi dell'IDE: Blink without delay
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Jul 30, 2017, 11:52 am
Un pochino di masturbazione intellettuale lo vedo, ben spalmata....


Se vogliamo replicare il funzionamento di un circuito a relè  e timer elettromeccanici si può  fare, ma non è  così  che si programma arduino


Io sono quello che ne sa meno di tutti, qui, ma vedo che la strada non è  quella giusta

Torno a dire che un test su millis, che legge da un array di strutture ed esegue le istruzioni codificate è  un approccio modulare, semplice, espandibile




Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: erosb on Jul 30, 2017, 11:59 am
astrobeed,

nonostante tutto quello che si è scritto, attendiamo volentieri il Tuo PDF.

grazie
 E:B:
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: astrobeed on Jul 30, 2017, 12:03 pm
Quello che ho intenzione di realizzare, e devo trovare il tempo per farlo, non è una soluzione al tuo problema, è una guida generale su come si deve scrivere un programma per mcu/micro.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 30, 2017, 01:04 pm
se l'ignoranza avesse le ali......io guiderei uno stormo di somari
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Jul 30, 2017, 01:17 pm
orso
me lo riscrivi per favore la differenza tra delay e millis.....utulizzando le uscite digitali.....se no leggo solo numeri e non capisco cosa fanno
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Claudio_FF on Jul 30, 2017, 01:49 pm
Quote from: docsavage
Se vogliamo replicare il funzionamento di un circuito a relè  e timer elettromeccanici si può  fare, ma non è  così  che si programma arduino

Io sono quello che ne sa meno di tutti, qui, ma vedo che la strada non è  quella giusta

Torno a dire che un test su millis, che legge da un array di strutture ed esegue le istruzioni codificate è  un approccio modulare, semplice, espandibile
L' OP ha detto di essere alle prime armi con la programmazione e di conoscere un po' di elettrotecnica. Gli array di strutture sono cose che secondo me arrivano tra molti mesi. D'altra parte in questo thread si è proposto di tutto, i relé simulati sono solo una delle varie possibilità, che ho usato come spunto "familiare" in quanto il punto esame in questo momento mi sembra che non sia tanto come fare qualcosa, ma come fare diverse cose contemporaneamente.

Quote from: Puso
orso
me lo riscrivi per favore la differenza tra delay e millis.....utulizzando le uscite digitali.....se no leggo solo numeri e non capisco cosa fanno
Quei numeri indicano quante volte è girato il loop principale ogni secondo trascorso. Nel primo caso la parte che scrive sulla seriale blocca tutto con delay, nel secondo no e nel loop principale si potrebbero fare altre cose "in parallelo".

Un esempio di tre LED che lampeggiano ciascuno per i fatti propri:
Code: [Select]
#define LED1_PIN  2
#define LED2_PIN  3
#define LED3_PIN  4
#define TEMPO1    500
#define TEMPO2    240
#define TEMPO3    1300


unsigned long t1 = millis();
unsigned long t2 = millis();
unsigned long t3 = millis();
unsigned long actualTime;


void setup() {
    pinMode(LED1_PIN, OUTPUT);
    pinMode(LED2_PIN, OUTPUT);
    pinMode(LED3_PIN, OUTPUT);
}


void loop() {
    actualTime = millis();
   
    if (actualTime - t1 >= TEMPO1) {
        t1 += TEMPO1;
        digitalWrite(LED1_PIN, !digitalRead(LED1_PIN));
    }

    if (actualTime - t2 >= TEMPO2) {
        t2 += TEMPO2;
        digitalWrite(LED2_PIN, !digitalRead(LED2_PIN));
    }

    if (actualTime - t3 >= TEMPO3) {
        t3 += TEMPO3;
        digitalWrite(LED3_PIN, !digitalRead(LED3_PIN));
    }
}
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: ORSO2001 on Jul 30, 2017, 01:56 pm
ciao...ci provo.

utilizzando LED integrato dell'arduino, se hai una UNO dovrebbe essere il PIN 13 e che puoi chiamare LED_BUILTIN, ed il LED della comunicazione su monitor seriale...il primo lo vedrai sempre cambiare di stato ogni mezzo secondo...l'altro, a seconda se usi millis() o delay() varia ad ogni esecuzione ciclo...quindi con delay() lo vedrai lampeggiare lento con millis() ti sembrerà sempre acceso da quante volte esegue il ciclo.

con delay():
Code: [Select]
unsigned long ciclo = 0;

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  Serial.println(ciclo);
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  delay(500);
  ciclo++;
}


con milli():
Code: [Select]
unsigned long ciclo = 0;
unsigned long tempo;

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  tempo = millis();
}

void loop() {
  Serial.println(ciclo);
  if (millis() - tempo >= 500) {
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    tempo = millis();
  }
  ciclo++;
}
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Jul 30, 2017, 05:13 pm
io vedo alcune considerazioni:

il semaforo è chiaramente un oggetto che "chiama" gli array
mi spiego:
è chiaramente composto da alcune paline tra loro tutte uguali, che si comportano in modo simile ma sfasate nel tempo

quindi "descrivere" un semaforo con un array è scelta naturale

inoltre la necessità di escludere le delay dal ciclo, associata a una serie pressocche infinita di tempi di attesa fa facilmete pensare a una tabella di tempi da far rispettare alla millis

da qui leggere da una tabella una riga di configurazione del semaforo mi sembra un passo logico
riga che comprenda anche il tempo di durata della configurzione del semaforo

non è difficile, basta leggersi un poco di documentazione sugli array
gli array più semplici da capire sono le stringhe di c
e se si usano solo le lettere si può anche pensare di usare codici mnemonici

e fare qualcosa del tipo:
tutto maiuscolo
prima lettera prima palina (e terza) a fare la via uno
seconda lettera seconda palina (e quarta) a fare la via due
R rosso
V verde
G giallo (col verde acceso)
P verde pedonale (rosso pedonale è semplicemente l'opposto)
B verde pedonale con buzzer acceso

terza lettera tempo di durata
A 5 secondi (sovrapposizione dei rossi)
B 15 secondi (giallo)
C 1 minuto verde sulla via a minore priorità
D 2 minuti verde sulla via a maggiore priorità

quarta lettera numero (cifra)
indica quale riga di luci sarà la prossima

in questa maniera il semoforo si puo' descrivere circa così:

0RRA1  che significa sovrapposizione rossi, 5 secondi, prossima è la riga 1
1RVC2  che significa Rosso in uno verde in due, durata un minuto, prossima la 2
2RGB3  che significa Rosso in 1, giallo in 2, tra 15 secondi cambia in 3
3RRA4  sovrapposizione dei rossi, tra 5 secondi cambia in 4
4VRD5  verde in due rosso in uno, tra  minuti cambia in 5
5GRB0  giallo in uno, rosso in due tra 15 secondi cambia in 0 (ricomincia)

sembra un casino, invece ha due grandi vantaggi:


uno: si può scrivere una funzione che interpreti la stringa,
quindi la loop si limita a mandare in esecuzione la stringa
comodo in debug

due:

facile intercettare punti topici per fare cose in più

ovvero basta scrivere delle sequenze "particolari" per mandarle in esecuzione

il passaggio pedoni diventa

6PPC7 Verde pedone su due vie, rosso ovunque, tra un minuto evolve in 7
7BBB0 Verde pedone su due paline, rosso ovunque, buzzer acceso, tra 15 secondi evolve in 0
siccome zero fa parte della sequenza principale non ho bisogno d'altro per far proseguire normalmente il semaforo

 
anche per far intervenire il pedonale non devo fare altro che mandare in esecuzione la riga 6



 
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Jul 30, 2017, 05:28 pm
e a dimostrare quello che intendobasta guardare questo esempio di loop

è corta, sono più i commenti che le righe di codice

che fa tutto il lavoro è la luci()
che imposta anche il tempo, letto dalla stringa in ingresso


Code: [Select]

Void loop() {


  // testo se abbiamo gia' raggiunto il tempo
  if (tempo > millis()) {
    // cambio stato semaforo
    luci(sequenza[stato]);
  }

  // testo se è premuto un pulsante di pedone
  if (digitalRead(pedone)) {
    // pulsante di pedone premuto
    // lo memo rizzo
    chiamata = 1;
  }
  // se chiamata eseguita e doppio rosso
  if ( chiamata && digitalRead(P1R) && digitalRead(P2R)) {

    // salvo la sequenza prossima
    stato1 = stato;
    // metto come prossima sequenza il passaggio pedoni
    stato = 6;
    // quindi allo scadere del tempo per il doppio rosso passa in pedoni, invece che in quello che doveva fare
    // considero soddisfatta la chiamata
    chiamata = 0;
    // adesso se non fcessi niente, dopo il tempo di cicalino
    // il semaforo ripartirebbe dall'inizio della sua sequenza
    // questo è garantito dal fatto che il passo 7 BBA punta al passo due
    // invece voglio che riparta da dove si era fermato prima del pedone
    // al momento non ho idee....
  }

// controllo se c'e' o no inserito il lampeggio
// non ho idee adesso
}



notare che io non interrompo il normale ciclo del semaforo

mi limito ad attendere la condizione di doppio rosso e mettere in lista di esecuzione non la normale riga successiva, ma la prima riga della sequenza pedonale

la sequenza pedonale a sua volta termina richiamando la prima riga della sequenza principale

il difficile è tutto nella luci()


Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Etemenanki on Jul 30, 2017, 05:50 pm
... la differenza tra delay e millis.....
Quello che secondo me dovresti cercare di capire, e' la differenza fra COSA SONO delay e millis ... perche' cosi poi la potrai sfruttare anche per altre cose, non solo per un'esempio di sketch ...

Premesso che io non sono un programmatore, cerco di darti un paio di spunti ...

Delay, e' un'istruzione (o funzione, chiamala come vuoi), a cui tu passi un certo tempo quando la invochi, e lei "aspetta" per il tempo che gli passi ... ma non fa niente altro, nel frattempo ... se ne sta' li imbambolata ad aspettare, senza leggere ingressi, senza pilotare uscite, senza incrementare cicli ne eseguire calcoli o istruzioni, aspetta e basta ... per cui, in pratica blocca completamente il funzionamento dello sketch e della MCU per tutto il tempo in cui aspetta (immagina di rimanere fermo a fare nulla con occhi ed orecchie chiuse per tutto il tempo, fregandotene di tutto quello che ti capita intorno ... quello e' un delay) ... credo che solo un'interrupt possa essere letto all'interno di un ciclo di delay  ...

Millis invece di per se non "aspetta" nulla, la puoi immaginare come una variabile che contiene, ogni volta che viene "letta", il numero di millisecondi trascorsi dall'accensione della MCU fino a quel momento ... pero' nonostante non sia una funzione di attesa, la puoi usare per controllare e confrontare intervalli di tempo, senza bloccare il resto del programma, oltre che per farci altre cose che richiedono il confronto fra due o piu valori di tempo trascorso ...
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 01, 2017, 07:29 pm
 be mi fa piacere che almeno per essere alle prime armi non ho richiesto uno dei soliti aiuti per avere tutto senza studiare.

vi ringrazio tutti per avermi dato un parere.

ora sto tentando di capire bene il codice mills....che se non ho capito male è un valore di 50 giorni (ovviamemte espresso in millesimi) che parte all'avvio dell LOOP.

Quindi dandogli delle condizioni puramente aritmetiche, posso fargli eseguire dei comandi per circa 50 giorni( ovviamente espresso in millesimi) oppure lo resetto  non ho ancora capito come ,ma ci sto studiando e lo faccio ripartire.

Questo al contrario del DELAY che ferma il LOOP per (X) millisecondi, mi darebbe un LooP veloce ne quale posso inserire il PULSANTE DEL VECCHIETTO.

Il tutto solo stando attento che la condizione matematica di Mills non sia pù veloce dell'esecuzione di tutto il cilo di semafori.
.....GIUSTO????????.......


vi prego ditemi che è giusto se significa che non ci ho ancora capito  niente.

Per il momento grazie a tutti per l'aiuto che mi state dando.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 01, 2017, 07:45 pm
intanto non abbandono il DELAY(visto che al momento è quella che Lunica che ho capito) e provo a metterci la funzione INTERRUPT (sperando che non sia come premere il Reset).
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 01, 2017, 08:22 pm
vediam un po' se ci riesco io

millis() è solo un contatore, che conta quanti millisecondi sono passati da quando hai acceso arduino

se vuoi fare una pausa nel tuo programma il comando è e rimane delay()

ma attento quando parli di pausa

si intende una pausa vera e completa, come quando vai a dormire, per dare l'idea

se invece devi continuare a fare qualcosa, fosse solo aspettare un pulsante premuto, quella non è una pausa

qundi se devi accendere e/o spegnere a intervalli determinati E BASTA si usa la delay

se anche solo devi sorvegliare un pulsante niente delay

e come si fa?


come fai tu a casa a sapere se è ora di guardare il telegiornale?

guardi l'orologio

anche arduno guarda l'orologio

io suo orologio si chiama millis()

quindi se devi spegnere una luce all'ora definita

farai un test sull'orologio

se millis è piu' di ora_programmata accendo la luce


cche in C diventa:


if (millis()>ora_programmata){

e qui un intero blocco di programma
}




tutto il casino viene dal fatto, che esattamente come il tuo orologio fa un giro ogni 12 ore, la millis() fa un giro ogni.......

un fracco di millisecondi, circa 50 giorni



adesso devo uscire, dopo seconda puntata


Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Claudio_FF on Aug 01, 2017, 10:48 pm
Visto che il paragone di guardare l'orologio è bello mi permetto di continuare.

Cosa si fa quando si vuole fare qualcosa tra quattro ore?

1) Si guarda l'orologio
2) Ci si annota da qualche parte l'ora
3) Di tanto in tanto si guarda di nuovo l'orologio per vedere quanto tempo è trascorso

Come si fa a calcolare il tempo trascorso?

Calcolando: ora_attuale meno ora_di_inizio_salvata_prima.


Vediamo la figura seguente (cerchio di sinistra): supponiamo ad un certo momento di voler fare qualcosa tra quattro ore, guardiamo l'ora, sono le 5, ce la scriviamo da qualche parte. Continuiamo a guardare periodicamente l'orologio. Alle 9 scopriamo che sono passate 4 ore (9-5=4).





Ma cosa succede se passa la mezzanotte (cioè il famoso e temuto overflow di millis) ?

Assolutamente niente! Contando circolarmente con numeri interi senza segno il risultato viene sempre giusto. Nel cerchio di destra il tempo iniziale sono le 10. Ci interessa sapere quando sono passate 5 ore. Questo avviene alle 3 (3-10=5)

Su Arduino è la stessa cosa:

1) si guarda il valore di millis() nel momento da cui vogliamo iniziare a misurare il tempo
2) lo si annota in una variabile
3) si controlla periodicamente il valore raggiunto da millis() per vedere se è trascorso un certo tempo

L'unica differenza è che millis() conta da 0 a 4294967295 invece che da 0 a 11, quindi serve una variabile di tipo unsigned long per salvare il tempo di inizio.

Poi periodicamente si calcola quanto tempo è trascorso con: millis() - tempoInizio
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: ORSO2001 on Aug 01, 2017, 11:33 pm
Quote
Visto che il paragone di guardare l'orologio è bello...etc etc
@Claudio_FF ...mi piace +1
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 01, 2017, 11:34 pm
Grazie

Meglio non avrei saputo
E a cena ho fatto tardi....
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 02, 2017, 08:01 pm
SIETE GRANDI

a grandi linee ho quasi capito  il comando MILLIS quindi ho copiato e MODIFICATO questo sketc( no mi ricordo come si scrive) molto semplice per prendere dimestichezza ed ho immaginato una situazione un po più semplice......(Scusate le descrizioni ma servono a Me per Ricordare)




Code: [Select]


int A = LOW;             //INTero ( quindi 0 o 1) A= Basso ad A assegno un valore BASSO
long B = 0;                //Devo capire la differenza tra LONG ed INT comunque a B assegno il numero 0

void setup(){

 pinMode(9, OUTPUT);              //SEMAFORO
    pinMode(4, INPUT);              //PULSANTE VECCHIETTO
 }

void loop(){

 if ((4, HIGH)&&(millis() > 2000 ))     // SE il vecchio preme il pulsante 4 (CONDIZIONE  1)  e
                                                    Millis è MAGGIORE di 2 Secondi (CONDIZIONE 2)
 {
        B = millis();        //ASSEGNA a B il valore di MILLIS ( (50 giorni - 2secondi) X tutte le volte che ha
                                 lavorato(APPROFONDIRE)                                              
 
   if (A == LOW){        // SE (A è UGUALE ad un valore BASSO
            A = HIGH;      //ASSEGNA ad A un valore ALTO
   }
        else                  //ALTRIMENTI
   A = LOW;               //ASSEGNA ad A un valore BASSO

   digitalWrite(9, A);    //SCRIVI sul Pin 9, il valore di A
   
}
}




ero contento perche funzionava tutto a meraviglia, finchè non ho deciso di metterci  in mezzo IL MALEDETTO PULSANTE DEL VECCHIETTO  e la doppia condizione && (che potrebbe essere una soluzione al mio semaforo )

...pero sta di fatto che le condizioni NON VENGONO RISPETTATE, e non capisco il perche.....sarà la maledidone del pulsante del vecchietto??
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 02, 2017, 08:40 pm
Hai un po' di confusione in linea

if (4,HIGH) non significanulla

semmai if (digitalread(4)==HIGH)

che comunque non serve, basta
if (digitalread(4))
dato ce la digitalread su un pulsante premuto vale vero di suo, senza proseguire con la condizione

poi millis()>2000 varra' vero dopo due secondi dall'accensione e per sempre (si, OK dopo 50 giorni altri due secondi di NO, ma non credo che adesso ci preoccupi)

la differenza tra int e long

int è un tipo di variabile che può contenre numeri interi tra (imparare a leggere il reference)
comunque tra -32000 e passa e + 32000 e passa

se ti servono numeri più grandi si usa long

che tiene un fracco di più (quanto? come ho detto fa fede il reference ed è necessario imparare a consultarlo)

se non ti basta ancora si usano unsigned int  e unsigned long, che tengono il doppio di int e lon, ma senza il segno (solo numeri positivi)

millis è di tipo unsigned long, che vuol dire che la millis ti risponde con un numero che arriva al massimo fino al massimo della unsigned long


poi

la tua if (A==LOW) con tutto quello che segue può diventare

A=!A;


che significa: qualunque sia A, metti il suo opposto
se era 0 mette 1 (ricordati sempre che 0 è uguale a LOW e uguale a condizione NON ripettata)
se era "non 0"  0 (ricordati che qualunque cosa differente da zero viene valutata come HIGH o condizione rispettata)


in pratica il tuo programma dice:

dopo i primi 2 secondi
misura il tempo e salvalo in B (inutile visto che poi B non la usi mai)
inverti il valore di A
accendi o spegni l'uscita a seconda del valore di A
che non mi sembra essere quello che volevi fare

Sbaglio?
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Claudio_FF on Aug 02, 2017, 08:49 pm
Quote from: Puso
sarà la maledidone del pulsante del vecchietto??
Sarà che la scaletta da percorrere è sempre la solita  ;)

Studiare:

- tipi di variabili / rappresentazione dei dati
- operazioni aritmetiche / logiche
- esecuzione condizionata (if else switch)
- cicli (for / while)
- uso delle funzioni
- uso degli array
- un minimo, ma proprio minimo, di puntatori, che su Arduino in pratica servono solo per passare i valori per riferimento alle funzioni.

Trentacinque anni fa andava via un mese per ogni punto...
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 02, 2017, 09:12 pm
io quoto intero quello che dice Claudio_FF

sono un pochino più ottimista sui tempi

in particolare if else secondo me è veloce veloce da imparare

i cicli son un po' la bestia nera della programmazione

i puntatori sono la bestia nera del C

ma per cominciare se ne puo' fare a meno

certamente tipi di variabili e operatori sono la base senza la quale nemmeno si puo' pensare a programmare


io consiglio sempre di scriversi il programma in italiano

e poi lentamente tradurlo in linguaggio

del tipo:

se premo il pulsante


accendo il led


diventa
1) devo dichiarare il pulsante
pinmode...........
2) devo dichiarare il led
pinmode.....
3) test sul pulsante
if (pulsante.........
e qui metto subito le 2 graffe (mica di dimenticare di chiuderle)

quindi
Code: [Select]
pinMode(3,INPUT);
pinMode(4, OUTPUT);

if (digitalRead(3)){
degitalwrite(4,....
}
finito


e intanto mi ricordo che i pinmode vanno nella setup

e il resto nella loop

il processo di traduzione italiano->C non è immediato
vado passo a passo

anche perchè nel frattempo mi accorgo che:
1) mi spno dimenticato cosa fare se NON premo il pulsante
2) mi sono dimenticato anche come rimettere a posto il led quando non premo più il pulsante

a questo punto diventa:
Code: [Select]

if (digitalread(3)){
digitalwrite(4,HIGH);
}
else{
digitalWrite(4,LOW);
}


solo che a questo punto mi sono accorto che la if non mi serve più

perchè la condizione è uguale all'uscita

quindi scriverò solo

Code: [Select]
digitalWrite(4,digitalRead(3));





Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 03, 2017, 04:27 pm
Lo ammetto ho fatto un po di casino, ma prima o poi ce la farò.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 03, 2017, 04:53 pm
Parti dal poco, un led che lampeggia con millis


Poi un tasto che cambia il tempo


E poi...
.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 03, 2017, 08:23 pm
Per un po non scrivo più

leggo solo
prima voglio capire sto millis() e ste variabili , è facile fare copia incolla, ma appena cambi qualkosa ti rendi conto che ........o lo sai fare oppure no.

ed io voglio imparare non copiare.

Vi ringrazio a tutti per la pazienza
 appena riesco a fare qualkosa di concreto... nella mia ignoranza,
lo metto nel forum
per il momento GRAZIE SIETE GRANDI
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 03, 2017, 11:07 pm
prego
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 06, 2017, 01:12 pm
Ciao
dunque sto studiando e mi sono creato uno skecth per capire meglio il MILLIS

ho notato che ci sono diversi modi per utilizzarlo quindi sto tentando capire le differenze...pero mi sono perso qualkosa.

Questo è lo sketch che dovrebbe utilizzando il pulsante INT P1=0;

accendere led in sequenza e finquì tutto ok.

Poi col pulsante INT PAUT=0;
era mia intenzione mettere in automatico la sequenza di P1 utilizzando una modalità MILLIS

però i led si accendono come gli pare a loro.
Code: [Select]

unsigned long A;
unsigned long B;
unsigned long C;
unsigned long D;
unsigned long on1=1000;
unsigned long off1=1000;
unsigned long on2=2000;
unsigned long off2=5000;
int P1=0;
int PAUT=0;

void setup()
{
 pinMode(2,OUTPUT);
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(12,INPUT);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,INPUT);
}

void loop()
{
  if(digitalRead(11)==HIGH)
{
   delay(250);
   ++PAUT;
     if(PAUT>=2){PAUT=0;}
 }
 if(PAUT==0)
 {
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
 }
 if(PAUT==1)
 {
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(12,LOW);                                  // questo l'ho aggiunto durante i vari tentativi
 
   if(millis()> A +500){P1=1+P1;}                    // qui è dove non funziona anche mettendo ++P1
   if(millis()> A +1000){P1=1+P1;A=millis();}      // qui è dove non funziona anche mettendo ++P1
   if(P1>=5){P1=0;}                                     // questo l'ho aggiunto durante i vari tentativi
 }
 if(digitalRead(12)==HIGH)
{
   delay(250);
   ++P1;
     if(P1>=5){P1=0;}
}
 switch(P1)
 {
 case 0:
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
 break;
 case 1:
  digitalWrite(2,HIGH);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
 break;  
 case 2:
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(4,LOW);
 break;  
 case 3:  
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,HIGH);
 break;
 case 4:
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
 break;
 }
 
 if(digitalRead(11)==HIGH)
{
   delay(250);
   ++PAUT;
     if(PAUT>=2){PAUT=0;}
}
 
 
 
}
           
in pratica i led si accendono in sequenze diverse dai casi che ho messo nello SWITCH.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 06, 2017, 02:57 pm
mi aiutate per favore
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 06, 2017, 05:54 pm
Guarda che noi ti abbiamo aiutato....


te la ricordi la barzelletta del pio uomo che durante una alluvione aspetta di essere salvato da Dio?

Il fiume stava straripando e le acque stavano raggiungendo la casa di Jim. Erano arrivate al portico, dove lui si trovava. Un uomo in barca a remi si avvicinò e lo chiamò: "Salta dentro che ti porto in salvo".
Jim rispose: "No, il mio Dio mi salverà!"
Salì poi di corsa fino al primo piano. Il fiume continuava a salire e raggiunse le finestre del primo piano. Un uomo in un motoscafo si avvicinò e lo chiamò: "Salta dentro che ti porto in salvo".
E Jim di rimando: "No, il mio Dio mi salverà!"
Poi Jim corse sul tetto. Ben presto il fiume lambì il tetto della casa. Jim era seduto sul bordo, con le acque che gli mulinavano attorno ai piedi. Vide un elicottero sorvolarlo e sentì la gente urlare attraverso il megafono: "Afferra la corda e issati, ti porteremo in salvo".
E Jim, di rimando: "No, il mio Dio mi salverà!"
Il fiume continuò a salire e, infine, travolse tutta la casa. Jim annegò.
Un istante dopo, si rese conto di essere al cospetto di Dio. In collera, Jim gli chiese: "Ho riposto la mia fiducia in te. Perché mi hai abbandonato?"
Dio sorrise e rispose: "Non ti ho mai abbandonato. Ho inviato una barca a remi, un motoscafo e un elicottero. Perché non ci sei salito sopra?"


Ecco, qui siamo

la millis te la abbiamo spiegata
di leggere il reference te lo abbiamo detto
di scrivere il codice dentro i tag code, pure
un esempio di millis te lo ho messo anch'io
come organizzare le paline te lo ho detto
come scrivo un programma, ti ho fatto un esempio
di partire col poco, te lo abbiamo detto in varii
di più................ non so

una spazzola scrive e un campo legge
io non sono ne la spazzola ne il campo
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: gpb01 on Aug 06, 2017, 06:42 pm
Ricordo a tutti che in conformità al regolamento (http://forum.arduino.cc/index.php?topic=149082.0), punto 7, dovete editare i vostri post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Resto in attesa delle correzioni nell'intero thread !

Guglielmo
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: PaoloP on Aug 07, 2017, 10:18 am
Guarda i commenti interni al codice.
La millis è implementata male.
Code: [Select]
unsigned long A;
unsigned long B;
unsigned long C;
unsigned long D;
unsigned long on1 = 1000;
unsigned long off1 = 1000;
unsigned long on2 = 2000;
unsigned long off2 = 5000;
int P1 = 0;
int PAUT = 0;

void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(12, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, INPUT);

  // manca lo stato iniziale dei pin 2,3,4,8,9 e 10.
  // sono HIGH o LOW?

  // perche non aggiungi la seriale per capire cosaa fa il programma?
}

void loop()
{
  if (digitalRead(11) == HIGH) // controlla i collegamenti ed eventualmente metti un pull-donw
  {
    delay(250);       // come debounce bastano 50 millisecondi.
    ++PAUT;           // su singola riga PAUTT++ o ++PAUT è indifferente.
    if (PAUT >= 2) {
      PAUT = 0;
    }
  }

  if (PAUT == 0)
  {
    // dovresti stampare via seriale che sei all'interno di questo if.
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
  }

  if (PAUT == 1)
  {
    // dovresti stampare via seriale che sei all'interno di questo if.
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(12, LOW);    // questo l'ho aggiunto durante i vari tentativi
    // mettere LOW in pin di input non serve

    if (millis() > A + 500) {
      P1 = 1 + P1; // qui è dove non funziona anche mettendo ++P1
    }
    if (millis() > A + 1000) {
      P1 = 1 + P1;  // qui è dove non funziona anche mettendo ++P1
      A = millis();
    }
    if (P1 >= 5) {
      P1 = 0; // questo l'ho aggiunto durante i vari tentativi
    }
  }

  if (digitalRead(12) == HIGH) // controlla i collegamenti ed eventualmente metti un pull-down
  {
    delay(250);
    ++P1;
    if (P1 >= 5) {
      P1 = 0;
    }
  }

  switch (P1)
  {
    // dovresti stampare via seriale il valore di P1
    case 0:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      break;
    case 1:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      break;
    case 2:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      break;
    case 3:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      break;
    case 4:
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      break;
  }

  // perchè fai il controllo 2 volte?
  if (digitalRead(11) == HIGH)  // controlla i collegamenti ed eventualmente metti un pull-down
  {
    delay(250);
    ++PAUT;
    if (PAUT >= 2) {
      PAUT = 0;
    }
  }
}
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Claudio_FF on Aug 07, 2017, 06:19 pm
Quote from: Puso
ho notato che ci sono diversi modi per utilizzarlo quindi sto tentando capire le differenze
Il modo in cui l'hai usato (confrontare direttamente il valore restituito da millis() con qualcosa) soffre del problema dell'overflow.

Tornando al cerchio delle ore è come voler confrontare direttamente l'ora di un orologio (0..11) con un valore ottenuto da un'ora di partenza (facciamo le 8 ) sommato a una durata (facciamo 6 ore). Se l'"ora di arrivo" supera la mezzanotte allora anche tutte le ore comprese tra quella iniziale e la mezzanotte risulteranno matematicamente maggiori (quindi il test millis()>A+n contiene un errore di logica):




Ma comunque, tornando al semaforo iniziale e al pulsante da ascoltare durante le attese, se la funzione millis intanto è "complicata", e fermo restando che il suo uso assieme alla logica del ciclo continuo senza delay è la via più generale per scrivere qualsiasi programma multitasking... un minimultitasking lo si fa anche con dei piccoli delay... ad esempio se il problema è leggere un pulsante durante un'attesa (e oltre ad attendere e leggere il pulsante non c'è bisogno di fare altro... altrimenti saremmo da capo), una soluzione come questa è sicuramente più "semplice":

Code: [Select]
// Attesa circa 40 secondi e campionamento pulsante ogni 0.1s
for(unsigned int t = 0;  t < 400;  t++)
    if(digitalRead(input_pin) == HIGH) break; else delay(100);
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 07, 2017, 09:32 pm
Intanto GRAZIE  a TUTTIper la pazienza:

 DOCSAVAGE innazitutto sto studiando e sto facendo tesoro di quello che mi avete insegnato, part dal principio che quando mi sino iscritto su questo url,avevo a malapena capito la differenza chedentro le parentesi tonde e quelle e graffe e grazie al vostro aiuto il mio ultimo schetch postato,me lo sono fatto quasi tutto da solo a memoria,ricontrollando tutto ed andando a copiare solo quando non ci saltavo fuori........ed io non sono jim e non credo nelle parabole.

gpb01 non ho capito ne cosa hai detto e neppure se era riferito a me......ti chiedo scusa.

Claudio_FF l'esempio sull'orologio è stato chiarissimo e mi ha fatto comprendere il millis ora  ( se non ho studiato male, posso mettere vari orologi),ma non ora prima voglio capire in quanti modi posso utilizzarlo......non mi preoccupo neppure di azzerarlo per il momento....però grazie è stata un ottima spiegazione


PaoloP ti ringrazio nuovamente.....ho rifatto un nuovo schetch molto più corto riprovando piu volte con tentativi diversi,ma il problema persiste è sempre lo stesso con millis incremeta gli INT fino a 2 e poi torna  0 (incrementarlo a 3....NON CI PENSA PROPRIO).

Premesso che sto utillizzando tinkercad per fare gli schect commento solo i codici che mi danno problemi...i codici inutili sono solo per fare esperienza e per scrivere senza copiare:
Code: [Select]

int P1=0;
unsigned long T1= millis();
unsigned long T2= millis();
unsigned long startime;
int A=0;

void setup() {
 Serial.begin(9600);
 pinMode(2, OUTPUT);
 pinMode(3, INPUT);
 startime = millis();
}

void loop() {
 if(digitalRead(3))
 {
   while(digitalRead(3)){;}
 
  ++P1;++A;Serial.println(A);Serial.println(P1);}
 
 if(P1>=3){P1=0;}
 if(A>=2){A=0;}
 if(A==0){digitalWrite(2,LOW);Serial.println(A);Serial.println(P1);}
 if(A==1){digitalWrite(2,HIGH);Serial.println(A);Serial.println(P1);}
 if(P1==3)
 {
 Serial.println(A);
 if(startime>=T1+500){++A;}
   if(startime>=T2+1000){++A;}}                                           // qui incrementa solo fino a 2 a 3 NO
}


Lo schetc è corretto unico problema l'incremento,,,,poi se magari potessi vedere in serial monitor i dati incolonnati siù colonne diverse sarebbe meglio,ma non ci sono ancora arrivato.


Per il momento Grazie a tutti.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 07, 2017, 09:42 pm
PaoloP ti ringrazio nuovamente.....ho rifatto un nuovo schetch molto più corto riprovando piu volte con tentativi diversi,ma il problema persiste è sempre lo stesso con millis incremeta gli INT fino a 2 e poi torna  0 (incrementarlo a 3....NON CI PENSA PROPRIO).

omissis, ma mettendo il tag code
Code: [Select]

  if(A>=2){A=0;}


Lo schetc è corretto unico problema l'incremento,,,,poi se magari potessi vedere in serial monitor i dati incolonnati siù colonne diverse sarebbe meglio,ma non ci sono ancora arrivato.


Lo Scjetch é corretto cosa?
 che non ti incrementa fino a tre perché tu stesso lo castri a due?

la vedi l'unica linea che ti ho citato?
tra l'altre cose scritta tra i tag code, che non è mica difficile, basta volerlo, si vede che qualcuno non vuole...


significa:
se A è maggiore o uguale a due lo riporto a zero

quindi TRE non lo sarà mai, ma non è colpa della millis

è colpa del tuo programma


ripeto, partire dal poco? per fare un solo errore per volta? per fare in fretta a capire e correggere?

si vede che ti da fastidio...........
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 07, 2017, 09:47 pm
oh
e te lo dico subito

non cominciare con la manfrina del
 
vorrei capire ma mi mancano le basi
grazie del tempo che spendete per me
ci sono quasi, mi manca poco


Non attacca.......
gente che dice frasi del genere vengono via a due soldi la dozzina
cerca di elevarti sopra la massa, che ci farai solo bella figura

ti metti d'impegno a fare quello che ti si consiglia, a partire dal mettere il codice tra i tag code, che non è difficile
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: astrobeed on Aug 07, 2017, 10:13 pm
a partire dal mettere il codice tra i tag code, che non è difficile
Si come no, per loro è più facile postare 1000 righe di codice senza usare il corretto tag che capire come va usato , questo fino a che il moderatore non si scoccia di essere preso per i fondelli, dopo l'ennesimo richiamo, e prima scatta la chiusura del thread, poi se ce la recidiva il ban.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 07, 2017, 10:17 pm

docsavage intanto Grazie che mi hai fatto capire dove ho sbagliato(domani provo a correggere e...vedrò di starci più attento la prossima volta...ripeto sono ignorantissimo sulla programmazione sono alle prime armi,ma mi sto impegnando).
Per ringraziarti ti racconto anchio una storiella(senza offesa....è solo come la vedo io):

Una volta un uomo voleva arrivare in cima ad una montagna;

chi lo conosceva gli consigliò di lasciare perdere perche non ci saqrebbe mai arrivato;

l'uomo partì lo stesso, e durante il suo percorso chiese aiuto su come raggiungere la vetta;

incontrò persone che gli dissero che non era possibile ed altre che gli dissero come avvicinarsi alla cima;

l'uomo non arrivò mai in cima, ma  ci arrivò più vicino, di chi gli aveva consigliato di lasciar perdere o di chi gli disse che non era possibile.

e durante il rientro incontro un altro uomo che gli chiese come arrivare in cima alla montagna.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 07, 2017, 10:25 pm
astrobeed
 seper mettere i tag intendi mettere tra//il spiegare la riga
metto  nel forum solo quelle che non capisco
quelle semplici mi sembra inutile metterle
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 07, 2017, 10:26 pm
Grazie per la storiella
non la conoscevo e mi è piaciuta

sembra però saggezza orientale

la saggezza orientale contiene sempre un lato "oscuro",
non per niente gli orientali tentano tutti di vivere alla occidentale

in particolare la storiella non dice se l'uomo è arrivato anche più in la di chi gli consigliava,
o se non è riuscito nemmeno ad eguagliare i suoi consiglieri, quelli buoni intendo

ecco, vedi di non essere così...


comunque, io parla che ti parla, mettendo in pratica i MIEI consigli il semaforo lo ho fatto, a tempo perso....


naturalmennte ho cominciato con il descrivere l'obbiettivo

altrimenti non saprei nemmeno da che parte si troverebbe la montagna

Code: [Select]

// simulazione semaforo
// 2 vie a 90 gradi, 4 paline
// per i pedoni, tutte le via unificate
// verde senza giallo, con rosso semplicemente negato in hardware
// un buzzer che bippa lento per i ciechi
// durante il "giallo" per i pedoni il buzzer bippa veloce

// un pulsante di chiamata pedonale
// un led di conferma chiamata pedonale presa in carico
// per tranquillizzare chi preme il pulsante
// un interruttore per servizio notturno lampeggiante






come vedi il tag code funziona
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 07, 2017, 10:34 pm
poi ho descritto il campo giochi

ho messo le paline (scusate il gioco di parole)

che significa letteralmente ho descritto i collegamenti tra arduino e le paline dei semafori

Code: [Select]


// definizione paline

byte const P1R     = 2; // palina 1 (e 3) rosso
byte const P1G     = 3; // palina 1 (e 3) giallo
byte const P1V     = 4; // palina 1 (e 3) verde

byte const P2R     = 5; // palina 2 (e 4) rosso
byte const P2G     = 6; // palina 2 (e 4) giallo
byte const P2V     = 7; // palina 2 (e 4) verde

// per i pedoni
byte const PPV     = 8; // verde per pedoni sottinteso rosso è negato
byte const PPG     = 9; // Giallo per i pedoni
byte const CHI    = 10; // led di conferma chiamate pedone presa in carico
byte const PUL    = 11; // pulsante di chiamata pedone

byte const NOT    = 12; // selettore servizio notturno
byte const SEG    = 13; // Led lampeggiante per indicare impianto in servizio




// le paline 1 e 3 sono su una via e danno il verde assieme
// le paline 2 e 4 sono su altra via e danno il verde assieme




poi ho pensato che un semaforo è un oggetto ciclico

quindi basta scrivere una sequenza di azioni che si richiamano una con l'altra

e quindi mi son detto:

una bella tabella, scritta in codice parlante (vuol dire che si capisca cosa dice)
con la prima lettera comada la prima palina, e cos' via
Code: [Select]

// stabiliamo la sequenza di segnali

// 0 Palina Spenta
// R palina su rosso
// G palina su giallo - con verde acceso
// V palina su verde
// L palina con giallo senza verde
// per i segnali pedonali
// P luce verde al pedone, rosso sottinteso negato, basta la prima palina, lo raddoppio sulla seconda solo per estetica
// W luce verde al pedone, rosso sottinteso negato, buzzer inermittente per indicare giallo

// tempistica
// da definire
// A 1 secondo (usato per il giallo lampeggiante)
// B 5 secondi (sovrapposizione tra i due rossi, cambio tra auto e pedoni)
// C 15 seconfi (giallo prima del verde)
// D un minuto (usato per la via 1)
// E due minuti (usato per la via 2)

//sequenze:
// si legge: numero, non registrato, indice dello array
// stato palina 1, stato palina 2, durata, riga da leggere per la prossima



poi mi sono scritto come dovrebbe essere la sequenza delle azioni del semaforo

Code: [Select]

// sequenza normale

/* alternativa
  0RRB1   due vie rosse, pronti per la via 1
  1VRD2
  2GRC3
  3RRB4
  4RVE5
  5RGC0
  che forse va anche meglio
*/



// sequenza di via pedone libera, parte da via 1 gialla
// attende lo stato 1GRC2....
// 6RRB7 vie impedite // non serve, ci siamo già
// 7PPD8 vie impedite, vie pedoni libere
// 8WWB0 vie impedite, vie pedoni libere, allarem pedoni affreettarsi
// da qui riprende ciclo normale,

// lampggio notturno
// 9LLA: occhio interessante usare : come 10
// :00A9  anello rapido di lampeggio


dove la sola cosa difficile è che avendo 11 righe ho dovuto usare il carattere successivo al 9 per indicare il 10
il carattere successivo al 9 è il duepunti

e si tratta di una tabella di 11 righe che contiene le sole 11 configurazioni possibili del semaforo
(anzi, 10, perchè una è risultata inutile, ma non sono stato li a toglierla)

Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 07, 2017, 10:46 pm
a questo punto le variabili globali

e qui ho truccato, non le ho scritte tutte subito

mano a mano che mi sono servite le ho aggiunte

Code: [Select]


char sequenza[11][5] = {"RRB1", "VRD2", "GRC3", "RRB4", "RVE5", "RGC0", "RRB7", "PPD8", "WWB0" , "LLA:" , "00A9"}; // array di sequenza delle luci

unsigned long tempo = 0; //istante del prossimo cambio luci
unsigned long tempseg = 0; //istante del prossimo lampeggio led


byte stato = 0; // punto in esecuzione nel ciclo
byte chiamata = 0; // presenza chiamata pedonale
byte buzzer = 0; //lampeggio per simulare il buzzer
byte servizio = 0; // 0 servizio diurno, uno servizio notturno



in fondo sono quasi obbligate... non c'è storia...

pure la setup è quasi obbligata
Code: [Select]

void setup() {
  // uscite
  pinMode(P1R, OUTPUT);
  pinMode(P1G, OUTPUT);
  pinMode(P1V, OUTPUT);
  pinMode(P2R, OUTPUT);
  pinMode(P2G, OUTPUT);
  pinMode(P2V, OUTPUT);
  pinMode(PPV, OUTPUT);
  pinMode(PPG, OUTPUT);
  pinMode(CHI, OUTPUT);
  pinMode(SEG, OUTPUT);
  // ingressi
  pinMode(PUL, INPUT_PULLUP);
  pinMode(NOT, INPUT_PULLUP);

  // inizializzo seriale
  Serial.begin(9600);
  Serial.println(F("Programma di prova semaforo a due vie"));
  // faccio partire il semaforo
  luci(sequenza[0]);
}


la sola cosa particolare è la chiamata della luci(sequenza[0])

sequenza indice zero è la prima configurazione utile del semaforo
la funzione luci(stringa) accende e/o spegne le paline secondo la configurazione data dalla stringa in ingresso

ecco la funzione luci()
Code: [Select]

void luci(char comando[]) {
  // per debug, la mando in seriale
  Serial.println(comando);


  // poi carico il tempo
  // che e' codificato nel terzo carattere
  switch (comando[2]) {
    case 'A':
      tempo = millis() + 1000;
      break;
    case 'B':
      tempo = millis() + 5000;
      break;
    case 'C':
      tempo = millis() + 15000;
      break;
    case 'D':
      tempo = millis() + 60000;
      break;
    case 'E':
      tempo = millis() + 120000;
      break;

  }

  // prenoto la prossima configurazione
  // che e' codificata nel quarto carattere
  stato = comando[3] - '0';

  // tutto il lavoro delle luci è dato dai due primi caratteri

  // palina 1
  switch (comando[0]) {
    case '0':
      // palina spenta
      digitalWrite(P1R, LOW);
      digitalWrite(P1G, LOW);
      digitalWrite(P1V, LOW);
      digitalWrite(PPV, LOW);
      digitalWrite(PPG, LOW);
      buzzer = 0;
      break;


    case 'R':
      // rosso
      digitalWrite(P1R, HIGH);
      digitalWrite(P1G, LOW);
      digitalWrite(P1V, LOW);
      digitalWrite(PPV, LOW);
      digitalWrite(PPG, LOW);
      buzzer = 0;
      break;

    case 'G':
      // giallo
      digitalWrite(P1R, LOW);
      digitalWrite(P1G, HIGH);
      digitalWrite(P1V, HIGH);
      digitalWrite(PPV, LOW);
      digitalWrite(PPG, LOW);
      buzzer = 0;
      break;

    case 'V':
      // Verde
      digitalWrite(P1R, LOW);
      digitalWrite(P1G, LOW);
      digitalWrite(P1V, HIGH);
      digitalWrite(PPV, LOW);
      digitalWrite(PPG, LOW);
      buzzer = 0;
      break;
    case 'L':
      // giallo del lampeggio
      digitalWrite(P1R, LOW);
      digitalWrite(P1G, HIGH);
      digitalWrite(P1V, LOW);
      digitalWrite(PPV, LOW);
      digitalWrite(PPG, LOW);
      buzzer = 0;
      break;

    case 'P':
      // verde ai pedoni
      digitalWrite(P1R, HIGH);
      digitalWrite(P1G, LOW);
      digitalWrite(P1V, LOW);
      digitalWrite(PPV, HIGH);
      digitalWrite(PPG, LOW);
      buzzer = 0;
      break;
    case 'W':
      // giallo ai pedoni, che lampegggia come buzzer
      digitalWrite(P1R, HIGH);
      digitalWrite(P1G, LOW);
      digitalWrite(P1V, LOW);
      digitalWrite(PPV, HIGH);
      digitalWrite(PPG, HIGH);
      buzzer = 1;
      break;
    default:
      break;

  }
  // palina 2 alcune voci non servono
  switch (comando[1]) {
    case '0':
      // palina spenta
      digitalWrite(P2R, LOW);
      digitalWrite(P2G, LOW);
      digitalWrite(P2V, LOW);
      break;


    case 'R':
      // rosso
      digitalWrite(P2R, HIGH);
      digitalWrite(P2G, LOW);
      digitalWrite(P2V, LOW);
      break;

    case 'G':
      // giallo
      digitalWrite(P2R, LOW);
      digitalWrite(P2G, HIGH);
      digitalWrite(P2V, HIGH);
      break;

    case 'V':
      // Verde
      digitalWrite(P2R, LOW);
      digitalWrite(P2G, LOW);
      digitalWrite(P2V, HIGH);
      break;
    case 'L':
      // giallo del lampeggio
      digitalWrite(P2R, LOW);
      digitalWrite(P2G, HIGH);
      digitalWrite(P2V, LOW);
      break;

    default:
      break;

  }

}



come si vede è una pura unumerazione di casi e accendi spegni...

una noia scriverla.........

le cose interessanti:

la variabile stato, letta dal 4 carattere, converito da ASCII a numerico col semplice trucco di togliere il valore '0'

la variabile stato NON è lo stato attuale, ma lo stato FUTURO

Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 07, 2017, 10:48 pm
e se una delle vie fosse più trafficata delle altre?
ed ad esempio avesse bisongno di una 4°luce per svoltare da un lato mentre l'altro semaforo è verde?
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 07, 2017, 10:48 pm
poi mi sono scritto una loop semplice semplice

per provare se compilava
Code: [Select]

void loop() {
  // lampeggio al led 13
  if (tempseg < millis()) {
    digitalWrite(SEG, !digitalRead(SEG));
    tempseg = millis() + 301;
  }
}


che fa lampeggiare il led 13 senza bloccare nulla
3011 è scelto per non far mai coincidere i tempi tra le varie funzioni

e adesso stacco che devo andare a dormire, sono sicuro che il resto della loop a questo punto è chiaro...


casomai domani.....

buona notte
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 07, 2017, 10:50 pm
e se una delle vie fosse più trafficata delle altre?
ed ad esempio avesse bisongno di una 4°luce per svoltare da un lato mentre l'altro semaforo è verde?
nulla ti vieta di farlo, ma finora non ci sei riuscito...............


scusa, il veleno, ma criticare sei stato capace subito vedo

non hai cavato un ragno da un buco, ma indicare una mancanza altrui subito fatto

per tua regola il mio metodo funziona ed è espandibile, il tuo non cava un ragno da un buco

non indicare a me la montagna, se tu non sai nemmeno salire un paracarro
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 07, 2017, 10:59 pm
:) :)
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 07, 2017, 11:06 pm
l'uomo non arrivò mai in cima, ma  ci arrivò più vicino, di chi gli aveva consigliato di lasciar perdere o di chi gli disse che non era possibile.

qui ho fatto copia incolla..
sulle ultime stavo scherzando(sono davvero ingorante)....domani verififico il tuo consiglio.
Per il momento grazie e buonanotte.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: gpb01 on Aug 07, 2017, 11:09 pm
gpb01 non ho capito ne cosa hai detto e neppure se era riferito a me......ti chiedo scusa.
Si, fondamentalmente è riferito a te e ...
... rileggiti attentamente il mio post e fai quanto richiesto (e dettagliatamente descritto) su tutti i tuoi post dove hai messo del codice o ... mi vedo costretto a chiudere il thread per mancato rispetto del regolamento.

Grazie,

Guglielmo
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 08, 2017, 02:47 pm
l'uomo non arrivò mai in cima, ma  ci arrivò più vicino, di chi gli aveva consigliato di lasciar perdere o di chi gli disse che non era possibile.

qui ho fatto copia incolla..
sulle ultime stavo scherzando(sono davvero ingorante)....domani verififico il tuo consiglio.
Per il momento grazie e buonanotte.
non hai capito la domanda

io non ero interessato a sapere se ha fatto più e meglio di chi gli diceva che non fosse possibile
ero interessato a sapere se era riuscito almeno ad eguagliare chi gli aveva insegnato......

dal fatto che non hai risposto............. capisco da solo la risposta
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 08, 2017, 03:03 pm
Proseguendo con l'esposizione del semaforo:


da ultimo ho aggiunto alla loop (che rimane veloce, anzi velocissima)

la rotazione del semaforo (ovvero ciclare tra le varie configurazioni di luci)

Code: [Select]
// testo se abbiamo gia' raggiunto il tempo
  if (tempo < millis()) {
    // cambio stato semaforo
    luci(sequenza[stato]);
  }

ovviamente se stato è lo stato FUTURO del semaforo, basta farlo eseguire alla luci() per avanzare di un passo



la sorveglianza del selettore del servizio notturno
Code: [Select]

  if (!digitalRead(NOT) != servizio) {
    servizio = !digitalRead(NOT);
    if (!servizio) {
      // servizio diurno, appena avviato
      luci[0];
      //partita sequenza standard, con doppio rosso
    } else
    {
      // servizio notturno prenotato
      // nulla da fare
    }

e questo esegue la PRE-notazione del servizio notturno, oppure fa ripartire da zero il ciclo semaforico
a seconda dei casi

se il servizio notturno è prenotato
 
Code: [Select]
if (servizio)  {
    // servizio notturno prenotato
    // se siamo in doppio rosso iniziale:
    if (stato == 1 ) {//stato vale 1 solo dopo aver eseguito la luci[0]
      servizio = 0; // do per aver eseguito il comando
      stato = 9;
      // stato 9 è il lampeggio notturno
    }
  }

e solo durante il doppio rosso iniziale del ciclo
prenota come prossimo stato il 9, ciclo di lampeggio

questo evita che se un pirla qualsiasi gioca col bottone il semaforo passi da verde su una via trafficata a giallo lampeggiante, che dopo diventa difficile decidere chi ha torto e chi ha ragione nell'incidente che certamente avverra

basta pensarci un attimo, e diviene chiaro che occorre evitare che da verde passi di colpo a lampegginate

da verde deve sempre passare a giallo e poi rosso, il modo di funzionamneto del semaforo deve cambiare solo con tutti i veicoli FERMI al rosso
altrimenti chi glielo spiega all'automobilista che è entrato nell'incrocio col verde che siccome è scattato il servizio notturno doveva dare la precedenza a destra ed è colpa sua dell'incidente provocato?


chiarito questo analogo discorso per i pedoni
la sorveglianza del pulsante del passaggio pedoni è questa:


Code: [Select]
// prenotazione pedone

if (!digitalRead(PUL)){
  // pulsante premuto
  chiamata=1;
    digitalWrite(CHI,HIGH);
    // accendo il led di segnalazione chiamata prenotata
   
 
  }


che oltre a leggere il pulsante accende anche la segnalazione di chiamata prenotata, così il pedone non ci massacra il pulsante........

e al doppio rosso successivo....
Code: [Select]
if (chiamata){
  // chiamata pedone
  if (stato==1){
    // doppio rosso di inizio sequenza
    chiamata=0;
    // do la chiamata per soddisfatta
    stato=7; // inizio sequenza pedone

    digitalWrite(CHI,LOW);
    // spengo il led di segnalazione chiamata prenotata
   
    }
 
 
  }



per poi eseguire il passaggio a pedone al termine del doppio rosso

la sequenza di pedone termina con una chiamata alla sequenza zero, riattivando automaticamente il ciclo normale del semaforo

questo ha anche il vantaggio di evitare che il pirla di pedone di trno continui a fermare il semaforo giocando col bottone

dopo una chiamata pedonale il semaforo esegue sempre e comunque almeno un ciclo
altrimenti i semafori messi all'uscita di scuole o manicomi non lascerebbero passare mai nessuna auto

poco rimane ormai

 
Code: [Select]
// lampeggio del giallo pedone, vale come buzzer per i ciechi
  if (buzzer){
    digitalWrite(PPG,digitalRead(SEG));
    //SEG lampeggggia già di suo, inutile inventare l'acqua calda.....
   
   
    }


che fa lampeggiare il verde pedonale negli ultimi secondi, vale come giallo per i pedoni e per un eventuale buzzer per i ciechi

Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 08, 2017, 03:14 pm
rimane da dire che non lo ho ancora debuggato

ci metto di meno a scrivere il rpogramma che attaccare i led

comunque compilare compila
al monitor seriale lo stato del semaforo cicla
il led 13 lampeggia, ad indicare il funzionamento della scheda


semmai c'è qualche corrispondenza nome-piedino-colore del led da mettere a posto o cose così

nel pomeriggio vado a casa (adesso sono in ferie, e non cominciamo a dire che dalle feria vedo a casa una volta al giorno, se non volete una vita complicata non fate domande)

dicevo nel pomeriggio vado a casa e imbarco una manciata di relè e una breadboard, per provare a vedere le lucine

invece, per le malelingue che hanno subito detto che potrebbe essere necessario avere vie preferenziali con tempi differenti

dimostrano solo di non saper leggere

i tempi tra la via uno e la due erano differenti già fin dal primo post dove ne parlavo.....
oltre a non capire il tag code, non sanno nemmeno leggere,
che squallore..............


se qualcuno volesse seriamente, magari per un plastico, espandere il semaforo con altre vie o tempi
è semplice:

basta dichiarare le nuove paline (eventualmente con una MEGA invece che una UNO)
e ri-scrivere la tabella delle configurazioni possibili, scrivendole in un ciclo che parta dal doppio rosso

comunque il programma è documentato, e parimenti documentato il metodo che ho usato per scriverlo


buon pomeriggio a tutti
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Etemenanki on Aug 08, 2017, 03:23 pm
...
la saggezza orientale contiene sempre un lato "oscuro",
...
Heheh ... mi fai venire in mente il vecchio "augurio" orientale ... "ti auguro di vivere in tempi interessanti" ... di solito lo si fa ai nemici ... uno potrebbe chiedersi perche' ?

Be', calma, pace, tranquillita', sono desiderabili ma non molto "interessanti" ... che c'e' di piu "interessante" ? ... vediamo, guerre, alluvioni, terremoti, carestie, pestilenze, catastrofi ... :D :D :D
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 08, 2017, 03:57 pm
io in oriente ci sono stato
non fa per me

la saggezza di un popolo si misura anche da quanto riescono a risolvere i loro problemi materiali

non credo che un popolo che la mattina raccoglie i morti con la nettezza urbana (vabbe', loro usano un altro nome) abbia qualcosa da insegnarmi, credo piuttosto che abbiano sbagliato strada,
molto molto tempo fa, se ne sono accorti, ma per non ammetterlo si raccontano un fracco di storie

do più credito ai cinesi, che infatti da loro stessi imitano più dapresso gli americani..........

anche questo fa pensare
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Claudio_FF on Aug 08, 2017, 06:47 pm
Quote from: docsavage
Code: [Select]
// testo se abbiamo gia' raggiunto il tempo
  if (tempo < millis()) {
    // cambio stato semaforo
    luci(sequenza[stato]);
  }

Attenzione che per quanto detto nel mio post (http://forum.arduino.cc/index.php?topic=491944.msg3368126#msg3368126) precedente, e per il fatto che X<millis() e millis()>X sono equivalenti, quella condizione soffre del problema dell'overflow. In pratica per tutto il lasso di tempo in cui 'tempo' ha già passato lo zero mentre millis() ritorna ancora valori elevati, la condizione risulta vera ad ogni ciclo di loop... ma di questo ci si accorge solo dopo cinquanta giorni  ;)
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 08, 2017, 07:42 pm
Dunque

non rimetto il codice perche prima devo capire come aprire le finestre...dopo la sgridata di Guglielmo.

Sta di fatto che corretta la castrazione che mi ha fatto notare docsavage e strarifatte alcune piccole ulteriori modifiche per togliere le cose inutili e per descrive quello che volevo fare il il tutto non funziona lo stesso.

Specifico:
 -Il circuito funziona.
 -Gli schetc,nonostante le ripetute prove in Mille Modi Differenti non hanno errori.

Sta di fatto che che se nelle Graffe del Millis metto un digitalWrite,il tutto funziona correttamente ed il SerialMonitor  noto che lo riporta(anche se non so ancora sfruttarlo ne leggerlo bene).

Se invece nelle Graffe del Mills dico di cambiare in valore di un INT,semplicemente non lo cambia e sul SerialMonitor appaiono invece di 1 come mi aspettavo,appare un numero a caso a volte positivo a volte negativo,ma senza un apparente senso logico tipo +-199367 ,

il tutto solo una volta.






Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 08, 2017, 08:06 pm
Ok, lo sapevo del problema dello overfolw

Ma abbiamo 50 giorni di tempo per metterlo a posto

Stasera arrivo alla casa delle ferie e mi porto avanti, spero

I miei piani sembrano fatti per non essere rispettati
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 08, 2017, 08:49 pm
docsavage facciamo un accordo nei 50 giorni  di tempo tu mi cerchi di risolvermi il problema....ed io cerco di imparare il più possibile.

Chi vince offre un caffè al PERDENTE.
Ci stai??
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 08, 2017, 10:04 pm
Per il caffè nessun problema

Per il problema invece sì
Perché io più di quelli che ho fatto finora non posso fare....

Casomai fai domande specifiche.....
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: astrobeed on Aug 08, 2017, 11:35 pm
Ok, lo sapevo del problema dello overfolw
Che in realtà non è un vero problema, qui (http://www.leonardomiliani.com/2012/come-gestire-loverflow-di-millis/) tutta la spiegazione della cosa e come risolvere.
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 09, 2017, 06:25 am
Infatti non ne ero minimamente preoccupato

La cosa che mi premeva, è mi preme, è vedere le luci sulle paline

La questione millis è secondaria, se non si riesce almeno a far girare il semaforo come deve.....


Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 09, 2017, 06:19 pm
Cortesi signori spero abbiate passato un bel pomeriggio

io sì

e avendo ieri imbarcato una manciata di led da casa questo pomeriggio, dopo pennica ho provato a far andare il mio semaforo

che va alla grande, salvo un solo problema

il servizio notturno impazziva, a parte questo andato al primo tentativo

ho riscritto la parte di codice che attiva il servizio notturno, cambiate alcune tempistiche, per renderle meno reali, ma più scenografiche

aggiunto un ciclo di accensione spegnimento di tutti i led all'avvio, durante la setup

per testare le connessioni (se non vi si accende all'avvio è guasto o scollegato)

e ho aggiunto una variabile in più (necessaria per la nuova gestione del ciclo notturno)

altro non saprei

ah

a proposito di millis

non son stato li ad evitare lo overflow

per uso scenografici (plastico) non è un problema

se qualcuno volesse, non è difficile da mettere a posto
casomai chiedete, tanto fatto 30 posso fare anche 31
ho deciso che non uso il tag code, vi allego il file, contenti?
nonononon al brutto bottone </>
così do un colpo al cerchio ed uno alla botte

Sono gradite critiche, da gente che sa leggere......
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: docsavage on Aug 09, 2017, 07:24 pm
ultimo aggiornamento

se passo a notturno con pedonale prenotato non va bene bene

se a qualcuno di voi serve ci guardo, altrimenti per me mi fermo qui

Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 09, 2017, 07:25 pm
docsavage e tutti gli altri

grazie per lo spunto.

ora ci ristudio sù.

poi te lo offro io il caffe.

Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 14, 2017, 01:33 pm
CE L'HO FATTA :D  ;D  :D  8)

forse non nel migliore dei modi,ma ci sono riuscito.
Code: [Select]

int RP1(13);
int GP1(12);
int VP1(11);
int R1(4);
int R2(10);
int G1(3);
int G2(9);
int V1(2);
int V2(8);
int P1(6);
int P2(7);
extern unsigned long timer0_millis;
unsigned long T1;//TEMPO SCAMBIO SEMAFORI
unsigned long T2;//TEMPO LAMPEGGIO SEMAFORO 2
unsigned long T3;//TEMPO LAMPEGGIO SEMAFORO 1
unsigned long T4;//TEMPO LAMPEGGIO PEDONALE 1
unsigned long T5;//TEMPO PEDONALE 1
int A;//STATO SEMAFORI
int B;//STATO LUCI GIALLE SEMAFORI
int C;//CICLO SEMAFORI E LUCI GIALLE SEMAFORI
int D;//PEDONALE

void setup()
{
 Serial.begin(9600);
   
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);
 pinMode(13, OUTPUT);
 pinMode(6, INPUT);
 pinMode(7, INPUT);
 
}
void loop()
{
Serial.println(millis());
Serial.println(T1);
Serial.println(T2);
Serial.println(T3);
Serial.println("");
Serial.print(A);
Serial.print(B);
Serial.print(C);
Serial.println(D);

 if((A==0)&&(C==0)){Serial.println("Semaforo2 Avanti");Serial.println("Semaforo1 Stop");}
 if((A==0)&&(C==1)){Serial.println("Semaforo2 Lampeggio");}
 if((A==1)&&(C==0)){Serial.println("Semaforo1 Avanti");Serial.println("Semaforo2 Stop");}
 if((A==1)&&(C==1)){Serial.println("Semaforo1 Lampeggio");}
 if(digitalRead(P1)){Serial.println("Pedonale1 Chiamato");}
 if(D==1){Serial.println("Pedonale1 Attesa");}
 if((A==0)&&(D==2)){Serial.println("Pedonale1 Avanti");}
 
Serial.println("");  
 
 
 switch(A)//SEMAFORI
 {
   case 0:
   digitalWrite(RP1, HIGH);//SEMAFORO PEDONALE STOP
   digitalWrite(R1, HIGH);//SEMAFORO1 STOP
   digitalWrite(V2, HIGH);//SEMAFORO2 AVANTI
   digitalWrite(R2,LOW);
   digitalWrite(V1,LOW);
   break;
   
   case 1:
   digitalWrite(R2,HIGH);//SEMAFORO2 STOP
   digitalWrite(V1,HIGH);//SEMAFORO1 AVANTI
   digitalWrite(R1,LOW);
   digitalWrite(V2,LOW);
   break;
  }
 
  switch(B)//LUCI GIALLE SEMAFORI
   {
   case 0:
   digitalWrite(G1, LOW);
   digitalWrite(G2, LOW);
   break;
   
   case 1:
   digitalWrite(G1, HIGH);
   break;
   
   case 2:
   digitalWrite(G2,HIGH);
   break;
   }
 
 
 
 if((D!=2)&&(millis()>=T1+2000)){A++;B=0;C++;
                               T1=millis();
                               T2=millis();
                               T3=millis();
                               T4=millis();
                               T5=millis();
                              }//TEMPO SCAMBIO SEMAFORI
 
 if(A>1){A=0;}
 if(B>2){B=0;}
 if(C>1){C=0;}
 
 
 if((A==0)&&(C==0)){//SEMAFORO2 VERDE--SEMAFORO1 ROSSO--PEDONALI INATTIVI
                   if(millis()>=T2+1000){B=2;C++;T2=millis();}//ATTESA PER LAMPEGGIO
                   }
                   
 if((A==0)&&(C==1)){//SEMAFORO 2 LAMPEGGIO
                    if(millis()>=T2+250){B=0;}//PRIMO LAMPEGGIO
                    if(millis()>=T2+500){B=2;T2=millis();}//SECONDO LAMPEGGIO
                   }
                   
 if((A==1)&&(C==0)){//SEMAFORO1 VERDE--SEMAFORO2 ROSSO
                    if(millis()>=T3+1000){B=1;C++;T3=millis();}//ATTESA PER LAMPEGGIO
                   }
                   
 if((A==1)&&(C==1)){//SEMAFORO 1 LAMPEGGIO
                    if(millis()>=T3+250){B=0;}//PRIMO LAMPEGGIO
                    if(millis()>=T3+500){B=1;T3=millis();}//SECONDO LAMPEGGIO
                   }
 
 if(digitalRead(P1)&&(D==0)){//CHIAMATA PEDONALE
                             while(digitalRead(P1)){}//FINCHE'IL PULSANTE é PREMUTO NON FARE NIENTE
                             D++;//POI INCREMENTA INT(D)
                            }
 if((A==0)&&(C==0)&&(D==1)){ //SE SEMAFORO1 STOP
                            ++D;//INCREMENTA INT(D)
                            }
                     
 if(D==2)
        {
         A=0;//SEMAFORO2 resta VERDE
         B=0;//LUCI GIALLE sono SPENTE
         C=0;//FERMA I LAMPEGGI di tutti i SEMAFORI
         digitalWrite(VP1,HIGH);//PEDONALE1 AVANTI
        }
 
 if(D==2){//SE PEDONALE AVANTI
          if(millis()>=T4+1000){digitalWrite(GP1,HIGH);T2=millis();}//ATTESA PER LAMPEGGIO
         }
 
 if(D==2){//SE PEDONALE AVANTI
          if(millis()>=T4+250){digitalWrite(GP1,LOW);}//PRIMO LAMPEGGIO
          if(millis()>=T4+500){digitalWrite(GP1,HIGH);T3=millis();}//SECONDO LAMPEGGIO
         }
 
 if(millis()>=T5+2000){//DOPO(tot)MILLISECONDI
                       D=0;//PULSANTE
                       digitalWrite(VP1,LOW);
                       digitalWrite(GP1,LOW);
                       digitalWrite(RP1,HIGH);//PEDONALE STOP
                      }
 
}
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 14, 2017, 01:38 pm
il PEDONALE2 non lho fatto perchè avevo finito  i PIN DIGITALI

ora devo capire come aprire le finestre nei forum per metterci gli scketch,se no mi sgridano

grazie a tutti
Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: Puso on Aug 14, 2017, 03:14 pm
dunque ci sono riuscito scusate se mi ripeto,ma è per fare prove con le finestrelle

la PARTE--0 riguarda le variabili che me le devo ancora studiare bene per il momento le copio

Code: [Select]

int RP1(13);
int GP1(12);
int VP1(11);
int R1(4);
int R2(10);
int G1(3);
int G2(9);
int V1(2);
int V2(8);
int P1(6);
int P2(7);
extern unsigned long timer0_millis;
unsigned long T1;//TEMPO SCAMBIO SEMAFORI
unsigned long T2;//TEMPO LAMPEGGIO SEMAFORO 2
unsigned long T3;//TEMPO LAMPEGGIO SEMAFORO 1
unsigned long T4;//TEMPO LAMPEGGIO PEDONALE 1
unsigned long T5;//TEMPO PEDONALE 1
int A;//STATO SEMAFORI
int B;//STATO LUCI GIALLE SEMAFORI
int C;//CICLO LAMPEGGIO SEMAFORI



PARTE1-- codifico il Setup

Code: [Select]

void setup()
 {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  }


poi passo al Loop

PARTE--2 per LEGGERE come risponde il mio schetch su SERIAL MONITOR
Code: [Select]
void loop()
{
 Serial.println(millis());
 Serial.println(T1);
 Serial.println(T2);
 Serial.println(T3);
 Serial.println("");
 Serial.print(A);
 Serial.print(B);
 Serial.print(C);
 Serial.println(D);
 
  if((A==0)&&(C==0)){Serial.println("Semaforo2 Avanti");Serial.println("Semaforo1 Stop");}
  if((A==0)&&(C==1)){Serial.println("Semaforo2 Lampeggio");}
  if((A==1)&&(C==0)){Serial.println("Semaforo1 Avanti");Serial.println("Semaforo2 Stop");}
  if((A==1)&&(C==1)){Serial.println("Semaforo1 Lampeggio");}
  if(digitalRead(P1)){Serial.println("Pedonale1 Chiamato");}
  if(D==1){Serial.println("Pedonale1 Attesa");}
  if((A==0)&&(D==2)){Serial.println("Pedonale1 Avanti");}
 
Serial.println(""); 


PARTE3-- DESCRIVO LE VARIABILI
Code: [Select]
switch(A)//SEMAFORI
  {
    case 0:
    digitalWrite(RP1, HIGH);//SEMAFORO PEDONALE STOP
    digitalWrite(R1, HIGH);//SEMAFORO1 STOP
    digitalWrite(V2, HIGH);//SEMAFORO2 AVANTI
    digitalWrite(R2,LOW);
    digitalWrite(V1,LOW);
    break;
   
    case 1:
    digitalWrite(R2,HIGH);//SEMAFORO2 STOP
    digitalWrite(V1,HIGH);//SEMAFORO1 AVANTI
    digitalWrite(R1,LOW);
    digitalWrite(V2,LOW);
    break;
   }
 
   switch(B)//LUCI GIALLE SEMAFORI
    {
    case 0:
    digitalWrite(G1, LOW);
    digitalWrite(G2, LOW);
    break;
   
    case 1:
    digitalWrite(G1, HIGH);
    break;
   
    case 2:
    digitalWrite(G2,HIGH);
    break;
    }
 


PARTE--4 dò il TEMPO alle luci dei SEMAFORI
Code: [Select]

if((D!=2)&&(millis()>=T1+2000)){A++;B=0;C++;
                                T1=millis();
                                T2=millis();
                                T3=millis();
                                T4=millis();
                                T5=millis();
                               }//TEMPO SCAMBIO SEMAFORI
 
  if(A>1){A=0;}
  if(B>2){B=0;}
  if(C>1){C=0;}
 
 
  if((A==0)&&(C==0)){//SEMAFORO2 VERDE--SEMAFORO1 ROSSO--PEDONALI INATTIVI
                    if(millis()>=T2+1000){B=2;C++;T2=millis();}//ATTESA PER LAMPEGGIO
                    }
                     
  if((A==0)&&(C==1)){//SEMAFORO 2 LAMPEGGIO
                     if(millis()>=T2+250){B=0;}//PRIMO LAMPEGGIO
                     if(millis()>=T2+500){B=2;T2=millis();}//SECONDO LAMPEGGIO
                    }
                   
  if((A==1)&&(C==0)){//SEMAFORO1 VERDE--SEMAFORO2 ROSSO
                     if(millis()>=T3+1000){B=1;C++;T3=millis();}//ATTESA PER LAMPEGGIO
                    }
                     
  if((A==1)&&(C==1)){//SEMAFORO 1 LAMPEGGIO
                     if(millis()>=T3+250){B=0;}//PRIMO LAMPEGGIO
                     if(millis()>=T3+500){B=1;T3=millis();}//SECONDO LAMPEGGIO
                    }


Parte--5 attivo il PEDONALE
Code: [Select]
if(digitalRead(P1)&&(D==0)){//CHIAMATA PEDONALE
                              while(digitalRead(P1)){}//FINCHE'IL PULSANTE é PREMUTO NON FARE NIENTE
                              D++;//POI INCREMENTA INT(D)
                             }
  if((A==0)&&(C==0)&&(D==1)){ //SE SEMAFORO1 STOP
                             ++D;//INCREMENTA INT(D)
                             }
                       
  if(D==2)
         {
          A=0;//SEMAFORO2 resta VERDE
          B=0;//LUCI GIALLE sono SPENTE
          C=0;//FERMA I LAMPEGGI di tutti i SEMAFORI
          digitalWrite(VP1,HIGH);//PEDONALE1 AVANTI
         }
 
  if(D==2){//SE PEDONALE AVANTI
           if(millis()>=T4+1000){digitalWrite(GP1,HIGH);T2=millis();}//ATTESA PER LAMPEGGIO
          }
 
  if(D==2){//SE PEDONALE AVANTI
           if(millis()>=T4+250){digitalWrite(GP1,LOW);}//PRIMO LAMPEGGIO
           if(millis()>=T4+500){digitalWrite(GP1,HIGH);T3=millis();}//SECONDO LAMPEGGIO
          }
 
  if(millis()>=T5+2000){//DOPO(tot)MILLISECONDI
                        D=0;//PULSANTE
                        digitalWrite(VP1,LOW);
                        digitalWrite(GP1,LOW);
                        digitalWrite(RP1,HIGH);//PEDONALE STOP
                       }
 
}


Title: Re: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).
Post by: gpb01 on Aug 15, 2017, 05:49 pm
Thread ripulito da tutti i post NON inerenti all'argomento :)

Guglielmo