Nota

Ciao, benvenuto nella Community di Facebook dedicata agli appassionati di SunFounder Raspberry Pi, Arduino e ESP32! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirsi a noi?

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

  • Impara e Condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.

  • Sconti Speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni Festive e Giveaway: Partecipa a concorsi e promozioni speciali.

👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti subito!

Mostrare un Numero

In questa lezione, utilizziamo Processing per controllare un display a 7 segmenti e mostrare i numeri da 0 a 9 e da A a F.

Collegamenti

../_images/image1251.png

Codice

import processing.io.*;

int SDI=17;   // ingresso dati seriale
int RCLK=18;  // ingresso orologio memoria (STCP)
int SRCLK=27; // ingresso orologio registro di 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 GPIO per controllare i pin del display a 7 segmenti.

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 i dati iniziali a 0.

La funzione hc595_shift(int dat) viene utilizzata per inviare il codice dei segmenti 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 il risultato è 1 solo quando entrambi i lati sono 1, altrimenti è 0.

Ad esempio, assumendo dat=0x3f e i=2 (0011 1111 << 2 diventa 1111 1100), allora 1111 1100 & 1000 0000 (0x80) = 1000 0000.

Infine, i dati vengono assegnati a SDI(DS) bit per bit.

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

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

fill(0,25,88);
textAlign(CENTER,CENTER);
textSize(height*0.8);
  • fill(): Imposta il colore utilizzato per riempire le forme.

  • textAlign(CENTER,CENTER): Imposta l’allineamento corrente per disegnare il testo. I parametri LEFT, CENTER e RIGHT definiscono le caratteristiche di visualizzazione delle lettere rispetto ai valori dei parametri x e y della funzione text().

  • textSize(): Imposta la dimensione corrente del font. Questa dimensione verrà utilizzata in tutte le chiamate successive alla funzione text(). La dimensione del font è misurata in pixel.

Queste funzioni personalizzano lo stile del testo visualizzato su Processing.

void draw() {

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

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

Così possiamo far sì che Processing e il display a 7 segmenti mostrino contemporaneamente i numeri da 0 a 9 e da A a F.

Per ulteriori informazioni, consulta Processing Reference.