Help - Codice Gestione semafori + attraversamento pedonale

Buongiorno a tutti, sono nuovo del gruppo e ai primi passi con Arduino. Sto cercando di realizzare un circuito che permette il controllo di 4 semafori e la chiamata pedonale per un quinto. Il semaforo pedonale deve avere un buzzer e un conto alla rovescia. Non avendo abbastanza ingressi ho usato 2 schede Arduino. In allegato l'immagine del circuito e i 2 codici.
Avviando al simulazione mi viene restituito l'errore;
"Invalid header file"
Mi potreste aiutare ??? Grazie :sweat_smile:

// Code1 - Slave
#include <Wire.h>

const int a = 2;
const int b = 1;
const int c = 3;
const int d = 4;
const int e = 5;
const int f = 6;
const int g = 7;
int numero = -10; 
int ritardo = 5000;
int pedone_R = 10;
int pedone_G = 9;
int pedone_V = 8;
int pulsante = 12;

  void setup()
{
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(pedone_V, OUTPUT);
  pinMode(pedone_G, OUTPUT);
  pinMode(pedone_R, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(pulsante, INPUT);
  pinMode(13, INPUT);
  Wire.begin(13);
  Wire.onRequest(requestEvent);  
}
 
 void loop() 
{        
   if (digitalRead(pulsante) == HIGH); {
      pedonale();
      }  
  else{
  		blocco_semaforo();
  }
}    
   
void pedonale() {
  
    delay(ritardo/10); //scala il numero della variabile in modo da contare alla rovescia
    numero += -1;
    delay(ritardo/2);
      
    switch(numero) {

    case -1:
    digitalWrite(pedone_V, LOW);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_R, LOW);
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH); //caso in cui la variabile raggiunge il valore -1 
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    delay(ritardo/5);
    break;
      
    case 0:
    digitalWrite(pedone_R, HIGH);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_V, LOW);
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH); //attraverso gli HIGH/LOW mostro il numero 0, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    tone(11, 500, 500);
    delay(ritardo/2);
    break;
      
    case 1:
    digitalWrite(pedone_R,LOW);
    digitalWrite(pedone_G, HIGH);
    digitalWrite(pedone_V, LOW);
    digitalWrite(a, LOW);
    digitalWrite(b, HIGH); //attraverso gli HIGH/LOW mostro il numero 1, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, LOW); 
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    tone(11, 100, 500);
    delay(ritardo/5); 
    break;
      
    case 2:
    digitalWrite(pedone_R, LOW);
    digitalWrite(pedone_G, HIGH);
    digitalWrite(pedone_V, LOW);
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH); //attraverso gli HIGH/LOW mostro il numero 2, i LED e fa suonare il buzzer
    digitalWrite(c, LOW); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    tone(11, 100, 500);
    delayritardo/5); 
    break;
    
    case 3:
    digitalWrite(pedone_R, LOW);
    digitalWrite(pedone_G, HIGH);
    digitalWrite(pedone_V, LOW);
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH); //attraverso gli HIGH/LOW mostro il numero 3, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    tone(11, 100, 500);
    delay(ritardo/5);
    break;
    
    case 4:
    digitalWrite(pedone_R, LOW);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_V, HIGH);
    digitalWrite(a, LOW);
    digitalWrite(b, HIGH); //attraverso gli HIGH/LOW mostro il numero 4, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, LOW); 
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    tone(11, 100, 500);
    delay(ritardo/5);
    break;
    
    case 5:
    digitalWrite(pedone_R, LOW);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_V, HIGH);
    digitalWrite(a, HIGH);
    digitalWrite(b, LOW); //attraverso gli HIGH/LOW mostro il numero 5, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    tone(11, 100, 500);
    delay(ritardo/5);
    break;
      
    case 6:
    digitalWrite(pedone_R, LOW);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_V, HIGH);
    digitalWrite(a, HIGH);
    digitalWrite(b, LOW); //attraverso gli HIGH/LOW mostro il numero 6, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    tone(11, 100, 500);
    delay(ritardo/5);
    break;      
      
    case 7:
    digitalWrite(pedone_R, LOW);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_V, HIGH);
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH); //attraverso gli HIGH/LOW mostro il numero 7, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, LOW); 
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    tone(11, 100, 500);
    delay(ritardo/5);
    break;    
      
    case 8:
    digitalWrite(pedone_R, LOW);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_V, HIGH);
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH); //attraverso gli HIGH/LOW mostro il numero 8, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    tone(11, 100, 500);
    delay(ritardo/5);
    break;      
      
      case 9:
    digitalWrite(pedone_R, LOW);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_V, HIGH);
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH); //attraverso gli HIGH/LOW mostro il numero 9, i LED e fa suonare il buzzer
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    tone(11, 100,500);
    delay(ritardo/5);
    break;    
 }
   
    if (digitalRead(pedone_V) == HIGH && (digitalRead(pedone_G) == HIGH && digitalRead(pedone_R) == HIGH)) {
    digitalWrite(pedone_V, LOW);
    digitalWrite(pedone_G, LOW);
    digitalWrite(pedone_R, LOW);
    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH); //fa spegnere tutti i led se sono tutti accesi
    digitalWrite(c, HIGH); 
    digitalWrite(d, HIGH); 
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
  }
    if (digitalRead(pulsante) == HIGH) {
    numero = 10; //legge il pulsante e resetta la variabile numero
    }
}

  void blocco_semaforo() {
   digitalWrite(pedone_R, LOW);
   } 

   void requestEvent()
 {
    if (digitalRead(13) == HIGH){
      Wire.write("a");
 }   
    else
     {
      Wire.write("s");
      }  
  }
// Code2 - Master

//dichiaro le variabili dei led
//led dei semafori

#include <Wire.h>

int led_R1=2;
int led_G1=3;
int led_V1=4;
int led_R2=5;
int led_G2=6;
int led_V2=7;
int ritardo = 5000;

void setup()
{
  Wire.begin();
  Serial.begin(9600);//accendo il monitor seriale per i test
  //modalità di funzionamento dei pin di Arduino
  pinMode(led_R1, OUTPUT);
  pinMode(led_G1, OUTPUT);
  pinMode(led_V1, OUTPUT);
  pinMode(led_R2, OUTPUT);
  pinMode(led_G2, OUTPUT);
  pinMode(led_V2, OUTPUT);
}

void loop()
{
  Wire.requestFrom(13,1);
  String b = "";
  char c = Wire.read();
  b = b + c;
  delay (ritardo/10);
  
  if (b == "a") {
    blocco_semafori();
     }
  else {  
    sequenza_semafori();
  }
}

void blocco_semafori() {
  
     digitalWrite(led_R1, LOW);
     digitalWrite(led_G1, HIGH);
     digitalWrite(led_V1, LOW);
     digitalWrite(led_R2, LOW);
     digitalWrite(led_G2, HIGH);
     digitalWrite(led_V2, LOW);
     delay(ritardo/2);
     digitalWrite(led_R1, HIGH);
     digitalWrite(led_G1, LOW);
     digitalWrite(led_V1, LOW);
     digitalWrite(led_R2, HIGH);
     digitalWrite(led_G2, LOW);
     digitalWrite(led_V2, LOW);
     delay(10000);
     } 

  void sequenza_semafori() {
    
  digitalWrite(led_R1, HIGH);
  digitalWrite(led_G1, LOW);
  digitalWrite(led_V1, LOW);
  digitalWrite(led_R2, LOW);
  digitalWrite(led_G2, LOW);
  digitalWrite(led_V2, HIGH);
  delay(ritardo);
  digitalWrite(led_R1, HIGH);
  digitalWrite(led_G1, LOW);
  digitalWrite(led_V1, LOW);
  digitalWrite(led_R2, LOW);
  digitalWrite(led_G2, HIGH);
  digitalWrite(led_V2, LOW);
  delay(ritardo/2);
  digitalWrite(led_R1, LOW);
  digitalWrite(led_G1, LOW);
  digitalWrite(led_V1, HIGH);
  digitalWrite(led_R2, HIGH);
  digitalWrite(led_G2, LOW);
  digitalWrite(led_V2, LOW);
  delay(ritardo);
  digitalWrite(led_R1, LOW);
  digitalWrite(led_G1, HIGH);
  digitalWrite(led_V1, LOW);
  digitalWrite(led_R2, HIGH);
  digitalWrite(led_G2, LOW);
  digitalWrite(led_V2, LOW);
  delay(ritardo/2); 
}

Ti segnalo che, nella sezione in lingua Inglese, si può scrivere solo in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.

Grazie.

Non ho mai messo 2 Arduino nella stessa simulazione (tinkercad, vero?) quindi non so se dipenda da questo.

Ma scusa, perché non usare un Mega?

Perché non multiplexare i semafori?... :slight_smile:
3 LED su 5 semafori = 8 uscite...

1 Like

Come detto sono alle primissime armi... non trovo la scheda mega nelle librerie tinkercad :grimacing:

Come detto sono alle primissime armi... non saprei come fare :sweat_smile:

Scrivi lo stato di tutti i LED su altrettante variabili e alla fine di ogni loop metti la funzione multiplexer, che alimenta un semaforo per volta oppure un colore per volta in rapidissima successione.
R[0...4]
G[0...4]
V[0...4]

oppure:
semA[0...2]
semB[0...2]
semC[0...2]
semD[0...2]
semE[0...2]

void multiplexer():

  • Alimenta un semaforo per volta mettendo a livello basso l'uscita comune dei 3 LED.
  • Legge le 3 variabili relative al semaforo attivo e ne assegna i valori (acceso o spento) alle uscite.

Fai prima così che a scambiare comunicazioni fra le due schede.

Quando non trovi come fare qualcosa con Tinkercad lascia perdere Tinkercad e usa Wokwi.

PS Tra l'altro io faccio il contrario, in genere uso Wokwi e se qualcosa non mi torna, vedo se magari Tinkercad ce l'ha. Cosa che non accade quasi mai...:wink:

@Datman , @docdoc : e si che NON è il primo giorno che state sul forum ... ma NON lo vedete che manca la presentazione ? ... che vi affrettate a rispondere ... :angry:

Guglielmo

@lucabest: A quanto detto da pert aggiungo ...

... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (... e, per evitare future possibili discussioni/incomprensioni, prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

Poiché docdoc aveva risposto, io ho proseguito senza fare verifiche...

Quasi quasi vi banno per una settimana tutti e due :smile: :smile: :smile:

Guglielmo

1 Like

Troppo buono, Capo... :smile:

Mea culpa, meo culpa, mea grandissima culpa :sweat_smile:

1 Like

Naturalmente, per fare il multiplexing il loop deve girare "alla velocità della luce", perciò non puoi fare le temporizzazioni con delay() ma, come buona abitudine, devi usare millis() e questa è l'occasione buona per cominciare.
Io farei uno switch/case per i 3 colori e, di seguito, un altro per il tempo residuo. Se il display deve rimanere spento, metti il tempo residuo = 10 o 20 o altro.

1 Like

Cuoricino...

Comunque a quel punto miltiplexi anche il display
6 (cinque semafori più display) per 7 (massimo 7 segmenti)
Fa 13 pin

Invece che 5x3 8pin sui semafori piu 7 per il display a fare 15

In più si avanzano i pin della comunicazione sda e scl

Se multiplexi anche il display, anziché
3 colori più 5 semafori = 8
fai
4 colori (di cui uno è il display) più 7 semafori/segmenti = 11, oppure
7 colori/segmenti (di cui solo 3 per i colori) + 6 tra semafori e il display = 13, forse mentalmente più semplice.
Si potrebbe anche inviare il numero in un tranquillo BCD (senza scomodare le comunicazioni seriali) e decodificare con dei CD4511 (non so se esistono anche a corrente costante, che non richiederebbero le resistenze sui segmenti), però diventa inutilmente più complicato...

Non ci avevo pensato, grazie, ma non te li metto tre cuori in un giorno

Sarebbe l'occasione giusta per fare la macchina a stati finiti universale della quale si parla qui: Macchina a stati finiti, cos'è quando e perché usarla in Arduino

La macchina a stati finiti universale mi sembra più una complicazione che altro, dato che concettualmente è semplice ma avrebbe molte varianti. Si faticherebbe per capire come usarla e si perderebbe la possibilità di capire come funziona!

Copiato dal mio messaggio nella discussione sulle FSM:

Se vuoi farlo realistico, non puoi mettere LED in parallelo: in Italia, il giallo si accende dal verde al rosso, ma non viceversa; inoltre, ci sono sempre due secondi di rosso per tutti prima di ogni verde, così come ci sono alcuni secondi di rosso per tutti quando i semafori, di notte, passano al giallo intermittente e quando, all'alba, riprendono il normale funzionamento. Pilotandoli indipendentemente, dopo un inizio semplice puoi fare ogni altra cosa, altrimenti no!

Poi, giustamente, bisognerebbe considerare anche i semafori pedonali...