Project tutorial
RFID Desk Lamp

RFID Desk Lamp © CC BY

Supersede your old desk lamp with a new one controlled by an RFID tag or card and personalize it with an RGB color pattern to turn it off.

  • 1,863 views
  • 0 comments
  • 4 respects

Components and supplies

Necessary tools and machines

09507 01
Soldering iron (generic)
Hot glue gun

Apps and online services

About this project

Description

I have had an old and, not surprisingly, a dilapidated desk lamp for a long time and I thought it would be more effective and useful by getting upgraded with an MFRC522 RFID reader. But I, also, wanted to personalize it by using a specialized color pattern to turn the lamp off, hence the use of potentiometers and RGB LED.

To support my projects and articles, you can visit my website here :)

How to Use an MFRC522 RFID Reader

First of all, download MFRC522 library from this link.

1 ) Solder male headers to MFRC522 RFID reader with a soldering iron carefully.

2 ) If you do not save or register an UID to EEPROM, use the function - registerCardUID() - below by uncommenting it from setup().

3 ) After saving get the UID from EEPROM by using this function.

4 ) And the final step, just compare the saved UID and the UID read by MFRC522 to turn the lamp and control LED on.

Connections

Components connections are well-explained at the source code down below, make sure defining RST and SS pins properly.

Connect all components to Arduino Nano.

Rearrange your lamp parts to make components fit in it perfectly.

And then, sturdier all components via a hot glue gun.

Features

ON :

When MFRC522 RFID reader reads the same UID saved by EEPROM accurately.

- Turn control LED and the lamp turn on.

OFF :

When all potentiometer values are turned into zero.

Red Potentiometer Value = 0;

Green Potentiometer Value = 0;

Blue Potentiometer Value = 0;

- Turn control LED, RGB LED and the lamp off.

Video

Code

RFID Desk LampArduino
         /////////////////////////////////////////////  
        //           RFID Desk Lamp                //
       //                                         //
      //          ---------------------          //
     //             (Arduino Nano)              //           
    //            by Kutluhan Aktar           // 
   //                                         //
  /////////////////////////////////////////////

// Supersede your old desk lamp with a new one controlled by an RFID tag or card and personalize it with an RGB color pattern to turn the lamp off.
// You can register a new UID with the code below by turning it into uncommented.
// By using three potentiometer, you can adjust RGB led color scheme.
// In this case, for turning the lamp off, you have to make all potentiometer values zero. But, if you want to change this pattern, you can change it in the UID() function.  
// ON :
// When the UID is accurate and controlLed is HIGH.
// OFF :
// Red Potentiometer Value = 0
// Green Potentiometer Value = 0
// Blue Potentiometer Value = 0
// Connections
// Arduino Nano :           
//                                MFRC522
// Pin 9  ----------------------- RST
// Pin 10 ----------------------- SDA
// Pin 11 ----------------------- MOSI
// Pin 12 ----------------------- MISO
// Pin 13 ----------------------- SCK
//                                Control Led
// Pin 7  -----------------------
//                                RGB
// Pin 3  -----------------------
// Pin 5  -----------------------
// Pin 6  -----------------------
//                                2-Way Relay
// Pin 8  -----------------------
//                                Potentiometer (Red)
// Pin A0 -----------------------
//                                Potentiometer (Green)
// Pin A1 -----------------------
//                                Potentiometer (Blue)
// Pin A2 -----------------------

#include <EEPROM.h>     // We are going to read and write PICC's UIDs from/to EEPROM
#include <SPI.h>        // RC522 Module uses SPI protocol
#include <MFRC522.h>  // Library for Mifare RC522 Devices

// Create MFRC522 instance.
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

// Define MFRC5222 module key input.
MFRC522::MIFARE_Key key;

// Define the process controller and readCard byte.
int successUID;
byte readCard[4];

// Define openUID and lastRead strings.
String openUID;
String lastRead;

// Examine whether the UID is true or not.
boolean UIDisTrue = false;
int red;
int green;
int blue;

// Define RGB led control led pins.
#define redPin 3
#define greenPin 5
#define bluePin 6
#define controlLed 7
#define relay 8

// Define potentiometer pins.
#define pot_r A0
#define pot_g A1
#define pot_b A2

void setup()
{
  //Protocol Configuration
  Serial.begin(9600);  // Initialize serial communications with PC
  SPI.begin();           // MFRC522 Hardware uses SPI protocol
  mfrc522.PCD_Init();    // Initialize MFRC522 Hardware

  // If you do not register a new UID to EEPROM yet, reload the code after turning these lines into uncommented.
  
  // Save the new card or key tag UID to EEPROM. But do not forget it only has 1KB memory.
  // Serial.print("Approximate the new card or key tag to scan and register new UID.");
  // do{
  // Wait for the new card reading process.
  // successUID = registerCardUID();
  // }while(!successUID);

  // Get the open UID from EEPROM.
  getUIDfromEEPROM();
  Serial.print("UID is received from EEPROM :\n----------------------------------\n");
  Serial.print(openUID);

  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(controlLed, OUTPUT);
  pinMode(relay, OUTPUT);
}

void loop(){
// Turn relay and controlLed off.
digitalWrite(relay, HIGH);
digitalWrite(controlLed, LOW);
// Get potentiometer data from 0 to 255.
readPotentiometer();
// Adjust RGB led colors in regard to potentiometer values.
adjustColor(red, green, blue);
// Open the desk lamp if the UID is accurate.
UID();

}

int UID(){
  // Get the last UID from MFRC522.
  if ( ! mfrc522.PICC_IsNewCardPresent()){
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()){
    return;
  }
    for(int i=0;i<mfrc522.uid.size;i++){
    lastRead += mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ";
    lastRead += String(mfrc522.uid.uidByte[i], HEX);
    }
    // Arrange lastRead for comparing.
    lastRead.trim();
    lastRead.toUpperCase();

  
  // Activate relay and controlLed if the UID is accurate.
  if(lastRead == openUID){
    UIDisTrue = true;
    while(UIDisTrue == true){
      // Get potentiometer data from 0 to 255.
      readPotentiometer();
      // Adjust RGB led colors in regard to potentiometer values.
      adjustColor(red, green, blue);
      // Turn relay and controlLed on.
      digitalWrite(controlLed, HIGH);
      digitalWrite(relay, LOW);
      // Turn relay and controlLed off.
      if(red == 0 && green == 0 && blue == 0){
        UIDisTrue = false;
        // Dump lastRead.
        lastRead = "";
        }
      }
    }
}

int readPotentiometer(){
  red = map(analogRead(pot_r), 0, 1023, 0, 255);
  green = map(analogRead(pot_g), 0, 1023, 0, 255);
  blue = map(analogRead(pot_b), 0, 1023, 0, 255);
  }

void adjustColor(int r, int g, int b){
 r = 255 - r;
 g = 255 - g;
 b = 255 - b;
 analogWrite(redPin, r);
 analogWrite(greenPin, g);
 analogWrite(bluePin, b);
}

int registerCardUID() {
  // Detect the new card UID. 
  if ( ! mfrc522.PICC_IsNewCardPresent()) { 
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return 0;
  }

  // Display the new UID.
  Serial.print("\n----------------------------------\nNew Card or Key Tag UID : ");
  for (int i = 0; i < mfrc522.uid.size; i++) {  //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
  }
  Serial.print("\n----------------------------------\n");
  
  // Save the new UID to EEPROM. 
  for ( int i = 0; i < mfrc522.uid.size; i++ ){
   EEPROM.write(i, readCard[i] );
  }
  Serial.print("UID is saved successfully to EEPROM.\nIf you want to save another card, use i+4(...) instead i.");
  
  // If the card reading process is successful, return 1 and end the reading process.
  mfrc522.PICC_HaltA();
  return 1;
}

int getUIDfromEEPROM(){
  // Get the open UID from EEPROM.
  for(int i=0;i<4;i++){
    openUID += EEPROM.read(i) < 0x10 ? " 0" : " ";
    openUID += String(EEPROM.read(i), HEX);
    }
  // Arrange openUID for comparing.
  openUID.trim();
  openUID.toUpperCase();
  }

Custom parts and enclosures

Fritzing file
rfid_desk_lamp_OR0i1feepp.fzz

Schematics

Schematics
Rfid desk lamp dqtaviecqf

Comments

Similar projects you might like

Remote Lamp

Project tutorial by Kutluhan Aktar

  • 2,196 views
  • 0 comments
  • 7 respects

"Living Art" Arduino-Controlled Desk Lamp

Project tutorial by Modustrial Maker

  • 8,700 views
  • 2 comments
  • 25 respects

Integrated Solar ChargeController, Inverter, PowerBank, Lamp

Project tutorial by Shahariar

  • 7,733 views
  • 16 comments
  • 30 respects

The Vibrating Pressure Temperature Altitude Tilt Detector

Project tutorial by Kutluhan Aktar

  • 558 views
  • 0 comments
  • 4 respects

Alexa Controlled Desk Lamp

Project tutorial by Pop Gheorghe

  • 701 views
  • 0 comments
  • 1 respect

Wireless LED Lamp with IR Remote Control

Project showcase by Peter Wallhead

  • 4,573 views
  • 2 comments
  • 16 respects
Add projectSign up / Login