Come si usa la libreria 74HC595

sia per il primo che per il secondo tag che corrispondono ai nomi vanno in Stato=2
per il terzo, " Easy" mette stato=1

Grazie

Description

break is used to exit from a for, while or do…​while loop, bypassing the normal loop condition. It is also used to exit from a switch case statement.

quindi dopo stato=1
devi aggiungere un break
per uscire dal for senza ulteriori confronti

Beh......che dire.......il sapere rende liberi!!!!!!
Sei davvero bravo.!!!!

ti ringrazio davvero tanto.

Buonasera, sono di nuovo qui con un altro quesito.......
vi allego il solito file.
La domanda: siccome vorrei usare come sempre la libreria hc595.h che è dentro alla <Ss_McMajan_Config.h> , vorrei capire come poter scrivere sull'Lcd il codice della tessera che passa .
Nel senso : se io passo una tessera dell'array oppure no l'Lcd mi dovrebbere scrivere il suo codice.
Ho provato un sacco di modi a scrivere dati nella" My595.DisplayWrite", ma tra errori di Char ,Byte ecc non ne esco perchè non capisco cosa scriverci per poter arrivare al risultato.

Come sempre grazie

lcd_con_led_3_fili_rfid_ARRAY.ino (8.64 KB)

con questa istruzione scrivi un char per volta
quindi con un ciclo for di n char scrivi quello che ti serve (spostando di volta in volta il cursore avanti di 1)

DisplayChar(char,sr)
Scrive un carattere sul display nella posizione del cursore.
char rappresenta il carattere e sr il numero dello shift register.
esempio
My595.DisplayChar(‘A’,1)

nel caso ti allego un pdf (tradotto in italiano) con l'elenco delle funzioni della McMajan per HC595

Libreria McMajan.pdf (45.9 KB)

ok fin qui tutto ok.
Solo che se per esempio:

#include <Ss_McMajan_Config.h> 
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.
char st[20];
hc595 My595(6, 5, 4, 1); // latch,clock,data,number of 74hc595

char* aNomi[]={"Ettore", "Jussi", "Easy"};
unsigned long aRfid[]= {0xCD4B4479,0x3BC74379,0xD91390C9};

unsigned long readTag=0;

void setup() {
 My595.SendLcdCommand(LCD595_DISPLAY_CLEAR, 0);
  My595.DisplayReset(LCD595_BASIC_DISPLAY_INIT | LCD595_MORELINES , 0);
  My595.SetBackLight(2, HIGH, 0);
 Serial.begin(9600); // Setta la seriale
  SPI.begin();    // Setta  SPI bus
  mfrc522.PCD_Init(); // Setta MFRC522
}

void loop() {
   if ( ! mfrc522.PICC_IsNewCardPresent())   // Look for new cards     
  { return;
  }
                
  if ( ! mfrc522.PICC_ReadCardSerial())    // Select one of the cards
  { return;
  }
readTag = 0;   // azzero il contenuto del tag
         for (byte i = 0; i < mfrc522.uid.size; i++)  { 
         (readTag =readTag << 8 |mfrc522.uid.uidByte[i]); 
      
   My595.SetCursor(0, 0, 2, 0); 
       My595.DisplayWrite(" Ola ", 0);
       My595.DisplayChar(readTag, 0);delay (1000);
   
         }
   
   
   /* for (byte x=0; x<=2;x++) {    // 2 perchè ci sono solo 3 tessere quindi n-1
    if (readTag == aRfid[x]) {
      My595.SendLcdCommand(LCD595_DISPLAY_CLEAR, 0);
       My595.SetCursor(0, 0, 2, 0); 
       My595.DisplayWrite(" Ola ", 0);
       My595.DisplayWrite(aNomi[x], 0);delay (1000);
        My595.SendLcdCommand(LCD595_DISPLAY_CLEAR, 0);
       My595.SetCursor(0, 0, 2, 0); 
       My595.DisplayWrite(" cod ", 0);
       My595.DisplayChar(readTag, 0);

    }}*/


       
}

ho scritto questa, ma sul display mi appare una lettera e basta.
non ti chiedo di darmi la soluzione, ma un indirizzo per capire, la differenza tra My595.DisplayWrite
e My595.DisplayChar

grazie

no, così non funziona

My595.DisplayWrite(" cod ", 0);
My595.DisplayChar(readTag, 0)

al limite prova (che è più semplice)

My595.DisplayWrite(" cod ", 0);
My595.DisplayWrite(String(readTag), 0)

no, mi da questo errore: exit status 1
no matching function for call to 'hc595::DisplayWrite(String, int)'

My595.SetCursor(0, 0, 2, 0);
 My595.DisplayWrite(" Ola ", 0);
for (int x=0;x<4;x++){
   unsigned long tmp=(readTag>>(24 - 8*x) & 0xff;
   My595.DisplayChar(tmp, 0);
}
delay (1000);

prova un po così :slight_smile:

e se non va prova così

String tmp= String(readTag,HEX);
My595.DisplayWrite(" cod ", 0);
 My595.DisplayWrite(tmp, 0);

allora con la seconda soluzione mi da :
exit status 1
no matching function for call to 'hc595::DisplayWrite(String&, int)'

e con la prima soluzione mi appare solo una lettera tipo: j...k.....y

:smiley: è un sacco che non la uso ... prova così

String tmp= String(readTag,HEX);
My595.DisplayWrite(" cod ", 0);
 My595.DisplayWrite(*tmp, 0);

mi restituisce: exit status 1
no match for 'operator*' (operand type is 'String')

proverò a mettere in pista qualcosa e fare un po di prove.... di più per il momento non so dirti...

ok grazie, non capisco come mai non funziona come la lcd o la serial.print....

grazie ancora

non funziona come la lcd perchè c'è di mezzo il 595 e chi ha scritto la libreria l'ha fatto in un certo modo
comunque (questo funziona :slight_smile: )

  //readTag = 0xCD4B4479//

  char myBuf[5];             // crei due var temporanee
  char myBuf1[5];

   sprintf(myBuf, "%x", readTag);              // inserisco in myBuff ultimi 4 numeri in HEX (4479)
   unsigned int test = readTag >> 16;        // scifto di 16 posizioni (trovo i primi 4 caratteri)
   sprintf(myBuf1, "%x", test);                  // inserisco in myBuf1 primi 4 numeri in HEX (cd4b)
   My595.DisplayClean(0);                       
   My595.SetCursor(0, 1, 1, 0);                 
 
   My595.DisplayWrite(myBuf1, 0);            //scrivo nel display prima myBuf1 seguito da myBuff 
   My595.DisplayWrite(myBuf, 0); 
   My595.Send595();

Buonasera a tutti, vi rispondo dopo molto tempo,perchè nel frattempo mi sono successe un po di cose di salute.
vi scrivo perchè volevo ringraziarvi della pazienza e dei consigli.
Grazie Grazie Grazie.....siete grandi...