Problema Display a 7 segmenti con libreria LedControl.h

Salve a tutti, ammetto di essere un novellino. Ho acquistato un display a 7 segmenti, quando lo provai ad usarlo mi accorsi che questo aveva 5 PIN e precisamente:

-VCC -SCLK -RCLK -DIO -GND

Dopo svariate ricerche, ho letto che si consigliava di utilizzare la libreria LedControl.h, tutto va benissimo fin quando compilo ed eseguo l'esempio, ma non riesco completamente a far stampare qualcosa di diverso. Nel senso che io dovrei implementare due contatori, ma non riesco poichè stampa sempre dei caratteri strani a mio avviso senza nessuna logica. Ho provato sia la setChar() che la setDigit() senza avere dei buoni risultati. Grazie in anticipo :)

Prima di tutto, nella sezione i*n lingua Inglese* si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione, poi, essendo questo il tuo primo post, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

Puoi postare un link o una foto del tuo modulo?

|500x500

Quindi l’esempio funziona ? sono le tue modifiche che poi non vanno ? Se si, posta il tuo sketch modificato.

Ti ringrazio in anticipo per l’aiuto. Sinceramente ho abbandonato l’idea di usare la libreria ledControl, poichè ho trovato uno script che usava shiftout() e bitWrite()…Lo script originale, contiene una funzione che riceve in ingresso una stringa e ne stampa il contenuto sul display. Come dicevo sopra io vorrei implementare dei contatori, magari due. Quindi essendo che non mi servono caratteri ho provato a riadattare il tutto, scrivendo questo codice:

int dataPin = 2;
int latchPin = 3;
int clockPin = 4;

const byte ARRAY_SIZE = 10;
byte segment_codes[ARRAY_SIZE];
int start=0;
 
  

void setup() {
  // put your setup code here, to run once:
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  segment_codes[0]=0b11000000;
  segment_codes[1]=0b11111001;
  segment_codes[2]=0b10100100;
  segment_codes[3]=0b10110000;
  segment_codes[4]=0b10011001;
  segment_codes[5]=0b10010010;
  segment_codes[6]=0b10000010;
  segment_codes[7]=0b11111000;
  segment_codes[8]=0b10000000;
  segment_codes[9]=0b10011000;
 
}

void loop() {
    

    byte bitToWrite = 0;
    byte code = 0b11111111;
    int i=0;
    
    for(i=0;i<9;i++){
      
        digitalWrite(latchPin, LOW);
        code = segment_codes[i];
        shiftOut(dataPin, clockPin, MSBFIRST, code);
        bitWrite(bitToWrite, 5, 1);
        shiftOut(dataPin, clockPin, LSBFIRST, bitToWrite);
        digitalWrite(latchPin, HIGH);
        code = segment_codes[i+1];
        shiftOut(dataPin, clockPin, MSBFIRST, code);
        bitWrite(bitToWrite, 6, 1);
        shiftOut(dataPin, clockPin, LSBFIRST, bitToWrite);
        digitalWrite(latchPin, HIGH);

        delay(1000);
    }

     
}

Teoricamente sul secondo display(setto 5 il secondo parametro della prima funzione bitWrite() inserita) stampo i, e sul terzo display stampo i+1. Il risultato è che su entrambi mi ritrovo i+1.
Sai darmi qualche suggerimento a riguardo?mi conviene tornare alle soluzioni della libreria ledControl?

Non saprei. Posta lo script originale. shiftout() io l'ho provata solo con 2 74HC595 in cascata ma con 16 led. Quel display ha dietro 2 74HC595 in cascata, non sò esattamente come pilotarlo con shiftout() anche perchè non so come un chip con 8 bit possa pilotare 2 cifre (2*7 segmenti più punto=2*8=16 segmenti). Forse uno dei chip controllo i 4 pin che dicono quale cifra "gestire" e l'altro chip gestisce i segmenti di una singola cifra.

Ripeto la domanda. Con la libreria LedControl funziona ? A me pare che la libreria sia per i chip MAX7221 e MAX7219 http://playground.arduino.cc/Main/LedControl

Ecco l’originale

int dataPin = 2;
int latchPin = 3;
int clockPin = 4;
const byte ARRAY_SIZE = 27;
byte segment_codes[ARRAY_SIZE];
String available_chars[ARRAY_SIZE];

void show(String value){
  int skip = 0;
  for(int i=0; i<value.length(); i++) {
    if(!((String)value[i]).equals(".")) {
      int indexOfCharToWrite = findIndexOfChar((String)value[i]);
      if(indexOfCharToWrite > -1){
        byte bitToWrite = 0;
        digitalWrite(latchPin, LOW);
        byte code = segment_codes[indexOfCharToWrite];
        boolean skipNext = false;
        if(((String)value[i+1]).equals(".")) {
          bitWrite(code, 7, 0);
          skipNext = true;
        }
        shiftOut(dataPin, clockPin, MSBFIRST, code);
        bitWrite(bitToWrite, i-skip, 1);
        shiftOut(dataPin, clockPin, LSBFIRST, bitToWrite);
        digitalWrite(latchPin, HIGH);
        if(skipNext){
          skip++;
        } 
      }
    }
  }
}

int findIndexOfChar(String character){
  int wantedpos = -1;
  for(int i=0; i< ARRAY_SIZE; i++){
    if(character.equals(available_chars[i])){
      wantedpos = i;
      break;
    }
  }
  return wantedpos;
}

void setup() {
  available_chars[0] = "0";
  available_chars[1] = "1";
  available_chars[2] = "2";
  available_chars[3] = "3";
  available_chars[4] = "4";
  available_chars[5] = "5";
  available_chars[6] = "6";
  available_chars[7] = "7";
  available_chars[8] = "8";
  available_chars[9] = "9";
  available_chars[10] = "A";
  available_chars[11] = "b";
  available_chars[12] = "D";
  available_chars[13] = "c";
  available_chars[14] = "d";
  available_chars[15] = "E";
  available_chars[16] = "F";
  available_chars[17] = "H";
  available_chars[18] = "h";
  available_chars[19] = "L";
  available_chars[20] = "n";
  available_chars[21] = "I";
  available_chars[22] = "O";
  available_chars[23] = "o";
  available_chars[24] = "P";
  available_chars[25] = "S";
  available_chars[26] = " ";

  segment_codes[0]=0b11000000;
  segment_codes[1]=0b11111001;
  segment_codes[2]=0b10100100;
  segment_codes[3]=0b10110000;
  segment_codes[4]=0b10011001;
  segment_codes[5]=0b10010010;
  segment_codes[6]=0b10000011;
  segment_codes[7]=0b11111000;
  segment_codes[8]=0b10000000;
  segment_codes[9]=0b10011000;
  segment_codes[10]=0b10001000;
  segment_codes[11]=0b10000011;
  segment_codes[12]=0b11000110;
  segment_codes[13]=0b10100111;
  segment_codes[14]=0b10100001;
  segment_codes[15]=0b10000110;
  segment_codes[16]=0b10001110;
  segment_codes[17]=0b10001001;
  segment_codes[18]=0b10001011;
  segment_codes[19]=0b11000111;
  segment_codes[20]=0b10101011;
  segment_codes[21]=0b11111001;
  segment_codes[22]=0b11000000;
  segment_codes[23]=0b10100011;
  segment_codes[24]=0b10001100;
  segment_codes[25]=0b10010010;
  segment_codes[26]=0b11111111;


  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  show("    5P.IO");
}

Come hai collegato SCLK, RCLK e DIO rispetto ai pin ? int dataPin = 2; int latchPin = 3; int clockPin = 4;

Credo che, come dice nid, la prima cosa da fare sia capire che chip c'è su sta scheda: 74HC595 o MAX7219? Dal pinout direi il secondo, quindi dovrebbe funzionare con LedControl. Poi non ho ancora capito se gli esempi della libreria funzionano o meno. In tal caso ovviamente la "colpa" è delle tue modifiche.

Allora ho collegato:

-SCLK -> 4

-RCLK -> 3

-DIO -> 2

Penso siano corretti perchè lo script originale funziona bene!!!

PS Ci sono 2 74HC595

E allora non può funzionare con LedControl, lasciala perdere. Devi capire come sono collegati e pilotarli di conseguenza, non so se esista una libreria già fatta.

Azzardo che il primo 595 potrebbe accendere i singoli segmenti e il secondo gestire il multiplexing (o viceversa), ma boh? Documentazione sul modulo ne hai?

EDIT: Ho trovato qualcosa qua: http://forum.43oh.com/topic/8596-4-digit-display-from-qifei/

due 595

sostanzialmente è questo

Si quel codice funziona. Ho quel modulino. Io trovai un altro codice ma diverso da quello.

Bestiale che nella prova, metti show(" 12.34"); e ancora va bene, togli gli spazi e... non display nulla !! show("12.34"); Quindi quel codice si aspetta 8 lettere, forse pensato per un modulo simile ma a 8 cifre

Inoltre ho provato questo loop()

void loop() {

     show("    9999");
     delay(1000);
     show("    1111");
     delay(1000);
  

}

E non va, stampa solo l'ultima cifra, e lascia vuote le 3 precedenti

Ora ho provato a togliere le lettere e fare la show passandogli una cifra intera (no virgole!! ) (Ho cambiato i pin da me) La variabile i tiene conto di quante cifre sono da stampare, ma ... ho dovuto fare 7-i !! Boh Poi, fa conteggio 0->9999 fino a che ci sono 3 cifre non blinka, quando 4 cifre... blinka da far paura.

const byte dataPin  = 8;    // DIO
const byte latchPin = 9;    // RCLK
const byte clockPin = 10;   // SCLK
const byte ARRAY_SIZE = 27;
byte segment_codes[ARRAY_SIZE];
int x=0;

void show(int value)
{ int skip=0,i=0,cifra;
 while (value != 0)
 { cifra = value % 10;
   value = value / 10;
   Serial.print(i);
   Serial.print(" ");
   Serial.print(cifra);
   Serial.print(" ");
   Serial.print(value);
   Serial.println(" ");
   byte bitToWrite = 0;
   digitalWrite(latchPin, LOW);
   byte code = segment_codes[cifra];
   boolean skipNext = false;
   shiftOut(dataPin, clockPin, MSBFIRST, code);
   bitWrite(bitToWrite, 7-i - skip, 1);
   shiftOut(dataPin, clockPin, LSBFIRST, bitToWrite);
   digitalWrite(latchPin, HIGH); 
   i++;
 }
}

void setup() {
 Serial.begin(9600);
 Serial.println("setup");
 segment_codes[0] = 0b11000000;
 segment_codes[1] = 0b11111001;
 segment_codes[2] = 0b10100100;
 segment_codes[3] = 0b10110000;
 segment_codes[4] = 0b10011001;
 segment_codes[5] = 0b10010010;
 segment_codes[6] = 0b10000011;
 segment_codes[7] = 0b11111000;
 segment_codes[8] = 0b10000000;
 segment_codes[9] = 0b10011000;

 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
}

void loop() {
 show(x);
 x++;
 if(x>9999) x=0;
}

Se necessiti 2 conteggi da 0-99 allora usa questa show() passandogli C1*100+C2, cosi se hai C1=12 e C2=34 avrai come risultato 12*100+34=1200+34=1234

Questo il codice che avevo trovato e che ho modificato per fare un conteggio. Funziona ma stranamente la prima cifra è molto brillante , le altre tre no. Nel codice si parla di codifica BCD per i caratteri

unsigned char LED_BCD[16] ={
  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; //common anode digital tube BCD code

//Define the pin
const byte K_PIN_DAT =8; 
const byte K_PIN_RCK =9;
const byte K_PIN_SCK =10;

int num=0;

void setup() 
{ delay(1000);
  Serial.begin(9600);
  Serial.println("setup");
  pinMode(K_PIN_DAT, OUTPUT); //initial data 
  pinMode(K_PIN_RCK, OUTPUT); //initial rck
  pinMode(K_PIN_SCK, OUTPUT); //initial sck
}

void loop() 
{ unsigned char dopp =0;
  int cifra;
  num++;
  if(num>9999) num=0;
  Serial.println(num);
  cifra=num;
  for(  char i=0; i <=3; i++)
  { LED_display(i,cifra%10,dopp); //Nixie Tube display
    cifra=cifra/10;
  }
  delay(20);
}

void LED_display(char LED_number,unsigned char LED_display,unsigned char LED_dp)
{ unsigned int hc_disp = 0,hc_ledcode,hc_ledcode_temp=0;
  if(LED_display > 15) LED_display = 0;
  hc_ledcode = LED_BCD[LED_display] ; //get BCD code
  for(unsigned char i=0; i < 8;++i)
  { hc_ledcode_temp <<=1;
    if(hc_ledcode&0x01) hc_ledcode_temp |= 0x01;
    hc_ledcode >>=1;
  }
  if(LED_dp) hc_ledcode_temp &= 0xfe; 
  hc_disp = hc_ledcode_temp;
  switch(LED_number)
  { case 0: 
      hc_disp |= 0x8000;
      break;
    case 1: 
      hc_disp |= 0x4000;
      break;
    case 2: 
      hc_disp |= 0x2000;
      break;
    case 3: 
      hc_disp |= 0x1000;
      break;
  }
  write_74HC595_ShiftOUTPUT(hc_disp,LED_number); //74HC595 shifting register data transfer
}

//shift output to 74HC595
void write_74HC595_ShiftOUTPUT( unsigned int data_a, int LED_number) //communication with 74HC595
{ char look =0;
  digitalWrite(K_PIN_RCK, LOW);  //latch open
  digitalWrite(K_PIN_SCK, LOW); 
  for (;look < 16; ++look)
  { if(data_a&0x0001) 
    { digitalWrite(K_PIN_DAT, HIGH);
    }
    else 
    { digitalWrite(K_PIN_DAT, LOW);
    }
    digitalWrite(K_PIN_SCK, HIGH);
    digitalWrite(K_PIN_SCK, LOW); 
    data_a >>= 1;
  }
  //if(LED_number==3) 
  digitalWrite(K_PIN_RCK, HIGH);
}

Ora ricordo perchè lo avevo rimesso nel cassetto. Non riuscivo a pilotarlo decentemente :grin: Cavolatina di modulo accattato dai cinesi a 1.17 euro.

Forse è meglio questo a 4 fili, che monta un TM1637 4-Tubo-Bits-Digital-Display-a-LED