Smart Home Alarm System using Arduino and GSM Module

https://youtu.be/Fd2ERDL3Jbc

1. Identifikasi Masalah

Rumah yang kosong sering kali menjadi momok bagi sebagian orang karena dengan begitu menjadi target para maling atau pencuri terutama apabila rumah bukan berada pada kompleks yang dilengkapi dengan satpam. Kurangnya pengawasan menjadi celah pencuri untuk masuk dan membobol rumah. Pengawasan paling mudah untuk saat ini biasanya menggunakan CCTV yang dihubungkan ke jaringan internet sehingga dapat diakses online dimana saja. Namun, melihat CCTV secara terus menerus ketika sedang berada di luar rumah bukan merupakan hal praktis yang dilakukan. Dibutuhkan adanya sistem yang dapat memberikan sinyal atau alert apabila ada seseorang yang tidak diharapkan (terutama penyusup atau maling) yang memasuki rumah yang sedang tidak ada penghuninya, sehingga pemilik rumah dapat dengan segera menghubungi emergency call atau secara langsung mengecek keadaan rumah yang sebenarnya.

2. Alternatif pemecahan masalah

Berikut adalah alternatif solusi dari masalah yang kami usulkan.

Alternatif solusi pertama adalah membeli layanan home security system, yang diberikan oleh berbagai macam provider. Namun, masalah utama dari solusi ini adalah biaya yang sangat tinggi. Untuk mendapatkan layanan home security system, rata-rata yang harus dibayar di muka adalah sekitar $200, dengan biaya $10 per bulan penggunaan. Biaya yang tinggi ini yang menyebabkan appeal home security system sebagai solusi berkurang, walaupun reliabilitas dan tingkat keamanan dari layanan-layanan tersebut sudah terjamin kualitasnya.

Selain itu, dapat dilakukan instalasi CCTV di rumah. Seperti halnya dengan home security system, layanan CCTV juga mengalami kendala di biaya tinggi di muka, dengan instalasi sistem CCTV dasar dapat mencapai biaya sekitar $290. Selain itu, layanan CCTV memiliki satu kendala lain, yaitu pengguna masih harus mengawasi CCTV tersebut. Hal ini dapat mengurangi kualitas keamanan yang ditawarkan karena pengguna tidak dapat selalu mengawasi CCTV.

Solusi lain yang dapat dilakukan adalah dengan menggunakan smart electronic lock. Kunci elektronik ini akan menjamin kunci pintu atau pagar rumah tidak terbobol dengan mudah, dengan harga yang relatif tinggi tapi masih lebih terjangkau dibandingkan instalasi CCTV atau home security system, dengan rata-rata biaya instalasi sekitar $150. Namun, smart electronic lock memiliki satu masalah, yaitu pencuri masih dapat mendapatkan akses ke dalam rumah dengan metode lain, seperti membobol jendela atau memanjat pagar. Maka dari itu reliabilitas dan kualitas keamanan yang ditawarkan tidak sebanding dengan biaya yang harus dikeluarkan.

Home Security Options Price Reliability Security Total
DIY Home Security System dengan Arduino 5/5 3/5 3/5 11
Membeli Home Security System Kit 1/5 4/5 5/5 10
Home CCTV 1/5 5/5 4/5 10
Smart Electronic Lock 2/5 3/5 3/5 8

 

Standar Pengukuran :

  1. Price : Total biaya yang dikeluarkan untuk implementasi layanan. Semakin tinggi poin berarti semakin murah biaya implementasi layanan.
  2. Reliability : Kemungkinan terjadinya kesalahan pada layanan. Semakin tinggi poin berarti layanan memiliki kemungkinan lebih rendah untuk terjadi kesalahan.
  3. Security : Tingkat keamanan yang ditawarkan oleh layanan. Semakin tinggi poin berarti semakin baik keamanan yang ditawarkan layanan.

 

3. Spesifikasi Desain

Input:

  1. Masukan tombol keypad (1 char)
  2. Password (string), panjang tergantung pengguna
  3. Masukan sensor PIR (boolean)
  4. Nomor telepon (string), panjang tergantung

Output:

  1. Lampu LED
  2. Buzzer: 1KHz sound signal
  3. Panggilan telepon

Komponen:

  1. Arduino UNO
  2. Keypad 4×4 (digunakan 4×3 saja)
  3. Sensor PIR
  4. Modul GSM beserta kartu SIM
  5. 2 buah 5V LED
  6. Buzzer
  7. Kabel Jumper (male-to-male dan male-to-female)
  8. 1 kabel USB 2.0 (penghubung Arduino ke komputer)
  9. 1 kabel Micro-USB (untuk sumber daya modul GSM)
  10. Resistor 220 Ohm

Protokol:

  1. UART (Universal Asynchronous Reception and Transmission)

Protokol komunikasi sederhana yang memungkinkan Arduino untuk berkomunikasi dengan perangkat serial.

 

Dalam sistem ini, protokol UART digunakan oleh Arduino untuk berkomunikasi dengan komputer lewat port 0 dan 1-nya, dan juga oleh modul GSM untuk berkomunikasi dengan Arduino lewat port 2 dan 3 (dimungkinkan oleh library SoftwareSerial)

 

  1. GSM (Global System for Mobile communications)

Standar yang dikembangkan oleh ETSI (European Telecommunications Standards Institute) untuk mendeskripsikan protokol jaringan digital seluler generasi kedua (2G) yang digunakan oleh perangkat seluler seperti telepon genggam dan tablet.

 

Digunakan oleh modul GSM untuk melakukan panggilan telepon ke nomor yang ditentukan sebagai tanda darurat.

4. Desain perangkat keras

Berikut adalah gambar desain sistem menggunakan Desain Blok dan desain rangkaian arduino dari sistem yang kami buat.

Laporan IMKA Arduino-4.png

Alarm_bb.png

 

5. Desain perangkat lunak

Berikut adalah desain flowchart dari sistem yang kami rancang.

Screen Shot 2019-05-09 at 22.24.17.png

6. Desain user interaction

Berikut adalah gambarrancangan user interface yang berhubungan langsung dengan user. Terdiri dari keypad dan juga call telepon.

S__23265294.jpg

S__23265296.jpg

Screen Shot 2019-05-09 at 23.46.22.png

7. Implementasi perangkat keras

Berikut adalah gambar implementasi sistem dan subsistem dari perangkat yang kami buat.

S__23265296.jpg

S__23265295.jpg

8.Implementasi perangkat lunak

Berikut adalah kode program yang kami buat

#include <Keypad.h>

#include <Password.h>

#include <SoftwareSerial.h>

const byte ROWS = 4; //Empat baris

const byte COLS = 3; //Tiga kolom

 

//Define the keymap

char keys[ROWS][COLS] = {

 {‘1’, ‘2’, ‘3’},

 {‘4’, ‘5’, ‘6’},

 {‘7’, ‘8’, ‘9’},

 {‘*’, ‘0’, ‘#’}

};

 

//Connect keypad ROW0, ROW1, ROW2. ROW3 to these Arduino pins.

byte rowPins[ROWS] = {12, 11, 10, 9};

//Connect keypad ROW0, ROW1, ROW2. ROW3 to these Arduino pins.

byte colPins[COLS] = {8, 7, 6};

//Create the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

 

Password password = Password( “1234” ); //set the password

 

int redPin = A0;                // memilih pin LED merah

int bluePin = A1;              // memilih pin LED biru

int inputPIR = 5;               // memilih pin input (untuk PIR sensor)

int pirState = LOW;             // memulai, asumsi tidak ada gerakan terdeteksi

int buzzer = A2;                 // buzzer diset pada pin 4

int PIR_val = LOW;               // kondisi awal PIR diset mati

bool armed = false;

bool blink = false;

 

SoftwareSerial mySerial(3, 2); // A6 Tx & Rx is connected to Arduino #3 & #2

 

void setup() {

 pinMode(redPin, OUTPUT);      // deklarasi redPin adalah output

 pinMode(bluePin, OUTPUT);     // deklarasi bluePin adalah output

 pinMode(inputPIR, INPUT);     // deklarasi sensor PIR as input

 pinMode(buzzer, OUTPUT); // Pasang buzzer sebagai output

 keypad.addEventListener(keypadEvent); //add an event listener for this keypad

 

 Serial.begin(9600);

 mySerial.begin(9600);

}

 

void loop(){

 keypad.getKey();

 

 PIR_val = digitalRead(inputPIR);  // membaca input value

 if(armed == true){

   if (PIR_val == HIGH) {            // mengecek apakah input PIR sensor HIGH

     if (pirState == LOW) {

       // alarm menyala

       Serial.println(“Motion detected!”);

       blink = true; // Aktivasi lampu merah

       digitalWrite(buzzer, HIGH); // Aktivasi buzzer

       delay(15000); //Durasi buzzer menyala

       digitalWrite(buzzer,LOW); //Matikan buzzer

       // Kita hanya mau mencetak perubahan output, bukan kondisi sekarang

       pirState = HIGH;

       makeCall(); //menelpon nomor yang ditentukan

     }

   } else {

     if (pirState == HIGH) {

       // gerakan tidak terdeteksi lagi

       Serial.println(“Motion ended!”);

       // Kita hanya mau mencetak perubahan output, bukan kondisi sekarang

       pirState = LOW;

     }

   }

   if(blink == true){

     digitalWrite(redPin, HIGH);  // LED merah menyala

     delay(500);

     digitalWrite(redPin, LOW);  // LED merah padam

     delay(500);

   }

 }

}

 

//take care of some special events

void keypadEvent(KeypadEvent eKey){

switch (keypad.getState()){

  case PRESSED:

    Serial.print(“Pressed: “);

    Serial.println(eKey);

    switch (eKey){

      case ‘*’: guessPassword(); break;

      default:

            password.append(eKey);

   }

}

}

 

void guessPassword(){

   if (password.evaluate()){ //evaluasi password yang dimasukkan

         digitalWrite(bluePin,HIGH);

         Serial.println(“Right”); //password benar

         delay(3000);

         digitalWrite(bluePin,LOW);

         password.reset();

         digitalWrite(buzzer, LOW);

         if(armed == false){ //ganti mode

           armed = true;

           PIR_val = LOW;

         }

         else{

           armed = false;

         }

   }else{

         digitalWrite(redPin,HIGH);

         Serial.println(“Wrong”); //password salah

         delay(3000);

         digitalWrite(redPin,LOW);

         password.reset();

         digitalWrite(buzzer, HIGH);

         delay(1000);

         digitalWrite(buzzer, LOW);

         delay(1000);

         digitalWrite(buzzer, HIGH);

         delay(1000);

         digitalWrite(buzzer, LOW);

         delay(1000);

         digitalWrite(buzzer, HIGH);

         delay(1000);

         digitalWrite(buzzer, LOW);

   }

}

 

void makeCall()

{

 Serial.println(“Initializing…”); // Cetak pesan mulai

 delay(1000);

 mySerial.println(“AT”);  // Test handshake

 updateSerial();

 

 mySerial.println(“ATD+628112183331”); // telpon nomor

 updateSerial();

 delay(20000); // tunggu 20 detik

 mySerial.println(“ATH”); // tutup telpon

 updateSerial();

}

 

void updateSerial()

{

 delay(500);

 while (Serial.available())

 {

   mySerial.write(Serial.read()); // Meneruskan yang diterima Serial ke Serial Port Software

 }

 while(mySerial.available())

 {

   Serial.write(mySerial.read()); // Meneruskan yang diterima Serial Port Software ke Serial

 }

}

 

9. Pengujian

Pengujian sistem dilakukan secara bertahap, yang dibagi menjadi 2 tahap berbeda, yaitu:

 

  • Component Testing

 

Testing per komponen yang terdapat dalam perangkat sistem.

 

  • Integration Testing

 

Testing komponen yang sudah disatukan sebagai keseluruhan sistem.

 

Metode pengujian dilakukan melalui 2 metode, yaitu white box testing (dengan melihat kode) dan black box testing (tanpa melihat kode).

Untuk setiap testing, 2 metode tersebut digunakan secara bergantian sesuai kebutuhan penguji.

 

  • Component Testing

 

Tahapan ini dilakukan dengan menguji setiap komponen yang menjadi perangkat penyusun sistem, yaitu:

    1. 2 buah LED
    2. Keypad
    3. PIR Sensor + Buzzer
    4. GSM Module

 

 

Masing-masing pengujian dilakukan dengan tepat 1 buah kode untuk setiap komponennya, dan tanpa menggunakan komponen lain. Keberhasilan pengujian dinilai dari kesesuaian perilaku komponen dengan kode uji.

Hasil pengujian:

  1. 2 buah LED: Berhasil

Diuji dengan mengedipkan lampu LED setiap 1 detik.

 

  • Keypad: Berhasil

 

Diuji dengan melihat keluaran keypad yang tepat pada serial monitor.

  1. PIR Sensor + Buzzer: Berhasil

Khusus untuk kedua komponen ini, dilakukan pengujian secara bersamaan. Diuji dengan melihat keluaran buzzer sesuai masukan sensor PIR. Menyala bila mendeteksi gerakan, dan sebaliknya.

  1. GSM Module: Berhasil

Khusus untuk komponen ini, dilakukan 2 buah pengujian. Pertama, untuk mengirimkan SMS. Kedua, untuk menelpon nomor telepon di telepon genggam yang berbeda.

 

 

  • Integration Testing

 

Pengujian integrasi dilakukan untuk menguji cara kerja keseluruhan sistem saat seluruh komponen sudah saling terhubung.

 

Dilakukan 5 kali pengujian untuk melihat perilaku dan fungsionalitas sistem, dengan hasil sebagai berikut.

  1. Tidak berhasil

Penyebab: Telepon genggam yang ditelpon oleh sistem tidak menunjukkan telepon dari sistem. Ternyata, telepon genggam tersebut sedang padam.

  1. Berhasil
  2. Tidak berhasil

Penyebab: Terdapat masalah pada GSM module, dan dilakukan component testing ulang untuk GSM module. Masalah berhasil diperbaiki di pengujian berikutnya.

  1. Berhasil
  2. Berhasil

Terlihat bahwa satu-satunya masalah yang ada pada pengujian sistem keseluruhan berada pada komponen modul GSM, yang setelah satu masalah berhasil bekerja sesuai standar yang ditentukan.

Setelah 5 kali pengujian, kinerja sistem direkam sebagai salah satu konten laporan dan untuk demo. Sistem berhasil bekerja sesuai yang diharapkan, dari bagian awal sampai akhir.

Dokumentasi pengujian terdapat pada video dibawah ini:

 

https://youtu.be/Fd2ERDL3Jbc

 

Calculator with Keypad and I2C LCD

https://youtu.be/_LWOT_el8vs

Pada hari ini (Senin, 1 April 2019) kami diberikan tugas untuk merancang calculator dengan menggunakan Arduino. Calculator ini dapat melakukan kalkulasi sederhana seperti tambah, kurang, kali, bagi, dan juga modulo. Pada saat keypad ditekan, buzzer akan menyala untuk menandakan tombol telah ditekan.

Kami menggunakan Arduino Uno sebagai microcontroller. Karena adanya keterbatasan PIN pada arduino UNO, kami akhirnya memutuskan untuk menggunakan I2C untuk mengefisiensikan PORT yang tersedia.

Alat dan Bahan

  • Arduino Uno
  • Jumper
  • LCD
  • I2C
  • Buzzer
  • Breadboard
  • 4×4 keypad

Dokumentasi

 

S__21856259.jpgS__21856261.jpg

Source Code

/*References:
* https://circuitdigest.com/microcontroller-projects/arduino-calculator-using-4×4-keypad
* https://medium.com/@18214030_IMKA/tugas-4-kalkulator-sederhana-6dc775f9811c
* https://www.sunfounder.com/learn/Sensor-Kit-v2-0-for-Arduino/lesson-1-display-by-i2c-lcd1602\
* -sensor-kit-v2-0-for-arduino.html
* https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
*/

#include <Key.h>
#include <Keypad.h>
#include <Wire.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header

//LCD I2C Initialization
hd44780_I2Cexp lcd; // declare lcd object: auto locate & config exapander chip
// LCD geometry
const int LCD_COLS = 16;
const int LCD_ROWS = 2;
int buzz = A3;

double num1,num2 ;
double total;
char operation,button;
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns

// Define the Keymap
char keys[ROWS][COLS] = {
{‘1′,’2′,’3′,’+’},
{‘4′,’5′,’6′,’-‘},
{‘7′,’8′,’9′,’*’},
{‘=’,’0′,’%’,’/’}
};
byte rowPins[ROWS] = { 9, 8, 7, 6 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 5, 4, 3, 2 }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Create the Keypad

void domath() // Simple switch case to pick what operation to do, based on button pressed by user.
{
switch(operation)
{
case ‘+’: // Addition
total = num1+num2;
break;
case ‘-‘: // Subtraction
total = num1-num2;
break;
case ‘/’: // Division.
total = num1/num2;
break;
case ‘*’: // Multiplication
total = num1*num2;
break;
case ‘%’: // Modulus
total = (int)num1%(int)num2;
break;
}
// Based on case selected print our total and
lcd.setCursor(0,1);
lcd.print(‘=’);
lcd.setCursor(1,1);
lcd.print(total);
}

void setup() {
int status;

// initialize LCD with number of columns and rows:
// hd44780 returns a status from begin() that can be used to determine if initalization failed.
status = lcd.begin(LCD_COLS, LCD_ROWS);
if(status) // non zero status means it was unsuccesful
{
status = -status; // convert negative status value to positive number

// begin() failed so blink error code using the onboard LED if possible
hd44780::fatalError(status); // does not return
}

// initalization was successful, the backlight should be on now

// Print a message to the LCD
lcd.print(“Calculator”);

pinMode(buzz, OUTPUT);
}

void loop()
{
// Loops are convenient for reading key press from keypad
while(1) // First loop. Composing first number. Until operator pressed
{
button = kpd.getKey(); // Button read
if (button >=’0′ && button <=’9′) // If user pressed numeric value, 1 character at a time.
{
toneButton(button);
lcd.clear();
num1 = num1*10 + (button -‘0′); //First operand composing
lcd.setCursor(0,0); // Select first row on lcd
lcd.print(num1); // Print current number1
}

//Inputting operator
if (num1 !=0 && (button==’+’ || button==’-‘ || button==’*’ || button==’/’ || button==’%’))
{
toneButton(button);
operation = button; // operation remembers what mathematical operation user wants on numbers
lcd.setCursor(0,1); // set cursor to row 2
lcd.print(operation); // print our operator
break;
}
}

while(1) // Second loop. Inputting second operand. Until ‘=’ pressed
{
button = kpd.getKey(); // Button read
if (button >=’0′ && button <=’9′) // Getting chars from keypad for second number
{
toneButton(button);
num2 = num2*10 + (button -‘0’); //Second operand composing
lcd.setCursor(1,1); // Select second row, second column on lcd
lcd.print(num2); // Print current operand2
}

if (button == ‘=’ && num2 !=0) //Do calculation if ‘=’ is pressed
{
toneButton(‘=’);
domath(); //Calls domath() subroutine
break;
}
}

while(1) // Clearing screen for next calculation
{
//Waits ‘=’ key to be pressed so it can reset program and start over.
button = kpd.getKey();
if (button ==’=’)
{
toneButton(‘=’);
lcd.clear();
lcd.setCursor(0,0);
num1=0;
num2=0;
total=0;
operation=0;
break;
}
}
}

void toneButton(char key){
switch(key) {
case ‘1’:
tone(buzz, 262, 250);
break;
case ‘2’:
tone(buzz, 294, 250);
break;
case ‘3’:
tone(buzz, 330, 250);
break;
case ‘4’:
tone(buzz, 349, 250);
break;
case ‘5’:
tone(buzz, 392, 250);
break;
case ‘6’:
tone(buzz, 440, 250);
break;
case ‘7’:
tone(buzz, 494, 250);
break;
case ‘8’:
tone(buzz, 523, 250);
break;
case ‘9’:
tone(buzz, 587, 250);
break;
case ‘+’:
tone(buzz, 659, 250);
break;
case ‘-‘:
tone(buzz, 698, 250);
break;
case ‘*’:
tone(buzz, 784, 250);
break;
case ‘/’:
tone(buzz, 880, 250);
break;
case ‘%’:
tone(buzz, 988, 250);
break;
case ‘=’:
tone(buzz, 1047, 100);
delay(10);
tone(buzz, 1047, 100);
break;
default:
break;
}
}

 

Automatic Runner Stopwatch

https://youtu.be/o7wovVjnk50

Pada minggu ke 9 kuliah IMKA kami diberikan tugas untuk merancang sebuah proyek arduino dengan memanfaatkan dua buah seven segment. Kami berfikir cukup panjang tentang proyek apa yang akan dibuat. Dengan mempertimbangkan ide-ide yang ada dan komponen yang tersedia, kami memutuskan untuk membuat Automatic Runner Stopwatch.

Automatic Runner Stopwatch akan mulai menghitung waktu pelari ketika pelari itu melewati sensor PIR (Passive Infra Red) dan akan berhenti jika pelari tersebut melewati sensor PIR tersebut kembali, sehingga dapat dihitung waktu yang diperlukan untuk pelari dapat mengelilingi satu putaran ( satu lap).

 

proximity_pir-diagram.png

Sensor PIR ini menggunakan perbedaan suhu yang terekam dalam sensor, sehingga apabila benda mati yang berlalu atau tertangkap sensor maka tidak akan mentrigger stopwatch untuk menyala. Terdapat suatu masalah saat kami mengerjakan proyek ini yaitu karena area deteksi dari sensor PIR ini berbentuk cone, akan terlalu lebar area yang terdeteksi, sehingga kami mencoba mengakalinya dengan membuat selubung menggunakan kertas yang berfungsi sebagai kacamata kuda dari sensor.

S__21159943.jpg

Alat-alat yang digunakan dalam proyek ini adalah

  • Arduino Uno
  • Breadboard
  • Kabel Jumper
  • Sensor PIR
  • Seven Segment
  • Resistor 225 Ohm

Berikut adalah code dari rangkaian tersebut

int a = 2; //Untuk menyalakan segmen “a”
int b = 3; //Untuk menyalakan segmen “b”
int c = 4; //Untuk menyalakan segmen “c”
int d = 5; //Untuk menyalakan segmen “d”
int e = 6; //Untuk menyalakan segmen “e”
int f = 7; //Untuk menyalakan segmen “f”
int g = 8; //Untuk menyalakan segmen “g”
int D2 = 9; //Segmen ke-2
int D3 = 10; //Segmen ke-3

int inputPIR = 11; // pin input untuk sensor PIR
int reset_button = 12; // pin button
int ledPin = 13; // pin LED
int pirLastState = 0; // kondisi memulai, asumsi tak ada gerakan terdeteksi
int valPIR = 0; // variabel untuk membaca status pin
int valButton = 0;
int display_number = 0; // variabel untuk waktu sekarang yang akan ditampilkan sebagai output
int number = 0;
bool isStart = false; // kondisi orang telah start

void setup() {
pinMode(a, OUTPUT); //A
pinMode(b, OUTPUT); //B
pinMode(c, OUTPUT); //C
pinMode(d, OUTPUT); //D
pinMode(e, OUTPUT); //E
pinMode(f, OUTPUT); //F
pinMode(g, OUTPUT); //G
pinMode(D2, OUTPUT); //D2
pinMode(D3, OUTPUT); //D3
pinMode(inputPIR, INPUT); // deklarasi sensor sebagai input
pinMode(reset_button, INPUT); // deklarasi button sebagai input

Serial.begin(9600);
}

void displayDigit(int digit)
{
//Kondisi untuk menyalakan segmen a
if(digit!=1 && digit != 4)
digitalWrite(a,HIGH);

//Kondisi untuk menyalakan segmen b
if(digit != 5 && digit != 6)
digitalWrite(b,HIGH);

//Kondisi untuk menyalakan segmen c
if(digit !=2)
digitalWrite(c,HIGH);

//Kondisi untuk menyalakan segmen d
if(digit != 1 && digit !=4 && digit !=7)
digitalWrite(d,HIGH);

//Kondisi untuk menyalakan segmen e
if(digit == 2 || digit ==6 || digit == 8 || digit==0)
digitalWrite(e,HIGH);

//Kondisi untuk menyalakan segmen f
if(digit != 1 && digit !=2 && digit !=3 && digit !=7)
digitalWrite(f,HIGH);

//Kondisi untuk menyalakan segmen g
if (digit!=0 && digit!=1 && digit !=7)
digitalWrite(g,HIGH);
}

void displayNumber()
{
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);

turnOff();
displayDigit(display_number/10);
delay(1);

digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);

turnOff();
displayDigit(display_number%10);
delay(1);
}

void turnOff()
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}

void loop(){
valPIR = digitalRead(inputPIR); // membaca nilai input
valButton = digitalRead(reset_button);
if(valPIR == 1 && pirLastState==1){
pirLastState = 1;
valPIR = 0;
}
else{
pirLastState = valPIR;
}
Serial.println(valPIR);
if(valPIR == 1){
isStart = !isStart;
}
if(isStart){
number++;
}
displayNumber();

display_number=number/100;
if(display_number > 59){
number = 0;
}

if(valButton == HIGH){
number = 0;
}
}

Blink LED with Joystick Control

Pada project pertama IMKA yaitu LED kami membuat suatu rangkaian dengan LED dan Joystick. LED menyala bergantian dengan arah ditentukan oleh joystick. LED dirangkai dengan menggunakan breadboard dan ditambah resistor agar LED tidak meledak. Jika joystick diarahkan ke kanan maka LED akan menyala bergantian ke sebelah kanan, sedangkan jika joystick digerakkan ke arah kiri maka sebaliknya, LED akan menyala bergantian ke sebelah kiri. Jika joystick tidak digerakkan selama 3 detik, maka semua LED akan menyala selama beberapa saat seperti “bernapas”.

Berikut adalah komponen yang digunakan dalam rangkaian:

  • 3 LED Merah
  • 3 LED Kuning
  • 3 LED Hijau
  • 3 LED Biru
  • 3 LED Putih
  • 5 Resistor 1K
  • Breadboard
  • Arduino Uno
  • Joystick

Rangkaian

S__20127800S__20127799Video

https://youtu.be/AQDCtar0nCs

Automatic Pet Feeder

Perkembangan teknologi komputer saat ini telah mempengaruhi kehidupan sehari-hari. Saat inisegala sesuatu dalam kehidupan manusia bisa dikatakan bergantung pada teknologi yang ada, salah satunya dalam merawat hewan peliharaan.

Merawat hewan peliharaan umumnya didasaridengan rasa cinta terhadap hewan tersebut. Dalammerawat hewan kesayangan, pemilik harus meluangkan waktu untuk memberi makan dan minum agar hewan peliharaan tidak sakit. Ketika pemilik sibuk, hal ini berdampak kepada hewan peliharaan yang dimilikinya. Saat ditinggalkan hewan tersebut juga membutuhkan makan seperti halnya manusia. Sehingga dibutuhkan suatu alat yang mampu membantu dalam hal tersebut sehingga hewan peliharaan tidak mengalami kelaparan saat ditinggal pergi. Dengan kemajuan teknologi di bidang elektronika, maka pada saat ini dunia elektronika memanfaatkan sistem yang berbasis mikrokontroler. Sistem yang berbasis mikrokontroler telah dinilai sebagai suatu alternatif lain yang memiliki kemampuan yang diperlukan oleh suatu sistem yang rumit. Sehingga sistem yang berbasis mikrokontroler merupakan sistem yang mempunyai efisiensi dan efektivitas yang tinggi.

Berdasarkan latar belakang tersebut, penulis merancang sebuah alat bernama ”Automatic Pet Feeder” yang berbasis Arduino Uno dan komponen komponen pendukung seperti RFID RC-522, Servo SG90, Sensor Ultrasonik HC-SR04, Buzzer, dan LCD. Diharapkan alat ini dapat diaplikasikan sebagai sistem pemberi makan hewan otomatis yang mampu memudahkan pemilik hewan untuk memberikan makanan atau minuman kepada hewannya.

screen shot 2019-01-23 at 08.18.57
Ilustrasi Automatic Pet Feeder

Alat dan bahan yang diperlukan untuk Automatic Pet Feeder ini adalah

  1. Komputer yang telah terinstall program Arduino IDE
  2. Board Arduino Uno
  3. Breadboard
  4. Resistor
  5. Kabel Jumper
  6. RFID RC-522
  7. Servo SG-90
  8. Sensor Ultrasonik HC-SR04
  9. Buzzer

 

screen shot 2019-01-23 at 08.19.14
Rangkaian Automatic Pet Feeder

Cara kerja alat adalah sebagai berikut:

1. RFID mendeteksi tag yang digunakanhewan, berguna untuk membedakanhewan jika pemilik hewan memiliki duaatau lebih hewan yang berbeda (misalkucing dan anjing, makanan kucing dananjing jelas berbeda).

2. Jika RFID sesuai, maka buzzer akanberbunyi dan sensor ultrasonik akanmendeteksi apakah makanan masih tersedia atau tidak.

3. Jika makanan masih tersedia, makamakanan akan keluar. Jika makanan habis,makanan tidak keluar.

4. Jika RFID tidak sesuai, buzzer akan berbunyi dan makanan tidak keluar.

Berikut adalah source code dari arduinonya

#include <SPI.h>

#include <MFRC522.h>

#include <Servo.h>

#include <Wire.h>

#define SS_PIN 10

#define RST_PIN 9

#define BUZZ_PIN 8

MFRC522 mfrc522(SS_PIN, RST_PIN);

// Create MFRC522 instance.

Servo myservo;

int pos=0;

// defines pins numbers

const int trigPin = 6;

const int echoPin = 5;

// defines variables

double distance;

double max = 10;

void setup()

{

Serial.begin(9600); // Initiate a serial

communication

SPI.begin(); // Initiate SPI bus

pinMode(BUZZ_PIN,OUTPUT);

myservo.attach(7);

mfrc522.PCD_Init(); // Initiate

MFRC522

Serial.println(“Approximate your card to

the reader…”);

Serial.println();

}

void loop()

{

// Look for new cards

if ( ! mfrc522.PICC_IsNewCardPresent())

{

return;

}

// Select one of the cards

if ( ! mfrc522.PICC_ReadCardSerial())

{

return;

}

//Show UID on serial monitor

Serial.print(“UID tag :”);

String content= “”;

byte letter;

for (byte i = 0; i < mfrc522.uid.size; i++)

{

Serial.print(mfrc522.uid.uidByte[i] <

0x10 ? ” 0″ : ” “);

Serial.print(mfrc522.uid.uidByte[i],

HEX);

content.concat(String(mfrc522.uid.uidByte[

i] < 0x10 ? ” 0″ : ” “));

content.concat(String(mfrc522.uid.uidByte[

i], HEX));

}

Serial.println();

Serial.print(“Message : “);

content.toUpperCase();

if (content.substring(1) == “04 42 D3 3A

E7 4C 81”) //change here the UID of the

card/cards that you want to give access

{

Serial.println(“Authorized access”);

Serial.println();

digitalWrite(BUZZ_PIN,HIGH);

delay(100);

digitalWrite(BUZZ_PIN,LOW);

delay(50);

digitalWrite(BUZZ_PIN,HIGH);

delay(100);

digitalWrite(BUZZ_PIN,LOW);

distance= hitungJarak();

// Prints the distance on the Serial

Monitor

Serial.print(“Distance: “);

Serial.print(distance);

Serial.println(” cm”);

if (distance>max) {

Serial.println(“Makanan Habis!”);

} else {

Serial.print(“Sisa Makanan “);

int persen = (max-distance)/max*100;

Serial.print(persen);

Serial.println(“%”);

for(pos = 130; pos>=1; pos-=1)

{

myservo.write(pos);

delay (20);

}

for(pos = 50; pos < 180; pos

+= 1)

{

myservo.write(pos);

delay(20);

}

delay(3000);

Serial.println(“Meal Time!”);

}

}

else {

Serial.println(” Access denied”);

digitalWrite(BUZZ_PIN,HIGH);

delay(200);

digitalWrite(BUZZ_PIN,LOW);

delay(3000);

Serial.println(“Meal Time!”);

}

}

double hitungJarak() {

pinMode(trigPin,OUTPUT);

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

pinMode(echoPin,INPUT);

double jarak= pulseIn(echoPin,HIGH);

jarak= jarak*0.034/2;

delay(1000);

return jarak;

}