Semaforo: etimologia e costruzione

Semaforo: etimologia
Dal greco Sema->significato e Foro->portatore
"portatore di significato"
Ma se sta fermo? cosa potrebbe portare un coso che sta fermo cementato a terra?
chiaramente non è giusto, qualcuno ha preso un abbaglio...
Invertiamo il concetto:
"il significato di portare"
peggio che peggio, un palo cementato a terra non può esemplificare il concetto di trasporto, al massimo quello di gancio

decisamente semaforo non viene dal greco

qualcuno dice dal francese, dicono sia un calco dal francese "sémaphore"
peccato che in francese semaforo si dica "feu" (plurale "feux")
decisamente semaforo non viene dal francese, e comunque nemmeno in francese viene dal greco...

rimane solo il latino

Seme: da seme ovvero seme
Foro: da forum, nota trasmissione di persone litigiose
ecco quindi il vero significato di semaforo:
"seme della discordia"

infatti spesso ci si litiga, ai semafori....

ma tutto questo per dire cosa?

nulla di importante: ne ho fatto uno

mi sono documentato in rete, ho letto un fracco di discussioni qui sul forum (noto luogo di discussione, appunto)
e unendo tutto quello che ho trovato in qualche giorno di studio di discussioni antiche (altrui) e idee moderne (mie)

ho tirato fuori questo:

vedete se vi piace

/* di Nelson-StandardOil
   IDE 1.8.19 -
   Progetto:
   Scopo: prova per un semaforo usando la matrice di tasti e led
   Data inizio lavori: 03/06/22
*/


// matrice 3 per 3
// 3 anodi e tre catodi
// un po' di dichiarazioni
byte anodi[] = {2, 3, 4};
byte catodi[] = {5, 6, 7};
#include "matriled.h"
// la libreria matriled gestisce una matrice di anodi x catodi LED e Pulsanti con LED ausiliario di pulsante premuto



/*
   il ciclo delle lanterne sarà
   rosso 1 rosso 2 (solo qui può cambiare il servizio normale<->notturno oppure normale<->pedonale
   verde 1 rosso 2
   verde giallo 1 rosso2
   rosso 1 rosso 2
   rosso 1 verde 2
   rosso 1 verde giallo 2
   ricomincia


   ciclo ausiliare
   doppio rosso pedonale rosso
   doppio rosso pedonale verde
   doppio rosso pedonale verde giallo
   doppio rosso pedonale rosso
   rosso1 rosso 2 (ritorno) è quello di prima, il termine del ciclo principale, ricomincia


   lampeggio notturno

   doppio giallo con giallo pedonale spento - solo qui può cambiare servizio
   giallo pedonale con lanterne principale spente

*/

// la durata di un secondo
#define TEMPO 100

// il tempo di cambio ultimo stato
unsigned long int tempo;

enum Stati {DOPPIOROSSO, LANTERNA1VERDE, LANTERNA1GIALLO, ROSSODOPPIO, LANTERNA2VERDE, LANTERNA2GIALLO, PEDONEVERDE, PEDONEGIALLO, LAMPEGGIO1, LAMPEGGIO2};

// solo da doppiorosso può commutare in pedoneverde o lampeggio1
// solo da lampeggio2 può commutare in doppiorosso
// dopo pedonegiallo può commutare solo in doppiorosso
// ciclo principale 6 passi



// la definizione delle lanterne dei varii stati
typedef struct
{
   char lanterne[9];// le nove lanterne, '1' acceso non uno spento scritto come carattere
   byte tempo; // il tempo "base" di attesa prima di cambiare, in tempi elementari definiti come TEMPO
   byte prossimo; //prossimo stato nella sequenza
} Stato;

Stato stati[] = {{"001001001", 3, LANTERNA1VERDE}, {"100001001", 30, LANTERNA1GIALLO}, {"110001001", 9, ROSSODOPPIO}, {"001001001", 3, LANTERNA2VERDE}, {"001100001", 30, LANTERNA2GIALLO}, {"001110001", 30, DOPPIOROSSO}, {"001001100", 30, PEDONEGIALLO}, {"001001110", 9, DOPPIOROSSO}, {"010010000", 1, LAMPEGGIO2}, {"000000010", 1, LAMPEGGIO1}};

byte stato; // lo stato attuale della macchina a stati
byte prenotato; // la prenotazione del predonale

// magheggio, uso una macro per leggere l'interruttore notturno, mappato su una matrice di LED e pulsanti, attraverso la sua funzione di lettura
#define notturno pulsante(1)
#define pedonale pulsante(0)


void setup(void)
{
   Serial.begin(9600);
   pinMode(13, OUTPUT);
   Serial.println("inizio programma");
   Serial.flush();
}
void loop(void)

{
   // aggiorno i LED e i pulsanti
   scorre();

   // controllo se abbiamo una richiesta di pedone

   if (pedonale)
   {
      prenotato = 1;
   }

   // il evolvere della macchina a stati

   if (millis() - tempo > stati[stato].tempo * TEMPO)
   {
      tempo = millis();

      // passo allo step successivo
      // prima devo controllare che non si sia in una situazione di cambio modo notturno o pedonale
      if (stato == DOPPIOROSSO)
      {
         if (prenotato)
         {
            stato = PEDONEVERDE;
            prenotato = 0;
            // deprenoto il pedone
         }

         else if (notturno)
         {
            stato = LAMPEGGIO1;
         }

         else
         {
            // situazione normale
            stato = stati[stato].prossimo;
         }
      }

      else
      {
         // non siamo in doppiorosso,
         // pero' potremmo essere in LAMPEGGIO2
         // che se l'iterrottore di notturno è stato escluso ripassiamo a doppio rosso
         if (!notturno && stato == LAMPEGGIO2)
         {
            stato = LANTERNA2GIALLO;
         }

         stato = stati[stato].prossimo;
      }

      // adesso aggiorno i led
      for (byte i = 0; i < 9; i++)
      {
         setta(i, (stati[stato].lanterne[i] == '1'));
      }

      Serial.print("stato: ");
      Serial.println(stato);
   }
}

notare l'uso del costrutto enum per creare una serie di costanti consecutive, invece di usare, come fanno tutti, delle #define, o peggio delle const int

notare anche l'uso di macro per mappare su "parole facili" la lettura di array di pulsanti multiplati

al solito i commenti dopo

se premete il pulsante 0 (quello associato al primo LED) prenotate il servizio pedonale, al termine del ciclo breve accende il verde pedonale

se premete e tenete premuto (idealmente un interruttore) il pulsante 1 al termine del ciclo attuale passa a servizio notturno

domanda: è bloccante?
che ne so, provate

domanda: lo schema elettrico?
cercate "per qualche lucina in più"

domanda: funziona?
Provato, non ci sono dubbi

altre domande?
io qui sono

Il mio livello "nerd" aveva capito un' altro semaforo!
Potrei provarlo.

Per i curiosi, avevo capito che si parlasse dei semafori in ambito informatico, cercare su Wikipedia.

Intendi che ti va di provare questo che ho fatto io?

Ne sarei onorato

Interessante che in inglese quello del quale parlo io è "traffic light", quello del quale parli tu è "semaphore"

Si. Ho solo bisogno di tempo e di recuperare pulsanti, led e resistenze.

Forse significa portatore di informazioni, informatore.

Probabile
Ma la battuta era su un "portatore" cementato a terra...

E però qui disquisiamo tra portatore e trasportatore.
Una colonna portante non trasporta, eppure porta.

Ma cosi non sarei mai arrivato al "seme della discordia"...

Io invece chiedo, "per un amico", matriled.h sarebbe una libreria scaricabile?
Se vi sembra una domanda "idiota", sappiate che 30 gradi più umidità al 70% non mi sono congeniali.

Nessuno domanda è idiota
Semmai fuori contesto
Ma la tua non lo è

Matriled non è scaricabile
Devi "crearla" copiandotene il testo da qui:
https://forum.arduino.cc/t/per-qualche-lucina-in-piu/702159/10?u=standardoil

Semmai stasera, da casa, provo a metterla nel mio dropbox

In effetti anche la "tempodellelibrerie" la devi recuperare da "il tempo delle librerie ovvero la libreria del tempo"

Ah, ecco.
Potevi anche citare:
"Le domande non sono mai indiscrete le risposte, a volte, lo sono."

Qui si parlava di idiozia
Non di indiscrezione

@speedyant prova questo link, vedi se si trovano schemi e librerie
Imparare l'elettronica partendo da una UNO

Scaricato come zip.

Mancano le telecamere con il modulo IA per decidere i tempi in base alle code (ed al grado di irritazione espresso dalle facce degli automobilisti), e gli idranti automatici per "lavare via" i lavavetri dai parabrezza :grin:

(scusa, non ho resistito :wink:)

La cosa che si potrebbe fare sarebbe il cicalino pedonale per non vedenti.

Quello si fa in hardware collegato al verde pedonale

Invece per la gestione intelligente delle code dei veicoli

Due sensori, coda corta e coda lunga

Per ogni via
Sono 4 sensori, abbiamo liberi 7 pulsanti multiplati e 12 pin inutilizzati
Alla struttura che descrive la condigurazione delle lanterne si aggiungono due tempi
Uno per sensore 1 impegnato
E uno per sensore due impegnato
Al cambio di lanterna si controllano i corrispondenti sensori e se ne salva lo stato in una variabile
Il test su millis si fa usando il tempo corrispondente al numero di sensori impegnati: uno, nessuno o centomila
Ops
Uno nessuno o due

Poche righe in più da scrivere, si e no 3 rughe da aggiungere e una da modificare, no due, c'è anche l'inizializzazione dell'array di lanterne...
Lo avevo lasciato come esercizio per i lettori

Come vedete una UNO, senza multiplexer o shift register, ma solo con un paio di manciate di led e resistenze, fa tante cose

E hai trovato le due librerie?

Domando perché prima volta oggi

Se non ricordo male, però, il cicalino aumenta la frequenza quando sta per scattare il rosso.
Lo faresti sempre in hardware utilizzando l'arancio o a questo punto intervieni sul software?