Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci Raspberry Pi, Arduino e ESP32 con altri appassionati.

Perché unirti a noi?

  • Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci dei nuovi prodotti e anteprime esclusive.

  • Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e Giveaway: Partecipa a concorsi e promozioni durante le festività.

👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!

Mostra Numero

In questo progetto, usiamo Processing per pilotare un display a 7 segmenti e mostrare cifre da 0 a 9 e lettere da A a F.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

È sicuramente comodo acquistare un intero kit, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link seguenti.

INTRODUZIONE AI COMPONENTI

LINK DI ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Display a 7 segmenti

ACQUISTA

74HC595

ACQUISTA

Schema di collegamento

../_images/image1251.png

Sketch

import processing.io.*;

int SDI=17;   //ingresso dati seriali
int RCLK=18;  //ingresso clock di memoria (STCP)
int SRCLK =27;   //ingresso clock del registro a scorrimento (SHCP)


int[] SegCode= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void hc595_shift(int dat){
  int i;

  for(i=0;i<8;i++){
        int n=(0x80 & (dat << i));
        if ( n==0){
          GPIO.digitalWrite(SDI, 0);
        } else {
          GPIO.digitalWrite(SDI, 1);
        }
        GPIO.digitalWrite(SRCLK, 1);
        delay(1);
        GPIO.digitalWrite(SRCLK, 0);
  }

        GPIO.digitalWrite(RCLK, 1);
        delay(1);
        GPIO.digitalWrite(RCLK, 0);
}

void setup() {
        size(400, 200);
        frameRate(10);

        GPIO.pinMode(SDI, GPIO.OUTPUT);
        GPIO.pinMode(RCLK, GPIO.OUTPUT);
        GPIO.pinMode(SRCLK, GPIO.OUTPUT);

        GPIO.digitalWrite(SDI, 0);
        GPIO.digitalWrite(RCLK, 0);
        GPIO.digitalWrite(SRCLK, 0);

        fill(0,25,88);
        textAlign(CENTER,CENTER);
        textSize(height*0.8);
}

void draw() {

        background(255);
        int number = (frameCount%100)/10;
        text(number, width/2, height/2);
        hc595_shift(SegCode[number]);
}

Come funziona?

Importa processing.io.* e utilizza la libreria di funzioni GPIO per controllare i pin del display digitale.

Definisci l’array SegCode = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}, che rappresenta un array di codici segmenti da 0 a F in esadecimale (Catodo comune).

La funzione setup() imposta i tre pin SDI, RCLK e SRCLK come output e inizializza i dati a 0.

La funzione hc595_shift(int dat) viene utilizzata per trasferire i SegCode al 74HC595.

void hc595_shift(int dat){
  int i;

  for(i=0;i<8;i++){
        int n=(0x80 & (dat << i));
        if ( n==0){
          GPIO.digitalWrite(SDI, 0);
        } else {
          GPIO.digitalWrite(SDI, 1);
        }
        GPIO.digitalWrite(SRCLK, 1);
        delay(1);
        GPIO.digitalWrite(SRCLK, 0);
  }

        GPIO.digitalWrite(RCLK, 1);
        delay(1);
        GPIO.digitalWrite(RCLK, 0);
}

n=(0x80 & (dat << i)) significa spostare i dati a sinistra di i bit e poi eseguire l’operazione & con 0x80.

La regola dell’operazione & è che quando entrambi i lati di & sono 1, il risultato è 1, altrimenti è 0.

Ad esempio, supponiamo dat=0x3f,i=2(0011 1111 << 2 si sposta a 1111 1100), quindi 1111 1100 & 1000 0000 (0x80)) = 1000 0000.

Infine, assegna i dati al pin SDI (DS) bit per bit.

digitalWrite(SRCLK, 1) quando SRCLK genera un impulso di salita da 0 a 1, i dati vengono trasferiti dal registro DS al registro a scorrimento;

digitalWrite(RCLK, 1) quando RCLK genera un impulso di salita da 0 a 1, i dati vengono trasferiti dal registro a scorrimento al registro di memoria.

fill(0,25,88);
textAlign(CENTER,CENTER);
textSize(height*0.8);

La funzione fill() usata in setup() riempie il colore del testo, textAlign(CENTER,CENTER) è utilizzata per centrare il testo, textSize(height*0.8) cambia l’altezza del testo al 80% dell’altezza originale. Queste funzioni permettono di personalizzare lo stile del testo visualizzato in Processing.

void draw() {

        background(255);
        int number = (frameCount%100)/10;
        text(number, width/2, height/2);
        hc595_shift(SegCode[number]);
}

Il frameCount è un contatore, correlato a frameRate. Di default, frameRate è 60, il che significa che frameCount si accumulerà 60 volte al secondo.

In questo modo, possiamo far visualizzare a Processing e al display a 7 segmenti cifre da 0 a 9 e lettere da A a F contemporaneamente.