.. note:: Ciao, benvenuto nella Community su Facebook per gli appassionati di SunFounder Raspberry Pi, Arduino e ESP32! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirti a noi?** - **Supporto esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra community e del nostro team. - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci dei nuovi prodotti e anteprime esclusive. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni e Giveaway Festivi**: Partecipa a concorsi e promozioni in occasione delle festività. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! 3.1.7 Semaforo ================= Introduzione -------------- In questo progetto, utilizzeremo LED di tre colori per simulare il cambio delle luci semaforiche, e un display a 4 cifre a 7 segmenti mostrerà il conto alla rovescia per ogni stato del semaforo. Componenti ------------- .. image:: img/list_Traffic_Light.png :align: center Schema di Collegamento --------------------------- ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO17 Pin 11 0 17 GPIO27 Pin 13 2 27 GPIO22 Pin 15 3 22 SPIMOSI Pin 19 12 10 GPIO18 Pin 12 1 18 GPIO23 Pin 16 4 23 GPIO24 Pin 18 5 24 GPIO25 Pin 22 6 25 SPICE0 Pin 24 10 8 SPICE1 Pin 26 11 7 ============ ======== ======== === .. image:: img/Schematic_three_one7.png :align: center Procedure Sperimentali -------------------------- **Passo 1:** Costruisci il circuito. .. image:: img/image254.png :width: 800 **Passo 2:** Cambia directory. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/3.1.7/ **Passo 3:** Compila. .. raw:: html .. code-block:: gcc 3.1.7_TrafficLight.c -lwiringPi **Passo 4:** Esegui. .. raw:: html .. code-block:: sudo ./a.out Quando il codice è in esecuzione, i LED simuleranno il cambio dei colori del semaforo. Prima si accende il LED rosso per 60 secondi, poi il LED verde per 30 secondi, successivamente il LED giallo per 5 secondi. Dopo di che, il ciclo ricomincia con il LED rosso acceso per 60 secondi. .. note:: Se non funziona dopo l'esecuzione o compare un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`. **Spiegazione del Codice** .. code-block:: c #define SDI 5 #define RCLK 4 #define SRCLK 1 const int placePin[] = {12, 3, 2, 0}; unsigned char number[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; void pickDigit(int digit); void hc595_shift(int8_t data); void clearDisplay(); void display(); Queste righe di codice permettono la visualizzazione dei numeri sul display a 4 cifre e 7 segmenti. Per maggiori dettagli, consulta :ref:`1.1.5_4digit_c_pi5`. In questo progetto, il display viene utilizzato per visualizzare il conto alla rovescia del semaforo. .. code-block:: c const int ledPin[]={6,10,11}; int colorState = 0; void lightup() { for(int i=0;i<3;i++){ digitalWrite(ledPin[i],HIGH); } digitalWrite(ledPin[colorState],LOW); } Questo codice accende e spegne i LED per simulare i colori del semaforo. .. code-block:: c int greenLight = 30; int yellowLight = 5; int redLight = 60; int colorState = 0; char *lightColor[]={"Red","Green","Yellow"}; int counter = 60; void timer(int timer1){ //Timer function if(timer1 == SIGALRM){ counter --; alarm(1); if(counter == 0){ if(colorState == 0) counter = greenLight; if(colorState == 1) counter = yellowLight; if(colorState == 2) counter = redLight; colorState = (colorState+1)%3; } printf("counter : %d \t light color: %s \n",counter,lightColor[colorState]); } } Il codice serve per attivare e disattivare il timer. Per maggiori dettagli, consulta :ref:`1.1.5_4digit_c_pi5`. Qui, quando il timer raggiunge lo zero, `colorState` cambia per passare al LED successivo e al timer viene assegnato un nuovo valore. .. code-block:: c void loop() { while(1){ display(); lightup(); } } int main(void) { //… signal(SIGALRM,timer); alarm(1); loop(); return 0; } Il timer viene avviato nella funzione main(). Nella funzione loop(), si utilizza un ciclo **while(1)** per chiamare continuamente le funzioni del display a 4 cifre e 7 segmenti e dei LED.