Medium Basics Project 004d 28 BYJ - 48 Stepper Motor with LEDs, LCD1602 I2C and RFID RC522

of Acoptex.com in UNO

Basics: Project 004d

Project name: 28 BYJ - 48 Stepper Motor with LEDs and LCD1602 I2C

Attachments: libraries and program

In this project, you needed these parts :

1.Aruduino Uno R3 (you can also use the other version of Arduino)

2.BYJ 48 Stepper Motor

3.Arduino IDE ( you can download it from here  )

4.Jumper cables

5.ULN2003 stepper motor driver board

6. LEDs 3 pcs (1 Blue, 1 Green, 1 Red)

7. Resistors 3 pcs (220 Om each)

8. LCD1602 module

9. MFRC522 13.56Mhz IC or RFID RC522 module


8. Breadboard

10. Breadboard


Understanding the stepper motors

See more details here. We will use unipolar stepper motor 28BYJ-48 for this project.

There are many types of drivers - L293, ULN2003, A3967SLB and more. 

The 28BYJ-48 even comes with breakout using ULN2003 as a motor driver chip.

Understanding LCD 1602 module

 See more details here - check this project

Understanding RFID RC522 module

 See more details here.

Signals and contacts stepper motor, ULN2003 module, LEDs, LCD 1602 module, RFID RC522 module 

Signals and connections of stepper motor, ULN2003 module, LEDs  you can find here.

Signals and connections of LCD1602 module you can find here.

Signals and connections of RFID RC522 module you can find here.


The following table and picture shows the needed connections with the Arduino Uno.

The following table and picture shows the needed connections with the Chinese Uno.

See the video here: https://youtu.be/XDKfneRjF94

Step by Step instruction

  1. Plug your Adruino Uno board into your PC and select the correct board and com port
  2. Find your I2C address. Each device has an I2C address that it uses to  accept commands or send messages. Load the sketch over at http://arduino.cc/playground/Main/I2cScanner and follow the instructions to use it.  By opening up the Serial monitor window after you upload the sketch, Arduino will scan the address range looking for a reply.  Even though the documentation said it was 0x27, this scanner can detect different (in my case 0x3F)
  3. Modify the sketch in attachments above (you can use the sketch below too): the line LiquidCrystal_I2C lcd (0x 3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE) (See part marked bold)
  4. You must take something in consider: 28BYJ-48 has a gear ratio of 64 and stride angle 5.625 so this motor has a 4096 Steps. Number of Steps in one revolution= 360/stride angle=360/5.625=64. Steps =Number of steps in One Revolution * Gear ratio. Steps= (360/5.625)*64 = 64 * 64 =4096 - this value will substitute it in the arduino sketch. 
  5. For Adafruit Stepper Motor the stride angle 7.5 and gear ratio is 16. So number of steps in 1 revolution will be : steps in One Revolution  = 360 / 7.5 = 48. Steps= 48 * 16 = 768. It will be different depending on what motor you are using so check the datasheet for your stepper motor to calibrate these values.
  6. Open up serial monitor and set your baud to 9600 baud.
  7. Scan your card, you will see a bunch of numbers pop out.
  8. Copy only the number and paste it to the column after "int cards[][5] = { " - replace with your card number or numbers, space them with ',' for example my cards were: 0 64 134 25 223}. You can add many cards here. 
  9. Verify and upload the the sketch to your Adruino Uno.



  • See attachments on the begining of this project description.
  • The Stepper, SPI and Wire library included in Adruino IDE program which installed in your PC.
  • You will need to unzip and add the RFID library to libraries in your PC, for example C:\Users\toshiba\Documents\Arduino\libraries
  • I have used the library - NewliquidCrystal_1.3.4.zip which I downloaded, unzipped, changed the name of folder to LiquidCristal and added to libraries, for example C:\Users\toshiba\Documents\Arduino\libraries. This link you can find in Preferences of Adruino IDE program which installed in your PC.
  • If you have LiquidCristal folder in this location already - delete this folder and copy folder, which was made by you, to this location.


 name: BYJ48 Stepper motor code
 function: This program drives a unipolar or bipolar stepper motor and can be used for security system. LCD1602 module and 3 LEDs show the  status of operation. The motor steps and motor speed can be adjusted easily to suit your needs.
// include the library code
#include <Stepper.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <RFID.h>
#define motorSteps 64     // change this depending on the number of steps
// per revolution of your motor
#define motorPin1 8
#define motorPin2 4
#define motorPin3 3
#define motorPin4 5
#define ledPin1 6
#define ledPin2 7
#define ledPin3 2
#define SS_PIN 10
#define RST_PIN 9
// initialize of the Stepper library:
Stepper myStepper(motorSteps, motorPin1, motorPin2, motorPin3, motorPin4);
// initialize of the RFID library:
// initialise the LCD1602 I2C:
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// definition of cards:
int power = 8;
int serNum[5];
int cards[][5] = {
  {0, 64, 134, 25, 223}, //Card 1
bool access = false;
void setup() {
  // set the motor speed at 200 RPMS:
  // Initialize the Serial port:
  // Initialize the SPI and RFID:
  // set up Green and Red LED pins:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  // set up the system status blue LED pin:
  pinMode(ledPin3, OUTPUT);
  //Define the LCD as 16 column by 2 rows
  lcd.begin (16, 2);
  //Switch on the backlight
void loop() {
  //goto column 4 and first line
  lcd.setCursor(4, 0);
  // Print at cursor Location:
  //goto column 2 and second line
  lcd.setCursor(2, 1);
  digitalWrite(ledPin3, HIGH);
  if (rfid.isCard()) {
    if (rfid.readCardSerial()) {
      Serial.print(" ");
      Serial.print(" ");
      Serial.print(" ");
      Serial.print(" ");
      for (int x = 0; x < sizeof(cards); x++) {
        for (int i = 0; i < sizeof(rfid.serNum); i++ ) {
          if (rfid.serNum[i] != cards[x][i]) {
            access = false;
          } else {
            access = true;
        if (access) break;
    if (access) {
      // Opening the door:
      // blink the system status blue LED 2 times:
      digitalWrite(ledPin3, HIGH);
      lcd.setCursor(4, 0);
      lcd.setCursor(2, 1);
      // Access LED - green - on:
      digitalWrite(ledPin1, HIGH);
      // Delay set to pass the door = 5000 miliseconds = 5 seconds:
      lcd.setCursor(2, 0);
      lcd.print("PASS THE DOOR");
      lcd.setCursor(2, 1);
      Serial.println("PASS THE DOOR");
      // Closing the door:
      lcd.setCursor(4, 0);
      lcd.setCursor(2, 1);
      // blink the LED 2 times:
      digitalWrite(ledPin3, HIGH);
      // Access LED - green - off:
      digitalWrite(ledPin1, LOW);
      digitalWrite(power, LOW);

    } else {
      // No access - wrong card:
      Serial.println("NO ACCESS");
      lcd.setCursor(3, 0);
      lcd.print("NO ACCESS");
      lcd.setCursor(2, 1);
      // No access LED - red - on:
      digitalWrite(ledPin2, HIGH);
      // No access LED - red - off:
      digitalWrite(ledPin2, LOW);
      digitalWrite(power, LOW);
// Blink the blue LED:
void blink(int howManyTimes) {
  int i;
  for (i = 0; i < howManyTimes; i++) {
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin3, LOW);

Other projects of Acoptex.com
Easy Basics: Project 101a Ai Thinker A9G GPRS GPS development board of Acoptex.com, Not selected 23-11-2019
Easy Basics: Project 100a Ai Thinker A9 GSM GPRS development board of Acoptex.com, Not selected 22-11-2019

Published at 02-05-2017
Viewed: 3582 times