Go Down

Topic: Come si usa la libreria 74HC595 (Read 1 time) previous topic - next topic

usul5761

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

esistono degli operatori che lavorano sui bit  Xor e Or

esempio

Code: [Select]
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

Patrick_M

#16
Apr 20, 2018, 01:20 pm Last Edit: Apr 20, 2018, 01:23 pm by Patrick_M
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
Code: [Select]

My595.Send595Pin(statoLed^ledrosso, 1); // led rosso off
...
...
 My595.Send595Pin(statoLed|ledgiallo, 1); // led giallo on
per inserire lo sketch da IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

usul5761

ok adesso provo, che mi dici del resto?


grazie

usul5761

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

a ri grazie

Patrick_M

è 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...
per inserire lo sketch da IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Patrick_M

#20
Apr 20, 2018, 05:05 pm Last Edit: Apr 20, 2018, 05:33 pm by Patrick_M
te ne ho fatto un pezzo

mancava il ; dopo statoLed=0 :)
Code: [Select]

#include <SPI.h>
//#include <HC595.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN 10
#define RST_PIN 9

int ledRosso = 1;
int ledVerde = 2;
int ledBlu = 4;
int ledBianco = 8;
int ledGiallo = 16;
int ledp = 32;
int ledp1 = 64;
int ledp2 = 128;

// byte r = ledRosso | ledRosso;
// byte r1 = ledRosso ^ ledRosso;
// byte v = ledVerde | ledVerde;
// byte v1 = ledVerde ^ ledVerde;
// byte bl = ledBlu | ledBlu;
// byte bl1 = ledBlu ^ ledBlu;
// byte b = ledBianco | ledBianco;
// byte b1 = ledBianco ^ ledBianco;
// byte g =ledGiallo | ledGiallo;
// byte g1 = ledGiallo ^ ledGiallo;

byte statoLed = 0; //inizialmente i led sono spenti 00000000 in binario

 int Puls = 3;
int piezo = 7;
int rele1 = 2;

int sensor = A0;
/*int servo = A1;*/

int Stato = 0;
int Stato_Puls = 0; //imposta lettura pulsante
int count = 0; //imposta conteggio rele
int sensorValue = 0;//imposta il valore del sensore

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


void setup() {
   //My595.DisplayReset(LCD595_BASIC_DISPLAY_INIT | LCD595_MORELINES ,0);
   My595.SetCursor(0, 0, 2, 0);
   My595.DisplayWrite("LCD..ok", 0);
   delay (2000);
   Serial.begin(9600); // Setta la seriale
   mfrc522.PCD_Init(); // Setta MFRC522
   Serial.println("Leggi la carta...");
   Serial.println();

   pinMode(rele1, OUTPUT);
   pinMode(Puls, INPUT);
   pinMode(piezo, OUTPUT);

   My595.SetBackLight(2, HIGH, 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();

   /* DoorLock.attach(servo);*/
   digitalWrite (rele1, HIGH); count = 1;
   My595.Send595Pin(r, 1); //led rosso on
   all_ins();
}

void loop() {
   Stato_Puls = digitalRead(Puls);
   if (Stato_Puls == 1 ) {
      // My595.SetBackLight(2,HIGH,0);
      all_ins();
   }
   /* DoorLock.attach(servo);
   DoorLock.write(0); //Servo at 0 Position, Door is Closed.
   DoorLock.detach();*/

   if ( ! mfrc522.PICC_IsNewCardPresent()) { // Look for new cards
      return;
   }

   if ( ! mfrc522.PICC_ReadCardSerial()) {  // Select one of the cards
      return;
   }
   String conteudo = "";
   for (byte i = 0; i < mfrc522.uid.size; i++) {
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
      conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
   }
   Serial.println();
   Serial.print("Messaggio : ");
   conteudo.toUpperCase();

   if (conteudo.substring(1) == "CD 4B 44 79" ) { //UID 1 - Ettore
      My595.SendLcdCommand(LCD595_DISPLAY_CLEAR, 0);
      My595.SetCursor(0, 0, 2, 0); My595.DisplayWrite(" Ola Ettore !", 0);
      Stato = 1;
   } else if (conteudo.substring(1) == "3B C7 43 79") { //UID 3 - JUSSI
      My595.SendLcdCommand(LCD595_DISPLAY_CLEAR, 0);
      My595.SetCursor(0, 0, 2, 0); My595.DisplayWrite(" Ola Jussi !", 0);
      Stato = 1;
   } else if (conteudo.substring(1) == "D9 13 90 C9") { //UID 3 - EASY
      My595.SendLcdCommand(LCD595_DISPLAY_CLEAR, 0);
      My595.SetCursor(0, 0, 2, 0); My595.DisplayWrite(" Ola Easy !", 0);
      Stato = 1;
   } else {
      Stato = 2;
   }
   switch (Stato) {
      case 1:
         My595.SetCursor(4, 1, 2, 0); My595.DisplayWrite("BADGE OK", 0);
         My595.Send595Pin(statoLed|ledGiallo, 1);                //led giallo on
         tone(piezo, 500, 200); delay(200);
         tone(piezo, 1500, 200); delay(200);
         My595.Send595Pin(statoLed^ledGiallo, 1); delay(3000);

         if (count == 0) {
            My595.SetCursor(0, 1, 2, 0); My595.DisplayWrite("            ", 0);
            My595.SetCursor(3, 1, 2, 0); My595.DisplayWrite("ALARM DISABLE", 0);
            tone(piezo, 2000, 300); delay(500);
            tone(piezo, 1500, 300); delay(500);
            tone(piezo, 500, 300); delay(500);
            digitalWrite (rele1, HIGH); count = 1;
            My595.Send595Pin(0, 1);  delay(500);
            digitalWrite (rele1, HIGH); count = 1;
            My595.Send595Pin(statoLed^ledRosso, 1); // led rosso off

            delay(500);
         } else {
            (count = 1);
         }
         sensorValue = analogRead(sensor); // imposta il sensore
         if (sensorValue < 100 && count == 1) {
            My595.Send595Pin(statoLed|ledGiallo, 1); // led giallo on

         }

         //  DoorOpen(servo);  //Now, Open the Door with the help of Servo Motor

         My595.SetCursor(0, 1, 2, 0); My595.DisplayWrite("            ", 0);
         My595.SetCursor(0, 1, 2, 0); My595.DisplayWrite("   Door Opened!", 0);
         My595.Send595Pin(statoLed|ledBlu, 1); // led blu on
         delay (3000);
per inserire lo sketch da IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

usul5761

ok a ri provo.....


graaaaaaaazzzziiiiieeeeeee

usul5761

#22
Apr 22, 2018, 11:34 pm Last Edit: Apr 22, 2018, 11:57 pm by usul5761
allora dopo aver fatto alcune prove, credo di aver capito una cosa ......che probabilmente sono davvero tardo e per questo vi chiedo scusa.

Ma ....se con digitalWrite (Pin, HIGH)    accendo un led, finchè non gli do un digitalWrite(led, LOW),  quel led non si spegne.
Invece quando arrivo a questo passaggio
Code: [Select]
case 1:
        My595.SetCursor(4, 1, 2, 0); My595.DisplayWrite("BADGE OK", 0);
        My595.Send595Pin(statoLed|ledGiallo, 1);                //led giallo on
        tone(piezo, 500, 200); delay(200);
        tone(piezo, 1500, 200); delay(200);
        My595.Send595Pin(statoLed^ledGiallo, 1); delay(3000);

        if (count == 0) {
           My595.SetCursor(0, 1, 2, 0); My595.DisplayWrite("            ", 0);
           My595.SetCursor(3, 1, 2, 0); My595.DisplayWrite("ALARM DISABLE", 0);
           tone(piezo, 2000, 300); delay(500);
           tone(piezo, 1500, 300); delay(500);
           tone(piezo, 500, 300); delay(500);
           digitalWrite (rele1, HIGH); count = 1;
           My595.Send595Pin(0, 1);  delay(500);
           digitalWrite (rele1, HIGH); count = 1;
           My595.Send595Pin(statoLed^ledRosso, 1); // led rosso off

           delay(500);
        } else {
           (count = 1);


ho il led rosso acceso, ma appena entra nel case1 ....il led rosso si spegne, effettua la prima parte del case accendendo e spegnendo il led giallo, poi se (IF) trovo valida la condizione dell'if mi accende per un attimo il led rosso e poi lo spegne.

Come ripeto o sono tardo io oppure c'è qualcosa che non va( non vorrei dare colpe a nessuno ci mancherebbe)ma siccome mi dispiace rompere le scatole penso che cerchero' altra soluzione, magari comprando un arduino due e usando le librerie normali visto che con quelle almeno funziona
Scusate ancora il disturbo e grazie

gpb01

#23
Apr 22, 2018, 11:40 pm Last Edit: Apr 22, 2018, 11:40 pm by gpb01
>usul5761:   ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (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).

Guglielmo
Search is Your friend ... or I am Your enemy !

usul5761

scusa mi ero dimenticato, ma sai sono un po deluso e non ho la mente lucida


scusa ancora e grazie

Patrick_M

dovresti sempre postare lo sketch completo però altrimenti come faccio a dirti che errore c'è...

comperare un arduino due o un mega o quant'altro non ti eliminerà gli errori di programmazione che fai, quelli li elimini solo capendo cosa succede.

all'ingresso del case 1 c'è il lampeggio del led giallo e fin qui va bene (sembra) ma appena entra nell' if trova
Code: [Select]

digitalWrite (rele1, HIGH); count = 1;
My595.Send595Pin(0, 1);  delay(500);      //<---------------- questa spegne tutti i led
digitalWrite (rele1, HIGH); count = 1;
My595.Send595Pin(statoLed^ledRosso, 1); // led rosso off    e poi spegni il led rosso...????
per inserire lo sketch da IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Patrick_M

...Omissis

Come ripeto o sono tardo io oppure c'è qualcosa che non va( non vorrei dare colpe a nessuno ci mancherebbe)ma siccome mi dispiace rompere le scatole penso che cerchero' altra soluzione, magari comprando un arduino due e usando le librerie normali visto che con quelle almeno funziona
Scusate ancora il disturbo e grazie
Scusa usul se te lo dico  ma a mio avviso sei partito con un progetto  che è al di sopra delle tue conoscenze attuali ed è per questo che non riesci a trovare/capire gli errori, non di sintassi, quelli li trova il compilatore. Gli errori logici sono il problema uniti ad uno stile di scrittura che non è il tuo non ti agevolano certamente il compito. ad esempio lo scrivere due o più istruzioni sulla stessa riga rende il programma meno leggibile e ti scappano le piccole cose come quel My595.Send595Pin(0, 1) che evidentemente non hai compreso.

Non devi invece scoraggiarti o pensare di "rompere", se rompi al limite non ti rispondo e finisce li.... ;)
per inserire lo sketch da IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

usul5761

ok chiedo scusa lo so che mi sto impegnando in un progetto difficoltoso, ma con le librerie normali tutto funziona.
Volevo appunto risparmiando pin addentrarmi in qualcosa di piu ......
ho allegato i due file quello scritto con librerie liquid crystal e quello scritto con la 595.

se hai voglia controlla e dimmi dove sbaglio


ancora grazie

Patrick_M

nel lettore apriporta ora mi sembra che sia corretta la gertione de 3 led....
tu che problema riscontri?
per inserire lo sketch da IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

usul5761

Ciao, il fatto che appena comando l'accensione o lo spegnimento di un'altro led, quello prececedente acceso si spegne, nella sezione che ti ho mandato, si arriva che il led rosso dell'allrame è acceso, ma poi quando gli faccio leggere la card, lo spegne poi accende e spegne il giallo e se trova la condizione if a count 1, accende il rosso e poi lo spegne.
nell'altro sketch,quello senza la hc595.h il led rosso continua a rimanereo anche quando fa il passaggio di lettura della card, e lo spegne solo se trova count =1.

quello che non capisco è perchè appunto i led accesi non rimangano tali anche se ne comando altri come succede con la digitalWrite.


Grazie della pazienza

Go Up