Come si usa la libreria 74HC595

Buongiorno a tutti, essendo un principiante e capendo poco la programmazione, sto cercando di capire come funziona la libreria HC595.
In particolare non riesco a capire come poter gestire un array per accendere e spegne dei led con comandi diretti.
Sto cercando di fare delle prove con My595.Send595Pin(128,1);. ok il led si accende ma che comando uso per spegnerlo? Lo so che potrei usare My595.Set595Pin(0,0,0,0,0,0,0,0,1); // Tutti Spenti
My595.Send595();, ma mi piacerebbe usare degli indici con nomi diretti" tipo led rosso, led verde"per accendeli e spegnerli.
Per farmi capire meglio: nella libreria arduino uso " digitalWrite(ledGiallo, HIGH); digitalWrite(ledGiallo, LOW);".
Vorrei capire come posso fare la stessa cosa ma usando la libreria HC595.

Grazie

>usul5761: REGOLAMENTO, punto 16.9 ... per questa volta ho separato io il tuo post dal thread dove lo avevi messo, per il futuro, cortesemnete presta più attenzione. Grazie.

Guglielmo

cerca fra le funzioni della libreria oltre a quella indicata da te c'è anche la funzione in cui passi un numero solo (non ricordo se in esadecimale o decimale esempio 255 (o 0xFF) tutti accesi e 0 (0x00) tutti spenti e così via

vedi anche qui:

https://playground.arduino.cc/Code/ShiftRegister595

Grazie per l'appunto "gpb01"

Grazie Patrik_M, ma da quello che capisco leggendo nella libreria se uso: My595.Send595Pin(16,1);, accendo un led e con My595.Send595Pin(0,1) li spengo tutti.......vorrei capire se si puo' spegnere solo quello che go comandato in quel momento, visto che magari vorrei lasciarne accesi alrei con comandi precedenti.

Grazie per la celerità.

per favore scrivi quale libreria stai usando

siccome hc595 ha 8 uscite
se ragioniamo in binario avremo:

valore 00000000 (decimale 0) tutti i led spenti
00000001 (decimale 1) primo led acceso
00000010 (decimale 2) secondo led acceso
00000011 (decimale 3) primo e secondo led acceso
......

per cui
00010000 (decimale 16) quinto led acceso
e così via

questo esempio non fa uso di librerie e con 8 led collegati (con resistenza da 1K Ohm) alle uscite del 74HC595 conta da 1 a 255 in binario

//**************************************************************//
//  Name   : shiftOut11, Hello World                                
//  Author  : Carlyn Maw,Tom Igoe, David A. Mellis 
//  Date     : 25 Oct, 2006    
//  Modified: 23 Mar 2018                                 
//  Version : 2.0                                             
//  Notes   : Code for using a 74HC595 Shift Register          
//              : to count from 0 to 255                           
//****************************************************************

//Pin connesso al DS del 74HC595
int dataPin = 8;
//Pin connesso al ST_CP del 74HC595
int latchPin = 11;
//Pin connesso al SH_CP del 74HC595
int clockPin = 12;



void setup() {
 
  Serial.begin(9600);
  pinMode(latchPin, OUTPUT); //imposta i pin come output  
  pinMode(clockPin, OUTPUT); //per controllare lo shift register
  pinMode(dataPin, OUTPUT);
}

void loop() {
  // conta da 0 a 255 e mostra il numero in binario usando i led 
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // mette il pin latchPin low  
    // così i led non cambiano mentre eseguiamo il settaggio
    digitalWrite(latchPin, LOW);
    // imposta i valori nello shift register
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  

    //porta il pin latch ad high così i valori vengono trasferiti ai led
    digitalWrite(latchPin, HIGH);
    // pausa prima del prossimo valore
    Serial.println(numberToDisplay);
    delay(300);
  }
}

questo è un estratto di quello che sto cercando di fare:

#include <HC595.h>


hc595 My595(6,5,4,3); // latch,clock,data,number of 74hc595
void setup() {
My595.DisplayReset(LCD595_BASIC_DISPLAY_INIT | LCD595_MORELINES ,0);
My595.Set595Pin(0,0,0,0,0,0,0,0,2); // Tutti Spenti
My595.Set595Pin(0,0,0,0,0,0,0,0,1); // Tutti Spenti
My595.Send595();

}

void loop() {
 My595.SetCursor(0,1,2,0);My595.DisplayWrite("   BADGE OK",0);
          My595.Send595Pin(16,1);  //led giallo on
             tone(piezo, 500, 200); delay(200);
             tone(piezo, 1500, 200); delay(200);
             My595.Send595Pin(0,1);delay(3000);

}

come vedi sto provando tutte e due le istruzioni, solo pensavo che ci fosse qualcosa di più veloce che My595.Set595Pin(0,0,0,0,0,0,0,0,2);questo.
infatti cercavo di accenderli, i led, con questo:My595.Send595Pin(16,1);
e di spegnerli con questo: My595.Send595Pin(0,1), ma questo li spegne tutti

ancora grazie

se sbaglio qualcosa nel postare i messaggi fatemelo sapere .....grazie

>usul5761: 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

che ne dici? va bene modificato cosi?
se non capisco male man mano che continuo a rispondere, non devo cliccare su reply?

se no scusa ma dove c'è " Quick Edit More.... non trovo More, ma solo Modify e Remove.
Scusa ma sono le prime volte e devo imparare grazie della pazienza

usul5761:
che ne dici? va bene modificato cosi?

Si, va bene :slight_smile:

usul5761:
se non capisco male man mano che continuo a rispondere, non devo cliccare su reply?

Puoi usare sia il "Reply" che la finsetrella sotto per il "Quick reply"

usul5761:
se no scusa ma dove c'è " Quick Edit More.... non trovo More, ma solo Modify e Remove.
Scusa ma sono le prime volte e devo imparare grazie della pazienza

Quick Edit e More sono due link separati con azioni separate ... se vai con il mouse sulla parola More si apre una tendina e li hai il Modifiy.

Guglielmo

esistono degli operatori che lavorano sui bit Xor e Or

esempio

 byte ledGiallo = 16;
  byte ledRosso = 8;
  byte ledVerde = 4;

  byte a = ledGiallo + ledRosso + ledVerde ; // accende tre led
  My595.Send595Pin(a, 1);

  a = a ^ ledGiallo + ledRosso  ; // esegue Xor e spegne ledGiallo e ledRosso
  My595.Send595Pin(a, 1);
  
  a = a | ledGiallo ; // Esegue Or e riaccende  ledGiallo
  My595.Send595Pin(a, 1);
  
  a = a | ledRosso ; // Esegue Or e riaccende  ledRosso
  My595.Send595Pin(a, 1);

  a = a ^ ledRosso  ; // esegue Xor e spegne ledRosso
  My595.Send595Pin(a, 1);

...omissis
e di spegnerli con questo: My595.Send595Pin(0,1), ma questo li spegne tutti

ancora grazie

[/quote]

come ti dicevo prima

questo spegne tutto My595.Send595Pin(0,1)
questo accende solo il primo My595.Send595Pin(1,1) e spegne tutto il resto
"" "" secondo My595.Send595Pin(2,1) "" ""
"" il primo e il terzo My595.Send595Pin(5,1)

se hai una condizione di partenza da mantenere e lavorare solo su un led ben specifico devi fare come ti ha scritto brunello22
altrimenti decidi tu quali led accendere e spegnere dando il valore corretto
tra l'altro mi pare che accetti anche My595.Send595Pin(00010011b,1) cioè il binario in cui gli 1 sono accesi e gli 0 spenti..

usul5761:
vorrei capire se si puo' spegnere solo quello che go comandato in quel momento

No, i bit che comandano le uscite sono dentro il 595 e vengono riscritti tutti da zero ad ogni trasmissione.

La soluzione è quella di Brunello: modifichi i bit di una variabile (di tipo byte) e ritrasmetti quella variabile.

A quel punto non serve usare nessuna libreria, basta una istruzione shiftOut.

Buongiorno a tutti,
innanzitutto vi ringrazio per la cortesia dimostratami.
Poi avendo fatto un po di prove mi è risultato buono il suggerimento di

brunello22:
esistono degli operatori che lavorano sui bit Xor e Or

esempio

 byte ledGiallo = 16;

byte ledRosso = 8;
 byte ledVerde = 4;

byte a = ledGiallo + ledRosso + ledVerde ; // accende tre led
 My595.Send595Pin(a, 1);

a = a ^ ledGiallo + ledRosso  ; // esegue Xor e spegne ledGiallo e ledRosso
 My595.Send595Pin(a, 1);
 
 a = a | ledGiallo ; // Esegue Or e riaccende  ledGiallo
 My595.Send595Pin(a, 1);
 
 a = a | ledRosso ; // Esegue Or e riaccende  ledRosso
 My595.Send595Pin(a, 1);

a = a ^ ledRosso  ; // esegue Xor e spegne ledRosso
 My595.Send595Pin(a, 1);

ma almeno a me da un problema......cioè che se comando un led ed eseguo altre istruzioni e poi ne comando un'altro il led precedente si spegne.......
siccome sto creando un progetto della lettura da rfid con disinserimento allarme accensione luci se al momento dell'apertura c'è buio, e reinserimento dell'allarme, vi mando i due sketch completi.
Provate a fare il confronto e poi ditemi cosa sbaglio....

grazie ancora

lettore_apriporta_case_2.ino (4.61 KB)

lcd_con_led_3_fili_rfid_prova.ino (6.6 KB)

semplice.... se gli xor li fai all'inizio i vari r1, v1 e via dicendo non tengono conto della situazione reale di quel momento quindi gli altri led che siano accesi o spenti li imposti tutti a 0
devi usare una sola variabile di tipo byte (es. statoLed) per tutto lo sketch e di volta in volta applicherai gli or o xor necessari

My595.Send595Pin(statoLed^ledrosso, 1); // led rosso off
...
...
 My595.Send595Pin(statoLed|ledgiallo, 1); // led giallo on

ok adesso provo, che mi dici del resto?

grazie

scusa, ma non capisco come associare statoled al led in questione da accendere o spegnere,,,,,, :confused: :confused:

a ri grazie

è scritto li....

all'inizio statoLed lo debinisci come byte e sarà = 0

poi ogni volta che deci accendere un led
aggiungi la digitalWrite tra statoLed OR il led che devi accendere
e se devi spegnerlo farai la Xor con lo stesso led...