Go Down

Topic: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori). (Read 6228 times) previous topic - next topic

docsavage

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
E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

astrobeed

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.
Scientia potentia est

Puso


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.

Puso

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

docsavage

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
E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

docsavage

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)

E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

docsavage

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

E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

Puso

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?

docsavage

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
E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

docsavage

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
E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo


Puso

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.

gpb01

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
Search is Your friend ... or I am Your enemy !

docsavage

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
E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

docsavage

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

E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

Go Up