buzzer

sia il pulsante che la tessera sia per inserire che disinserire
all'esterno nonn voglio mettere pulsanti comunque si presuppone che il pulsante venga rilasciato. mi sembra una cosa quasi scontata.
il pulsante nel mio caso non so se lo utilizzerei, ma può sempre essere utile

il problema al momento è la tessera che appoggiandola non si capisce se accettata o meno per alcuni secondi
per la mia esperienza molte persone tendono a tenere appoggiate le tessere fino a che non vedono illuminarsi qualcosa
ti aggiorno su eventuali miei sviluppi
Grazie

fabio1970:
sia il pulsante che la tessera sia per inserire che disinserire
. . .

Cominciamo a far funzionare la tessera per inserire l'allarme. La parte attuale non funziona?

fabio1970:
. . . comunque si presuppone che il pulsante venga rilasciato. mi sembra una cosa quasi scontata.

Se per te va bene...

fabio1970:
. . .il problema al momento è la tessera che appoggiandola non si capisce se accettata o meno per alcuni secondi
. . .

Basterebbe mettere un led e relativa resistenza brutalmente in parallelo al releReset per vedere il lampeggio a tessera riconosciuta. Oppure un altro led, magari verde, che si accende a tessera riconosciuta e si spegne quando arriva il segnale di attivato dalla centrale.

Ciao,
P.

bella idea del lampeggio e buzzer
io lascerei il buzzer, cosi SI capisco quando ricevuto comando da pulsante o tessera

ho verificato lo sketch con pulsante rilasciato e tessera allontanata tutto ok (tranne buzzer non ancora inserito)

se premo il pulsante e rilascio tutto ok se lo tengo premuto il ciclo si interrompe, arriva il comando attivato dalla centralina non esegue nessuna funzione tanto che blocca completamente il ciclo

con tessera mantenuta il ciclo si ripete senza tener conto della pausa delayRead

aggiungo buzzer di riconoscimento al mio sketch (quello senza blocco)
in questo modo penso che si è risolto un sacco di problemi. Con la nota si comporterebbe come le centrale con la sua tessera originale se mantenuta il ciclo continuava da ON a OFF e ad ogni passaggio il suo buzzer emetteva 2 note per inserimento e una nota lunga per inserimento
a me basterebbe 1 nota quando attivato è HIGH con una frequenza e se possibile 1 nota quando attivato è LOW con una frequenza se possibile diversa

allego mio sketch e comunicherò se eventuali aggiunte

Manca il programma.

Ciao,
P.

/****************** Mxxx V1.1 LETTORE RFID CARD RC-522 e BUZZER


  scopo del progetto: realizzare un lettore rfid da installare in una centrale allarme senza inseritori

  occorre comandare 1 rele per effettuare un reset impianto e un secondo rele per attivarlo
  chiaramente la centrale deve prevedere la programmazione di 1 ingresso come reset e 1 come on-off

  Se la tessera viene riconosciuta o viene premuto il pulsante si accende un releReset,per un tempo,pausa e
  si accende un secondo rele che si spegne dopo un'altro tempo
  i comandi di reset e onff non si devono sovrapporre in centrale


  la centrale deve restituire un segnale di venuta attivazione e questo segnale deve accender un led
  che rimane fisso per tutto il tempo di attivato e far suonare un buzzer per un tempo programmato

  possibiita di NON far intervenire il releReset quando disattivo (non di vitale importanza)

  Se la tessera è falsa si accende un ledfalsa con dei lampeggi e relativo buzzer per indicare l`inaccessibilità.

  Il codice tessera si idividua dal monitor seriale di arduino, con uno sketch a parte



  PINOUT:

  RC522 MODULO    Uno/Nano
  SDA             D10
  SCK             D13
  MOSI            D11
  MISO            D12
  IRQ             N/A
  GND             GND
  RST             D9
  3.3V            3.3V

  pulsante esterno al Pin 2 e +5v
  resistenza 10K  pin 2 e gnd

  comando esterno di attivato al Pin 7 e +5v
  resistenza 10K  pin 7 e gnd se il comando è un contatto

  ledFalsa al Pin 3 e gnd
  releReset al Pin 4 e gnd
  releOnoff Pin 5 e gnd
  buzzer al pin 6 e gnd
  ledattivato al pin 8 e gnd
*/


#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN  */
#define SDA_DIO 10
#define RESET_DIO 9
#define delayRead 1500     // Tempo di attesa fra ogni lettura usando rfid card
#define delayLed 1000      // Tempo di accensione led verde ok prima di chiudere il rele

#define pulsante 2         // pulsante attivazione manuale
#define ledFalsa 3         // segnala chiave falsa
#define releReset 4        // comando "RESET" VERSO centrale
#define releOnoff 5        // comanda il rele
#define buzzer 6           // comanda il buzzer
#define attivato 7         // comando "ATTIVATO" PROVENIENTE da centrale
#define ledattivato 8      // segnala impianto attivato

int val = 0;



/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO);
// inserire tutti i codici esadecimali delle schede magnetiche riconosciute
String codiceAutorizzato1 = "A6424373D4";
String codiceAutorizzato2 = "6BEF9F1B0";    //QUESTO CODICE HA UNA LETTERA IN MENO
String codiceAutorizzato3 = "207A56737F";
String codiceAutorizzato4 = "359D46739D";
String codiceAutorizzato5 = "B9A347732E";

void setup()
{
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin();
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Passare Carta");   // intestazione su monitor seriale
  pinMode(pulsante, INPUT);
  pinMode(ledFalsa, OUTPUT);
  pinMode(releReset, OUTPUT);
  pinMode(releOnoff, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(attivato, INPUT);
  pinMode(ledattivato, OUTPUT);
  //
  //AGGIUNGERE QUI LE ISTRUZIONI PER LED SPENTI E RELÈ OFF
  //
  digitalWrite (pulsante, LOW);
  digitalWrite (ledFalsa, LOW);
  digitalWrite (releReset, LOW);
  digitalWrite (releOnoff, LOW);
  digitalWrite (buzzer, LOW);
  digitalWrite (attivato, LOW);
  digitalWrite (ledattivato, LOW);

}

void loop()
{


  /**** QUESTA PARTE RICONOSCE L'AVVENUTA ATTIVAZIONE DELLA CENTRALE E ACCENDE UN LED ****/
  val = digitalRead(attivato);  // legge il valore dell'input e lo conserva

  if (val == HIGH) {          // controlla che l'input sia HIGH (pulsante premuto)
    digitalWrite(ledattivato, HIGH);  // accende il led

  }
  else {
    digitalWrite(ledattivato, LOW);   // spegne il led
  }


  //-- SENZA SEQUENZA
  //--
  //-- PONTICELLO E TOLGO IL CONTATTO attivato    IL ledattivato SEGUE IL COMANDO attivato
  //--
  //-------CON SEQUENZA
  //--
  //-- IN ACCENSIONE IL ledattivato E' HIGH FINITO IL TEMPO DI ATTESA FRA LE LETTURE
  //-- IN SPEGNIMENTO IL ledattivato E' LOW FINITO IL TEMPO DI ATTESA FRA LE LETTURE
  //-----------POSSIBILE FAR SEGUIRE LO STATO "attivato" ?  ? ?
  //------------------ci sto provando------------



  /*----------------------------------------------------------------------------------*/



  /*
        if (val == HIGH)  {
        //digitalWrite(buzzer, HIGH);  // attivo il buzzer
        tone (buzzer, 3500, 1000);
        delay (500);
        {
        ;
        }
        delay (20);

        }

  */
  // --INSERENDO QUESTA PARTE OTTENGO UN SOLO SUONO DEL BUZZER MA IL CICLO SI BLOCCA
  // --IL CICLO while BLOCCA TUTTO
  // --RIPARTE SE  ( val == LOW )




  /************ QUESTA PARTE E PER ATTIVARLO CON UN PULSANTE **************/

  if (digitalRead(pulsante) == HIGH)
  {
    // riconoscimento tono avvenuta pressione del pulsante
    tone (buzzer, 3500, 500  );                    // QUI ATTIVO IL BUZZER
    digitalWrite(releReset, HIGH);                 // accendo il releReset
    //- attesa M secondi
    delay (1000);
    //- relè "reset" OFF
    digitalWrite(releReset, LOW);
    //- eventuale piccola attesa per evitare contemporaneità relè "reset" con relè "OnOff"
    delay (800);
    //- relè "OnOff" ON
    digitalWrite (releOnoff, HIGH);
    //- attesa N secondi
    delay(1000);
    //- relè "OnOff" OFF
    digitalWrite (releOnoff, LOW);
    //Tempo di attesa fra ogni lettura usando pulsante
    delay(1500);
  }

  /*********** QUESTA PARTE E PER ATTIVARLO CON TESSERA RFID **************/
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard ())
  {
    // Viene letto il suo codice
    RC522.readCardSerial();
    String codiceLetto = "";
    Serial.println("Codice delle tessera letto:");

    // Viene caricato il codice della tessera, all'interno di una Stringa
    for (i = 0; i <= 4; i++)
    {
      codiceLetto += String (RC522.serNum[i], HEX);
      codiceLetto.toUpperCase();
    }

    //se si aggungono i codici aggiungere la stringa attenzione alle 2 parentesi tonde finali))*/

    Serial.println(codiceLetto);
    if (verificaCodice(codiceLetto, codiceAutorizzato1) || verificaCodice(codiceLetto, codiceAutorizzato2)
        || verificaCodice(codiceLetto, codiceAutorizzato3) || verificaCodice(codiceLetto, codiceAutorizzato4)
        || verificaCodice(codiceLetto, codiceAutorizzato5))

    {
      Serial.println("Tessera autorizzata");          // se tessera ok accendo releReset
      tone (buzzer, 3500, 500  );                     //QUI FACCIO UN
      accendiLed(releReset );                         // accendo il releReset per il tempo delayLed
      delay (800);                                    // pausa fra releReset e releOnoff
      digitalWrite (releOnoff, HIGH);                 // finito il tempo delayLed accendo il releOnoff
      delay (1000);                                   // dopo questo tempo
      digitalWrite (releOnoff, LOW);                  // spengo il releOnoff
    }
    else                                            // allora
    {
      Serial.println("Tessera non autorizzata");      // la chiave è falsa
      accendiLedFalsa(ledFalsa);                      // accendo il ledFalsa
      delay (200);                                    //per untempo di 20 millisecondi
    }
    delay(delayRead);                               //il ciclo si ripete ogni tempo di delayRead
  }
}

// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto, String codiceAutorizzato)
{
  if (codiceLetto.equals(codiceAutorizzato))
  {
    return true;
  }
  else
  {
    return false;
  }
}
/********* Questa funzione permette di accendere il LED per un determinato periodo ******/
// vedi tempo di "accendiLed"
void accendiLed(int ledPin) {

  digitalWrite(ledPin, HIGH);
  delay(delayLed);
  digitalWrite(ledPin, LOW);
}
/** QUESTA FUNZIONE ACCENDE ledfalsa  E buzzer PER ALCUNI LAMPEGGI SE CARD NON RICONOSCIUTA **/
void accendiLedFalsa(int ledPin)        //se accendo ledfalsa
{
  digitalWrite(ledPin, HIGH);             // accendo ledFalsa
  tone (buzzer, 3500, 30);                //accendo il buzzer con la stessa tempo del delay
  delay(30);                              // per un tempo
  digitalWrite(ledPin, LOW);              // spengo ledFalsa  continuo
  delay(30);
  digitalWrite(ledPin, HIGH);
  delay(30);
  digitalWrite(ledPin, LOW);
  delay(30);
}

ho dovuto rimandarlo con un secondo posto perchè il primo sforava e non posso prima di 5 minuti

La parte del pulsante non termina e viene eseguita a ogni giro del loop, All'interno ci sono 100+800+1000+1000=3800ms di ritardo, durante i quali c'è tutto il tempo di rilasciare il pulsante, ma se continui a tenerlo premuto il ciclo si ripete ogni 3800ms e, naturalmente, non esegue nessun'altra funzione finché non rilasci il pulsante. Ma avevi detto che ti andava bene così.

Lo stesso per la tessera. Se la tieni sul sensore il ciclo si ripete all'infinito.

E se premi e tieni premuto anche il pulsante si ripetono entrambi i cicli: prima quello del pulsante, poi quello della tessera, poi ancora il pulsante, poi la tessera...

Questo fa il tuo programma, ma non è quello che tu vuoi che faccia. È ancora una questione di specifiche. Prendiamo il pulsante. Tu vuoi che lo premi una volta e attiva la centrale, poi lo premi ancora e disattiva la centrale. Lo stesso per la tessera: la accosti e la centrale si attiva, la riaccosti e la centrale si spegne. Queste operazioni devono avvenire UNA ALLA VOLTA. Finché il pulsante è premuto e resta premuto deve avvenire UNA SOLA ATTIVITÀ e per UNA SOLA VOLTA, e l'accosto della tessera non deve essere preso in considerazione. Allo stesso modo finché la tessera è accostata e resta accostata la pressione del pulsante non deve essere presa in considerazione.

Se vuoi che il tuo programma si comporti così, comincia a rendere bloccante il ciclo del pulsante. Finché il pulsante resta premuto il ciclo del loop NON riprende. Ti avevo suggerito una soluzione. Vedi se ti va bene.

Ciao,
P.