Comando Display con 5 ingressi digitali

Ciao a tutti.
Sono un novizio di Arduino e sto cercando di usarlo per pilotare un display 7 segmenti a 2 digit.
Sto usando la libreria sevseg con Arduino NANO e sono riuscito a far girare alcuni esempi di pilotaggio
con Multiplexing di un display a catodo comune utilizzando 8 uscite per i segmenti e 2 per il comando dei comuni.
Devo visualizzare sul display il numero intero che corrisponde al binario che mi arriva dai 5 ingressi digitali (da 0 a 31).
Non sono riuscito a trovare il sistema giusto per farlo.

Qualcuno riesce a darmi una mano?

Il display dal punto di vista Hardware funziona perfettamente.

Grazie

Buongiorno, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Ciao, Boris
Se usi i bit da 0 a 4 di una porta, il sistema più semplice è leggere la porta e usare una maschera per avere solo i 5 bit che ti interessano. Per la porta B (I/O 8..12), ad esempio:

byte val = PINB & 0b00011111;

    Per farlo con le classiche istruzioni di Arduino, invece:

byte val = digitalRead(8) + 2*digitalRead(9) + 4*digitalRead(10) + 8*digitalRead(11) + 16*digitalRead(12);

    Poi, per dividere le due cifre:

byte decine = val/10;
byte unita = val%10;

Non sapevo che anche Arduino avesse le porte come i PLC.
Io ho collegato i 5 ingressi sui pin A0(D14), A1(D15), A2(D16), A3(D17), A4(D18) di Arduino NANO Rev. 3.

Ho impegnato i primi 10 I/O digitali per pilotare il display in multiplexing tramite la libreria.

Se io impongo un numero fisso viene visualizzato correttamente sul display.

Non è che questi I/O "Multipli" devono essere usati in modo diverso?

Quella è la porta C, quindi: byte val = PINC & 0b00011111;

Ho usato la formula suggerita.
Il numero viene visualizzato correttamente ma c'è un ritardo (qualche secondo)
quando passo da un numero più alto ad un numero più basso.

Questo è il mio codice:

int marcia;

#include "SevSeg.h"
SevSeg sevseg; 

void setup(){

pinMode(14, INPUT);//Imposto il PIN 14 in modalità INPUT
pinMode(15, INPUT);//Imposto il PIN 15 in modalità INPUT
pinMode(16, INPUT);//Imposto il PIN 16 in modalità INPUT
pinMode(17, INPUT);//Imposto il PIN 17 in modalità INPUT
pinMode(18, INPUT);//Imposto il PIN 18 in modalità INPUT
  byte numDigits = 2;
  byte digitPins[] = {3, 2};
  byte segmentPins[] = {4, 5, 6, 7, 8, 9, 10};
  bool resistorsOnSegments = true; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_CATHODE; // See README.md for options
  bool updateWithDelays = false; // Default. Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros

      sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
  sevseg.setBrightness(100);
}

void loop(){

   marcia = digitalRead(14) + 2*digitalRead(15) + 4*digitalRead(16) + 8*digitalRead(17) + 16*digitalRead(18);
                
      sevseg.setNumber(marcia);
      
      sevseg.refreshDisplay(); 
      }

>boranga: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Non ho idea di che cosa avvenga all'interno della libreria... Potresti anche fare un bell'esercizio scrivendo tu la funzione multiplex :slight_smile:
Mettendo i CODE puoi anche togliere qualche spazio inutile.

io ho invece idea di cosa faccia quella libreria, se ne era parlato qui intorno a dicembre, mi sembra
però:

  1. aspetto che lo OP metta a posto il codice

  2. poi ne parliamo

Boris, metti i CODE!

Ho messo a posto il codice.
Scusate ma sono nuovo al forum e poco avvezzo ai Forum in generale.
Sono stato un pò assente dal progetto e l'ho ripreso stamattina.
Con questo codice, quando cambio numero ho un ritardo di parecchi secondi se passo da un numero più alto ad uno più basso.
Mentre la risposta è immediata quando passo ad un numero più alto.

Ho fatto una prova caricando il codice su un Arduino MEGA e utilizzando degli ingressi digitali veri (pin 22,24,26,28,30) con un display a due digit ad ANODO COMUNE (avevo quello già collegato sul MEGA).

In questo modo funziona tutto regolarmente, quindi penso che il problema siano gli ingressi (pin 14,15,16,17,18) multipourpose del NANO.

Pensate sia così?

Confermo quanto già postato.
Utilizzando D11, D12, D13 sul NANO tutto funziona a dovere.
Sono D14(A0) e D15(A1) che non funzionano ancora.

Che circuito di de-bounce hai usato?

C'è qualche condensatore che non si scarica subito

Hai impostato la frequenza di clock giusta?

Secondo me il problema è legato alle differenti impedenza d'ingresso dei pin
Quindi debounce...

Standardoil:
Che circuito di de-bounce hai usato?

C'è qualche condensatore che non si scarica subito

Nessun circuito di de-bounce.
Credi che su quegli ingressi sia necessario?

Al momento ho fatto solo prove sulla bredboard mettendo in ingresso i 5V diretti con dei ponticelli.

Ma lo scherzo lo fa solo su quel tipo di ingressi la.