Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).

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?

poi mi sono scritto una loop semplice semplice

per provare se compilava

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

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?

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

:) :)

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.

Puso: 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) [u]su tutti i tuoi post dove hai messo del codice[/u] o ... mi vedo costretto a chiudere il thread per mancato rispetto del regolamento.

Grazie,

Guglielmo

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.

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

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)

// 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

  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

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:

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

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

// 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

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

docsavage: ... 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

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

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

Attenzione che per quanto detto nel mio post precedente, e per il fatto che XX 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 ;)

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.

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

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??

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

docsavage: Ok, lo sapevo del problema dello overfolw

Che in realtà non è un vero problema, qui tutta la spiegazione della cosa e come risolvere.

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

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…

semaforo.ino (8.69 KB)

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