Saltar la navegación

Código RFID

Video de ejemplo

fer video

Librerias necesarias

Para que funcione correctamente nuestro dispositivo vamos a necesitar una serie de librerias:

#include <Adafruit_NeoPixel.h>
#include <require_cpp11.h>
#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include "SPI.h"
Algunas de estas librerias van incluidas en las principales: Adafruit_NeoPixel.h
y MFRC522.h. Si no disponeis de alguna de estas librerias, el programa Arduino os
pedirá que la instaléis.
A continuación un ejemplo de cómo instalar librerias.



Cambio del código de cada tarjeta

Dado que cada tarjeta es diferente, las vuestras tienen un código diferente al
que os paarecera en el código final, el que teneis que subir a la placa Arduino.
Así pues debéis de:
1. saber el código de cada una de vuestras tarjetas
2. Tenerlo apuntado 
3. Abrir el código con el IDE de Arduino
4. Buscar la linea que corresponda a la primera tarjeta
5. Cambiarlo por el vuestro
así, por ejemplo, si el código dice


if(usercard.indexOf("A6:F4:49:29") >= 0) { 
  targeta=1;
  return true;
  }
  else if(usercard.indexOf("A5:5F:96:28")>= 0) {
  targeta=2;
  return true;
  }

Cambiad el codigo de la tarjeta 1 A6:F4:49:29 por el vuestro
para la tarjeta número 2 borrad A5:5F:96:28 y poned el vuestro,
y así sucesivamente.

Código RFID y LEDS

//sacosta.org
//inclou canvi brillantor targes 204 i 205
//canvi delay a millis
//inclou que pots deixar la targe a sobre aplicat a targes 1-14
// 204 i 205(per si es volen fer mées d'un esglaó de canvi) no ho porten incorporat
//cada targeta encen la tira un a un d'un color/colors determinat
//la tarja 14 apaga  la tira
//línies 43-58 defineixen els color de cada tarja de color fixe
//ID targes linies 305-382
//Targes especials
//targeta 204 incrementa la brillantor entre mínim i màxim
//targeta 205 decrementa la brillantor entre màxim i mínim
#include <Adafruit_NeoPixel.h>
#include <require_cpp11.h>
#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include "SPI.h"


const int      PIN       =  6; // Pin Arduino a senyal tira
const int      NUMPIXELS = 60; // Número de neopíxels de la tira
const int      SS_PIN    = 10; // Data PIN DE MFRC522 A PIN 10 ARDUINO
const int      RST_PIN   =  9; // Reset PIN DE MFRC522 A PIN 9 ARDUINO
const int      TIME      =150; //
const int      BRILLANTOR= 20; //Brillantor dels neopixels


//Variables: pixels
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);


MFRC522 mfrc522(SS_PIN, RST_PIN); 
MFRC522::MIFARE_Key key;


//Definició de colors
const uint32_t red=pixels.Color(193, 0, 0);//1 vermell
const uint32_t green=pixels.Color(0, 193, 0);//2 verd
const uint32_t blue=pixels.Color(0, 79, 169);//3 blau
const uint32_t purple=pixels.Color(0, 255, 255);//4 blau claret
const uint32_t taronja=pixels.Color(195, 105, 0);//5 groc
const uint32_t taronja_claret=pixels.Color(139, 42, 0);//6 taronja
const uint32_t blau_clar=pixels.Color(0, 118, 35);//7 verd blavos
const uint32_t violeta=pixels.Color(255,47, 84);//8 rosa
const uint32_t violeta_fort=pixels.Color(255, 0, 198);//9 violeta
const uint32_t verd_clar=pixels.Color(200,200,200);//10 blanc
const uint32_t chocolate=pixels.Color(210, 5, 30);//11 vermell rosa
const uint32_t verd_blavos=pixels.Color(0, 255, 128); //12 blau verdos
const uint32_t hotpink=pixels.Color(25,25,112);//13 blau nit
const uint32_t yellow=pixels.Color(166, 136, 0);//14 groc                    
const uint32_t blank=pixels.Color(0, 0, 0);//apagat


//Variables per a llamp
int t_llamp=15;// temps pujada llamp
int num_llamps=3; //nombre de llamps
int repeticio=0;
//Variables arc de sant martí
int t_on=50;//temps per a pujar arc de sant martí
int brillantor=80;//pots modificar el Brightness de la tira amb les tecles 204(+) i 205(-) 
int brillantor_max=240;//fixa el màxim de brillantor
int brillantor_min=40;//fixa el mínim de brillantor
int targeta;//variable amb la que asociarem un códi de targeta a un número.
char st[20];//variable sistema


String strID = "";
String strIDtemp="";//variable creada para poder deixar la tarja a sobre del lector de rfid


unsigned long Temps_ara = 0;//variable utilizada per captar el valor de millis() quant ens interessi
const int      t_aturat      =  1000; //variable utilizada per a fixar un "delay" emprant millis().


void setup() 
{
 
  // Inicia  serial
  Serial.begin(9600);
  pixels.begin();
  pixels.setBrightness(BRILLANTOR); 
  // Inicia  SPI bus
  SPI.begin();
  // Inicia mfrc522(lector de targes)
 mfrc522.PCD_Init(); 
  }


void loop() 
{
  // En espera de targeta
  if ( ! mfrc522.PICC_IsNewCardPresent()|| !mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);//analitza el tipus de targeta
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
      piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
      piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("La teva targeta no és del tipus MIFARE Classic."));
    return;
    //si no és una Mifare classic torna a començar el loop
  }
  String strID = "";
  for (byte i = 0; i < 4; i++) {
    strID +=
      (mfrc522.uid.uidByte[i] < 0x10 ? "0" : "") +
      String(mfrc522.uid.uidByte[i], HEX) +
      (i != 3 ? ":" : "");
  }
  strID.toUpperCase();
  
  if (validateCard(strID)) {
    Serial.print("*** LA TEVA ID ÉS: ");
    Serial.println(strID);
    Serial.print("");
    
   if(targeta==1){
  if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
  Serial.println(targeta);
  pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
  llamp();
  strIDtemp=strID;//donam a la variable temporal el valor de la darrera tarja llegida, así s'evita que se reinicie la funció de la tarja
  } return true; 
  }
   if(targeta==2){
   if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   arc_sant_marti ();
  strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true; 
   }
   if(targeta==3){
    if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(blue);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==4){
   if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(purple);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==5){
   if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(taronja);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==6){
      if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(violeta);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==7){
   if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(chocolate);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==8){
      if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(hotpink);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==9){
   if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
    pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(verd_clar);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==10){
      if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(verd_blavos);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==11){
      if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(yellow);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==12){
      if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(violeta_fort);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==13){
      if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
   Serial.println(targeta);
   pixels.setBrightness(brillantor);//fixam la brillantor dels neopixels
   setAll(taronja_claret);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   if(targeta==14){
      if(strID!=strIDtemp){//si la tarja llegida és diferent a la anterior o es la primera que llegeix, posa en marxa la seva funció corresponent
     setAll(blank);
   strIDtemp=strID;//damos a la variable temporal el valor de la última tarjeta leida, así se evita que se reinicie el sonido si se deja la tarjeta sobre el lector
  } return true;
   }
   
  if(targeta==204){
    Serial.println(brillantor);
    brillantor=brillantor+40;
    if (brillantor<=brillantor_max){
    brillantor=brillantor_max;}
    Serial.println(brillantor);
   strIDtemp=strID;
   }
    if(targeta==205){
    Serial.println(brillantor);
    brillantor=brillantor-40;
    if (brillantor<=brillantor_min){
    brillantor=brillantor_min; }
    Serial.println(brillantor);
  strIDtemp=strID;
   }


 //delay(1000);
 Temps_ara = millis();
 while(millis() < Temps_ara+t_aturat){
  }
}}
bool validateCard(String usercard) {
  if(usercard.indexOf("A6:F4:49:29") >= 0) { 
  targeta=1;
  return true;
  }
  else if(usercard.indexOf("A5:5F:96:28")>= 0) {
  targeta=2;
  return true;
  }
  else if(usercard.indexOf("D8:4B:83:1A") >= 0) {
  targeta=3;
  return true;
  }
  else if(usercard.indexOf("D0:27:9F:0A") >= 0) {
  targeta=4;
  return true;
  }
  else if(usercard.indexOf("F3:6E:17:3E") >= 0) {
  targeta=5;
  return true;
  }
  else if(usercard.indexOf("E0:47:D8:30") >= 0) {
  targeta=6;
  return true;
  }
  else if(usercard.indexOf("D0:BC:B2:0A") >= 0) {
  targeta=7;
  return true;
  }
  else if(usercard.indexOf("C3:63:10:3E") >= 0) {
  targeta=8;
  return true;
  }
  else if(usercard.indexOf("E4:0C:6F:31") >= 0) {
  targeta=9;
  return true;
  }
  else if(usercard.indexOf("F9:30:2F:C2") >= 0) {
  targeta=10;
  return true;
  }
  else if(usercard.indexOf("19:F2:35:C2") >= 0) {
  targeta=11;
  return true;
  }
  else if(usercard.indexOf("B7:94:C7:5F") >= 0) {
  targeta=12;
  return true;
  }
  else if(usercard.indexOf("2A:7D:7C:80") >= 0) {
  targeta=13;
  return true;
  }
  else if(usercard.indexOf("19:A3:01:B9") >= 0) {
  targeta=14;
  return true;
  }
  if(usercard.indexOf("19:5B:47:A2") >= 0) {
  targeta=204;
  return true;
  }
  if(usercard.indexOf("F9:F3:49:A2") >= 0) {
  targeta=205;
  return true;
  }
  }
//funció per donar color a la tira en funció dels colors definits
void setAll(uint32_t color) {
  for(int i=0;i<NUMPIXELS;i++){
    pixels.setPixelColor(i, color);
    pixels.show();
  Temps_ara = millis();
 while(millis() < Temps_ara+10){
  }
  }
}


//funció llamp. 
void llamp(){
for(int x=0; x<num_llamps;x++){
for (int i=1; i<NUMPIXELS;i++){
 pixels.setPixelColor(i, pixels.Color(0, 0, 0));
 pixels.show();
  } 
for (int i=1; i<NUMPIXELS+1;i++){
  pixels.setPixelColor(i-1, pixels.Color(0, 0, 0));  
  pixels.setPixelColor(i, pixels.Color(255, 255, 255));
  pixels.setPixelColor(i+1, pixels.Color(255, 255, 255));
  pixels.setPixelColor(i+2, pixels.Color(255, 255, 255));
  pixels.setPixelColor(i+3, pixels.Color(255, 255, 255));
  pixels.show();//encendemos el led
 Temps_ara = millis();
 while(millis() < Temps_ara+t_llamp){
  }
    }
   for (int i=1; i<NUMPIXELS;i++){
  pixels.setPixelColor(i, pixels.Color(255, 255, 255));
  pixels.show();
     }


 Temps_ara = millis();
 while(millis() < Temps_ara+150){
  }
    for (int i=1; i<NUMPIXELS;i++){
   pixels.setPixelColor(i, pixels.Color(0, 0, 0));
   pixels.show();
    }
 Temps_ara = millis();
 while(millis() < Temps_ara+11000){
  }
    }
    for (int i=1; i<NUMPIXELS;i++){
   pixels.setPixelColor(i, pixels.Color(0, 18, 35));
   pixels.show();
   Temps_ara = millis();
 while(millis() < Temps_ara+20){
  }
    }  
}
//fi funció llamp


//funció arc de Sant Martí
void arc_sant_marti (){
//primer apaga la tira
  for (int i=1; i<NUMPIXELS;i++){
  pixels.setPixelColor(i, pixels.Color(0, 0, 0));
  pixels.show();
  }  
// omple de color la tira per trams   
  for (int i=0; i<9;i++){//lila
  pixels.setPixelColor(i, pixels.Color(255, 0, 0));
  pixels.show();
 Temps_ara = millis();
 while(millis() < Temps_ara+t_on){
  }
  } 
  for (int i=9; i<19;i++){//vermell
  pixels.setPixelColor(i, pixels.Color(255, 45, 0));
  pixels.show();
   Temps_ara = millis();
 while(millis() < Temps_ara+t_on){
  }
  } 
  for (int i=19; i<29;i++){//taronja
  pixels.setPixelColor(i, pixels.Color(255, 117, 0));
  pixels.show();
 Temps_ara = millis();
 while(millis() < Temps_ara+t_on){
  }
  }
  for (int i=29; i<39;i++){//groc
  pixels.setPixelColor(i, pixels.Color(0,255, 0));
  pixels.show();
  Temps_ara = millis();
 while(millis() < Temps_ara+t_on){
  }
  }
  for (int i=39; i<49;i++){//verd
  pixels.setPixelColor(i, pixels.Color(0,0, 255));
  pixels.show();
 Temps_ara = millis();
 while(millis() < Temps_ara+t_on){
  }
  }
  for (int i=49; i<60;i++){//blau
  pixels.setPixelColor(i, pixels.Color(214, 0, 193));
  pixels.show();
 Temps_ara = millis();
 while(millis() < Temps_ara+t_on){
  }
   }
   } 
 //fi funció arc de sant marti