Come si usa la libreria 74HC595

mi sono accorto anche di un'altra cosa,

  1. allarme inserito ( led rosso acceso)
  2. faccio leggere la carta ( si spegne il rosso, si accende e poi si spegne il giallo, riaccende il rosso spegne l'allarme e poi spegne il rosso)

quello che non capisco è come mai non resti in memoria lo stato dei led mentre ne accende o spegne altri.

Scusa se mi ripeto, ma con la semplice digitalWrite(pin,stato), se dico a un pin di mettersi a HIGH, qualsiasi cosa succeda finchè non gli dico di andare a LOW lui resta a HIGH.

cosa che vorrei capire di come fare anche con un 74hc595....

:confused: :confused: :confused:

dunque...appena compilo il programma lui accende sia il led rosso che quello giallo.
poi va a all_ins() e spegne solo il giallo, lasciando il rosso acceso

allora forse ci sono :slight_smile: senza forse è così

cambia così

statoLed= statoLed | ledRosso | ledGiallo;
My595.Send595Pin(statoLed, 1);

in tutti i posti dove c'è la send595pin aggiungi la riga statoLed=statoLed or o xor led da accendere/spegnere

altrimenti la variabile statoLed non viene mai modificata e rimane sempre =0, così al contrario varia con i valori

Sei un grandeeeee.......fungeeeee
grazie grazie.

Adesso però ti do un'altro problemino da cui non esco.

sensorValue = analogRead(sensor); // imposta il sensore                  //se il sensore di luminosità dice che c'è buio e
      if (sensorValue < 100 && count == 0)                                     // l'allarme è disinserito 
      { My595.Send595Pin(statoLed | ledBianco, 1);delay(2000); //led Bianco ON  // accendo il led bianco.....

ovvero, al primo passaggio di una tessera se c'è poca luce all'esterno lui mi accende il led bianco, ma ad un ulteriore passaggio di un'altra tessera, se il sensore legge tanta luce all'esterno il led bianco si spegne.

questo l'ho fatto perchè se sono il primo che arriva e ho poca luce all'esterno, oltre che spegnere l'allarme e aprire la porta mi accende una luce neon all'interno.
Solo che vorrei che se il primo ha acceso la luce interna perchè c'era poca luce all'esterno, anche se i prossimi hanno tanta luce all'esterno lascino il neon acceso.

lo so lo so ......sono un pò matto, ma ho dei motivi per dover effettuare questa procedura.

comunque grazie del tuo tempo e della tua disponibilità
se mi dai una dritta te ne sarei grato a vita :slight_smile: :slight_smile: :slight_smile:

ti crei una nuova variabile di tipo bool che dichiarerai come verae diventa vera dopo aver acceso la luce bianca e per accenderla fai il controllo se la var. è vera o falsa
Ovviamente da qualche altra parte del programma dovrai ad un certo punto della giornata riportarla alla condizione true per il giorno successivo
Oppure accendi la luce bianca a tempo, il giusto che serve all'entrata e poi la spegni

// dichiaraz assieme alle altre variabili
bool primoAccesso= true;
...
...
...
sensorValue = analogRead(sensor); // imposta il sensore        //se il sensore di luminosità dice che c'è buio e
      if (sensorValue < 100 && count == 0)  {                          // l'allarme è disinserito
         if (primoAccesso)  {

              statoLed=statoLed | ledBianco;                //questa istruz devi metterla dappertutto!!!!!
              My595.Send595Pin(statoLed , 1);            // accendo il led bianco.....
              delay(2000);                                           // tempo suff per entrare 

              statoLed=statoLed ^ ledBianco;   
              My595.Send595Pin(statoLed , 1);            // spengo led bianco
              primoAccesso = false;                             //metto a falso primoAccesso
          }                                                               
      }

Grazie Patrick_m sei davvero bravo e disponibile.
Giusto per imparare un po di più, secondo te, c'è un altro modo per memorizzare il codice delle varie carte rfid e poi abbinarle ai nomi?

grazie ancora

non so se ho capito cosa vuoi dire ma penso che così vada bene:
all'inizio del codice dichiari i vari define
e poi nei vari controlli usi i nomi

#define EASY "D9 13 90 C9"
#define Ettore "CD 4B 44 79"
....
....
if (conteudo.substring(1) == Ettore ) {
....
....
}

ok cosi' mi piace, ma come posso inserire nella riga dell'lcd il nome in base al codice?

grazie

ma esattamente come fai ora...

if (conteudo.substring(1) ==  Ettore )//UID 1 - Ettore
   {  My595.SendLcdCommand(LCD595_DISPLAY_CLEAR,0);
      My595.SetCursor(0,0,2,0);My595.DisplayWrite(" Ola Ettore !",0);
      Stato = 1;
   }

hahahah no, non funziona più, ti scrive i codici :slight_smile: :slight_smile:
l'unica è cambiare così

#define xEASY "D9 13 90 C9"
#define xEttore "CD 4B 44 79"
....
....
if (conteudo.substring(1) == xEttore ) {
   {  My595.SendLcdCommand(LCD595_DISPLAY_CLEAR,0);
      My595.SetCursor(0,0,2,0);My595.DisplayWrite(" Ola Ettore !",0);
      Stato = 1;
}

Scusa ma ho avuto dei problemi.....
allora io vorrei risolvere questo problema:
ho ,ammettiamo, 3 tag rfid dei quali so i codici, e vorrei associare ad ogni tag un nome.
Solo che invece di aggiungere tante righe per la stampa su lcd, ne vorrei mettere solo una nella quale di volta in volta scrivo il nome associato al codice rfid letto dal sensore.

non credo sia semplice, ma è appunto per imparare ed eliminare un po di righe di programma

grazie

be è semplice, ti crei una funzione tipo void stampa(String nome)
nella quale metti le righe di stampa esempio

tutte le righe che servono per posizionare il cursore etc...
My595.DisplayWrite("ciao",0);
My595.DisplayWrite( nome, 0)

poi nel programma principale
if (conteudo.substring(1) == "CD 4B 44 79" )
chiamerai la funzione stampa con l'argomento Ettore
stampa(Ettore);

ti e mi voglio complicare il tutto.....
non si potrebbe ragionare su due array, uno con i codici e uno con i nomi, si assegna ogni codice ad un nome e
poi quando passo un tag lo confronta con l'array dei codici e in base all'assegnazione dei nomi, mette nel" My595.DisplayWrite( nome, 0), il nome assegnato.

Cavolo so che è complicato, ma cosi' capisco anche gli array, che ho già visto, ma non capisco come gestirli.....

grazie

certo che si può, a parità di indice nel primo array i nomi e nel secondo i codici
identifichi l'iesimo indice che equivale al codice che cerchi e stampi l'iesimo indice dell'array nomi

Ha Ha Ha,, mi viene da ridere........ok studio.....

grazie

Buongiorno,vorrei chiederti se sai dove posso reperire spiegazioni ed esempi, sto cercando in giro, ma non riesco a capire i concetti per poter mettere in opera la mia modifica.

Grazie

esempi e spiegazioni non so che dirti... più di un buon manuale di C....
per il tuo problema penso che non sia così complicato

definisci un array con i nomi
char* aNomi[]={"Ettore", "Jussi", "Easy"}

e uno con i codici
unsigned long aRfid[]= {CD4B4479, 3BC74379, D91390C9}

poi visto che la lettura del tag è in byte
metti i 4 byte in una variabile

unsigned long readTag=0

for (byte i = 0; i < mfrc522.uid.size; i++)  { 
    readTag =readTag << 8 |mfrc522.uid.uidByte[i] 
}

e poi controlli quale indice ha la tessera appena passata
for (byte x=0 to 2) {    // 2 perchè ci sono solo 3 tessere quindi n-1
    if readTag == aRfid[x] {
       My595.SetCursor(0, 0, 2, 0); 
       My595.DisplayWrite(" Ola ", 0);
       My595.DisplayWrite(aNomi[x], 0);
    }
}

... dovrebbe funzionare

Patrick_M:

unsigned long aRfid[]= {CD4B4479, 3BC74379, D91390C9}

Mmm ... magari un 0x davanti ai valori esadecimali ? :wink:

unsigned long aRfid[]= {0xCD4B4479, 0x3BC74379, 0xD91390C9}

Guglielmo

gpb01:
Mmm ... magari un 0x davanti ai valori esadecimali ? :wink:

unsigned long aRfid[]= {0xCD4B4479, 0x3BC74379, 0xD91390C9}

Guglielmo

ops... dimenticato :smiley:

Buongiorno, nel ringraziarvi per la disponibilità, vi chiedo come mai mi da questi errori:

Arduino:1.6.9 (Windows 7), Scheda:"Arduino/Genuino Uno"

C:\Users\USUL\Documents\Arduino\lcd_con_led_3_fili_rfid_ARRAY\lcd_con_led_3_fili_rfid_ARRAY.ino:31:41: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

char* aNomi[]={"Ettore", "Jussi", "Easy"};

^

C:\Users\USUL\Documents\Arduino\lcd_con_led_3_fili_rfid_ARRAY\lcd_con_led_3_fili_rfid_ARRAY.ino:31:41: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\USUL\Documents\Arduino\lcd_con_led_3_fili_rfid_ARRAY\lcd_con_led_3_fili_rfid_ARRAY.ino:31:41: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\USUL\Documents\Arduino\lcd_con_led_3_fili_rfid_ARRAY\lcd_con_led_3_fili_rfid_ARRAY.ino: In function 'void loop()':

lcd_con_led_3_fili_rfid_ARRAY:69: error: 'to' was not declared in this scope

for (byte x=0; to 2) { // 2 perchè ci sono solo 3 tessere quindi n-1

^

lcd_con_led_3_fili_rfid_ARRAY:69: error: expected ';' before numeric constant

for (byte x=0; to 2) { // 2 perchè ci sono solo 3 tessere quindi n-1

^

C:\Users\USUL\Documents\Arduino\lcd_con_led_3_fili_rfid_ARRAY\lcd_con_led_3_fili_rfid_ARRAY.ino:69:23: warning: for increment expression has no effect [-Wunused-value]

lcd_con_led_3_fili_rfid_ARRAY:70: error: expected '(' before 'readTag'

if readTag == aRfid[x] {

^

C:\Users\USUL\Documents\Arduino\lcd_con_led_3_fili_rfid_ARRAY\lcd_con_led_3_fili_rfid_ARRAY.ino:69:15: warning: unused variable 'x' [-Wunused-variable]

for (byte x=0; to 2) { // 2 perchè ci sono solo 3 tessere quindi n-1

^

exit status 1
'to' was not declared in this scope

Questo report potrebbe essere più ricco di informazioni con l'opzione
"Mostra un output dettagliato durante la compilazione"
abilitata in File -> Impostazioni

grazie

ciao

leggi bene questo errore:

lcd_con_led_3_fili_rfid_ARRAY:69: error: expected ';' before numeric constant

     for (byte x=0; to 2) {    // 2 perchè ci sono solo 3 tessere quindi n-1

                     ^

e confronta con quanto dice il reference riguardo al For

ciao
pippo72

bah... avevo fattoun copia incolla da qualche parte quindi può essere che si fossero errori :slight_smile:

for (byte x=0; to 2) {    // 2 perchè ci sono solo 3 tessere quindi n-1

questo for sicuramente non va scritto così!

ma  piuttosto

 for (byte x=0; x<=2;x++) {

e questa
     if readTag == aRfid [x]   {

va scritta
     if (readTag == aRfid[x] )   {

gli altri sono solo dei warning quindi non considerarli :slight_smile: