Projects

Sistem Informasi Antrian Truk Otomatis Berbasis Arduino Menggunakan RFID Dengan SMS Gateway

Truk adalah sebuah kendaraan bermotor untuk mengangkut barang material dalam ukuran besar dan berat. Dibalik itu truk sangatlah membutuhkan tempat parkir sebagai tempat singgah pada proses antri pembongkaran material. Permasalahannya adalah sering terjadinya kapasitas tempat parkir di PT. Indocement Tunggal Prakarsa Tbk overload sehingga antrian truk pembongkaran material penuh dan antrian menjadi panjang yang menyebabkan proses produksi terhambat. Untuk itu penulis membuat alat SISTEM INFORMASI ANTRIAN TRUK OTOMATIS BERBASIS ARDUINO MENGGUNAKAN RFID DENGAN SMS GATEWAY. Yang bertujuan untuk mencegah terjadinya penumpukan antrian truk pembongkaran material yang disebabkan kapasitas tempat parkir overload.

Dalam perancangan dan implementasi Prototype Sistem Informasi antrian truk otomatis berbasis Arduino Uno Atmega 328P sebagai mikrokontroler yang mengendalikan sistem secara keseluruan. Untuk menunjang sistem kerja, penelitian dilengkapi dengan Sensor ultrasonik HC-SR04 untuk menutup portal otomatis setelah kendaraan melewati sensor dan berfungsi sebagai penghitung truk yang sudah selesai bongkar material. Sensor ultrasonik HC-SR04 juga berfungsi sebagai mendeteksi truk yang masuk kemudian mengirimkan data ke arduino untuk di proses untuk mengirimkan sms antrian truk ke pengemudi menggunakan modul SIM800L. Sensor LDR mendeteksi keberadaan truk di slot parkir, kemuadian mengirim data tersebut ke arduino untuk di proses dan ditampilkan di LCD, tampilan LCD berupa tulisan Slot parkir yang terisi dan kosong jika sudah terisi penuh akan menampilkan berupa tunggu. RFID berfungsi untuk membuka portal otomatis terbagi atas 2 bagian yaitu Reader dan Tag. Reader digunakan untuk membaca Tag sedangkan Tag berisi data atau informasi pengemudi yang diperoleh saat registrasi. Tag digunakan untuk membuka portal masuk ataupun keluar area parkir dengan cara mendekatkan Tag ke Reader otomatis portal terbuka, LED dan Buzzer sebagai notifikasi bahwa Tag terdeteksi maupun tidak terdaftar, dan motor servo dikontrol arduino untuk menggerakan portal.

Dengan demikian perancangan sistem Informasi antrian truk otomatis berbasis arduino uno dengan menggunakan RFID dengan Sms Gateway mampu menjadi solusi untuk mencegah terjadinya penumpukan antrian pembongkaran material, tertib dan rapih dalam memarkirkan kendaraanya. Dan keamanan diharapkan meningkat secara efektif dengan adanya sitem RFID.

Skematik Rangkaian

Source Code Program

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PN532.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <SoftwareSerial.h>


Servo myServo1;
SoftwareSerial mySerial(12,13);

#define PN532_SCK  (2)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)

#define servoPin  6
#define portCount A0
#define led       A1

Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
LiquidCrystal_I2C lcd(0x27, 16, 2);





byte dat1, dat2, dat3, dat4;
void setup(void) {
  Serial.begin(115200);
  pinMode(portCount, OUTPUT);
  pinMode(led, OUTPUT);
  digitalWrite(portCount, HIGH);
  
  mySerial.begin(9600);
  
  Serial.println("Hello!");
  myServo1.attach(servoPin);
  myServo1.write(90);
  
  lcd.begin();
  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }
  // Got ok data, print it out!
  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
  
  // configure board to read RFID tags
  nfc.SAMConfig();
  
  Serial.println("Waiting for an ISO14443A Card ...");
}

String dataRfid="";
int mCount=0;

void kirimData(int myStatus, int count){
  mySerial.print(myStatus);
  mySerial.print('#');
  mySerial.print(count);
  mySerial.print('\n');
}

void loop(void) {
  uint8_t success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)

  uint8_t dataSrf;
  
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  
  kirimData(0,mCount);
  if (success) {
    Serial.println("Found an ISO14443A card");
    Serial.print("  UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("  UID Value: ");nfc.PrintHex(uid, uidLength);
    
    Serial.println("");

    for(int i=0; i<uidLength; i++ ){
      if(i==0)dat1= uid[i];
      if(i==1)dat2= uid[i];
      if(i==2)dat3= uid[i];
      if(i==3)dat4= uid[i];
    }
    
    lcd.setCursor(0,0);lcd.print(dat1,HEX);
    lcd.setCursor(3,0);lcd.print(dat2,HEX);
    lcd.setCursor(6,0);lcd.print(dat3,HEX);
    lcd.setCursor(9,0);lcd.print(dat4,HEX);lcd.print(" ");
    
    Serial.print(dat1, HEX);
    Serial.print(" ");
    Serial.print(dat2, HEX);
    Serial.print(" ");
    Serial.print(dat3);
    Serial.print(" ");
    Serial.println(dat4);

//    if(((dat1==0x04)&&(dat2==0xA1)&&(dat3==0xAA)&&(dat4==0xE2)) || //1
//       ((dat1==0x04)&&(dat2==0xA8)&&(dat3==0xAA)&&(dat4==0xE2)) || //2
//       ((dat1==0x04)&&(dat2==0xAF)&&(dat3==0xAA)&&(dat4==0xE2)) || //3
//       ((dat1==0x04)&&(dat2==0xB7)&&(dat3==0xAA)&&(dat4==0xE2)) || //4
//       ((dat1==0x04)&&(dat2==0xBE)&&(dat3==0xAA)&&(dat4==0xE2)) || //5
//       ((dat1==0x04)&&(dat2==0xCA)&&(dat3==0xA9)&&(dat4==0xE2)))   //6
//    {
//      Serial.println("Registered..");
//      myServo1.write(180);
//      delay(5000);
//      myServo1.write(90);
//      
//      digitalWrite(portCount, LOW);
//      delay(1000);
//      lcd.clear();
//      digitalWrite(portCount, HIGH);
//    }

    if((dat1==0x04)&&(dat2==0xA1)&&(dat3==0xAA)&&(dat4==0xE2)){//1
      Serial.println("Registered..");
      myServo1.write(180);
      digitalWrite(led, HIGH);
      delay(5000);
      digitalWrite(led, LOW);
      myServo1.write(90);

      lcd.setCursor(0,1);lcd.print("F 11 F");
      digitalWrite(portCount, LOW);
      delay(1000);
      lcd.clear();
      digitalWrite(portCount, HIGH); 
    }

    else if((dat1==0x04)&&(dat2==0xA8)&&(dat3==0xAA)&&(dat4==0xE2)){//2
      Serial.println("Registered..");
      myServo1.write(180);
      digitalWrite(led, HIGH);
      delay(5000);
      digitalWrite(led, LOW);
      myServo1.write(90);

      lcd.setCursor(0,1);lcd.print("F 12 F");
      digitalWrite(portCount, LOW);
      delay(1000);
      lcd.clear();
      digitalWrite(portCount, HIGH);   
    }

    else if((dat1==0x04)&&(dat2==0xAF)&&(dat3==0xAA)&&(dat4==0xE2)){//3
      Serial.println("Registered..");
      myServo1.write(180);
      digitalWrite(led, HIGH);
      delay(5000);
      digitalWrite(led, LOW);
      myServo1.write(90);

      lcd.setCursor(0,1);lcd.print("F 13 F");
      digitalWrite(portCount, LOW);
      delay(1000);
      lcd.clear();
      digitalWrite(portCount, HIGH);   
    }

    else if((dat1==0x04)&&(dat2==0xB7)&&(dat3==0xAA)&&(dat4==0xE2)){//4
      Serial.println("Registered..");
      myServo1.write(180);
      digitalWrite(led, HIGH);
      delay(5000);
      digitalWrite(led, LOW);
      myServo1.write(90);

      lcd.setCursor(0,1);lcd.print("F 14 F");
      digitalWrite(portCount, LOW); 
      delay(1000);
      lcd.clear();
      digitalWrite(portCount, HIGH);  
    }

    else if((dat1==0x04)&&(dat2==0xBE)&&(dat3==0xAA)&&(dat4==0xE2)){//5
      Serial.println("Registered..");
      myServo1.write(180);
      digitalWrite(led, HIGH);
      delay(5000);
      digitalWrite(led, LOW);
      myServo1.write(90);

      lcd.setCursor(0,1);lcd.print("F 15 F");
      digitalWrite(portCount, LOW);
      delay(1000);
      lcd.clear();
      
      digitalWrite(portCount, HIGH);   
    }

    else if((dat1==0x04)&&(dat2==0xCA)&&(dat3==0xA9)&&(dat4==0xE2)){//6
      Serial.println("Registered..");
      myServo1.write(180);
      digitalWrite(led, HIGH);
      delay(5000);
      digitalWrite(led, LOW);
      myServo1.write(90);

      lcd.setCursor(0,1);lcd.print("F 16 F");
      digitalWrite(portCount, LOW);
      delay(1000);
      lcd.clear();  
      digitalWrite(portCount, HIGH);   
    }
       
    else{
      lcd.setCursor(0,1);lcd.print("Not Registered");
      Serial.println("Not Registered");
    }
    
    if (uidLength == 4){
      Serial.println("Seems to be a Mifare Classic card (4 byte UID)");
      Serial.println("Trying to authenticate block 4 with default KEYA value");
      uint8_t keya[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
      
      success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 4, 0, keya);
      
      if (success){
        Serial.println("Sector 1 (Blocks 4..7) has been authenticated");
        uint8_t data[16];
        success = nfc.mifareclassic_ReadDataBlock(4, data);
        if (success){
          
          
          Serial.println("Reading Block 4:");
          nfc.PrintHexChar(data, 16);
          Serial.println("");
          delay(1000);
        }
        else{
          Serial.println("Ooops ... unable to read the requested block.  Try another key?");
        }
      }
      else
      {
        Serial.println("Ooops ... authentication failed: Try another key?");
      }
    }

    /*
    if (uidLength == 7){
      Serial.println("Seems to be a Mifare Ultralight tag (7 byte UID)");
      
      // Try to read the first general-purpose user page (#4)
      Serial.println("Reading page 4");
      uint8_t data[32];
      success = nfc.mifareultralight_ReadPage (4, data);
      if (success){
        // Data seems to have been read ... spit it out
        nfc.PrintHexChar(data, 4);
        Serial.println("");
        
        // Wait a bit before reading the card again
        delay(1000);
      }
      else
      {
        Serial.println("Ooops ... unable to read the requested page!?");
      }
    }
    */
  }
}

Source Code Program Arduino Pro Mini

#include <SoftwareSerial.h>
#include <Sim800l.h>
#include <EEPROM.h>

#define echoPin 6
#define trigPin 7

#define PN532_SCK  (6)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)

#define portCount1   A0
#define portCount2   A1

Sim800l Sim800l;

String textSms;
char* number;
bool error;

char messages[180];
String data1, data2;

char isiSms[10];

int dataSrf;

int vehicleCount;
int eeCount;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
    
  pinMode(portCount1, INPUT_PULLUP);
  pinMode(portCount2, INPUT_PULLUP);
  
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
    
  number= "081211712238";
  
  Sim800l.begin();
  Sim800l.delAllSms();

  error=Sim800l.sendSms(number,"Hello...sms getting ready!");
  Serial.print("SIM808:");Serial.println(error);

  //EEPROM.write(0,0);//======================================================================================================
  
}

int readSrf(){
  long duration=0;
  int distance=0;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance= duration*0.034/2;

  return distance;
  
}

int inputVeh1,inputVeh2;
char charVehCount[12];

void loop() {  
  inputVeh1= digitalRead(portCount1);
  inputVeh2= digitalRead(portCount2);

    
  dataSrf= readSrf();
  Serial.print("Data Srf:");Serial.println(dataSrf);
  
  if(inputVeh1==0){
    delay(500);
    vehicleCount= vehicleCount+1;
    EEPROM.write(0, vehicleCount); 
    Serial.print("Vehicle:");Serial.println(vehicleCount);
  }

  
  if(inputVeh2==0){
    delay(500);
    vehicleCount= vehicleCount-1;
    EEPROM.write(0, vehicleCount);
    Serial.print("Vehicle:");Serial.println(vehicleCount); 
  }

  eeCount= EEPROM.read(0);
  
  //dtostrf(vehicleCount, 4, 0, charVehCount);

  dtostrf(eeCount, 4, 0, charVehCount);
  sprintf(messages, "Selamat datang!!! Antrian di dalam ada= %s\n", charVehCount);

  
  if(dataSrf<=5){
    Sim800l.sendSms(number,messages);
    Serial.print("Send Sms:");Serial.println(messages);  
  }
  delay(500);
}

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button