Hi, dan selamat datang di tutorial ini (Ya ini tua tapi klasik), hari ini saya membuat proyek kunci pintu berdasarkan papan Arduino, keypad, layar LCD i²c, dan saya akan menggunakan solenoid dan relay untuk kunci, Anda dapat memeriksa tutorial saya tentang kunci pintu sidik jari di mana saya menggunakan kunci yang menggunakan motor DC, jadi tergantung pada sistem kunci Anda Anda harus memilih kabeling, kode dan menyesuaikannya.
N.B: Untuk proyek nyata, saya tidak merekomendasikan menggunakan solenoid sama sekali, melainkan hack kunci yang dapat dibuka baik secara elektronik maupun mekanis dan menyesuaikan proyek Anda untuk itu.
Bagian
Jadi untuk proyek ini kita akan membutuhkan komponen ini, bersama beberapa kabel jumper, dan sumber daya 12V Maaf saya tidak menambahkannya di sini:
Tombol Push dimaksudkan untuk membuka kunci dari dalam, Anda dapat menghapusnya jika Anda ingin, resistor adalah untuk debounce.
Saya menggunakan Keypad 4×4 Anda dapat menggunakan 3×4 tetapi Anda perlu memodifikasi beberapa hal dalam kode seperti untuk konfirmasi saya menggunakan 'A' Anda dapat mengubahnya menjadi '*' atau '#'.
Solenoid diperdayakan oleh sumber daya eksternal 12V, dan dioperasikan oleh transistor IRF510N MOSFET.
Transistor digunakan sebagai saklar dan lebih baik menggunakan N-channel, IRF510N cukup populer saat digunakan dengan Arduino, saat Anda memberikan tegangan 5V di antara Gate dan Source, transistor menjadi seperti saklar tertutup antara Drain dan Source, dan tidak memerlukan resistor seperti yang bersifat bipolar.
Dan jika tidak ada tegangan yang diberikan transistor bertindak seperti saklar terbuka, dan inilah cara kita mengontrol solenoid.
Untuk contoh lain saya menggunakan modul relay 1 channel, bekerja dengan 3.3V, dan kita mengontrol inputnya seperti mengontrol transistor, perbedaannya adalah mereka terbalik (kita akan melihat dalam kode).
Alur Algoritma
Untuk memudahkan pemahaman, inilah diagram alurnya, ini tidak terlalu detail tetapi merupakan gambaran umum dari kode.
N.B: Anda dapat menggunakan relay untuk mengontrol kunci listrik apa pun hingga 250VAC, Anda juga dapat menggunakannya untuk mengontrol Solenoid…
Kodenya persis sama satu-satunya hal adalah Anda beralih antara (LOW dan HIGH) untuk membuka kunci.
Ingat pertama kali Anda harus mengunggah kode dan mengubah passcode lalu uncomment beberapa baris (baca kode untuk menemukannya (mereka ada di setup)) dan mengunggah ulang kode sehingga dapat membaca passcode dari EEPROM. ITU HANYA DILAKUKAN SEKALI.
Juga Anda dapat mengubah panjang kode, pertama saya membuatnya empat digit, Anda dapat mengubahnya dari kode default, karena saya menggunakan dalam kode "sizeof(code)" alih-alih "4". Anda tidak dapat mengubah kode 4 digit menjadi passcode 6 digit, pertama ubah passcode awal dari sumber kode.
Uji Coba
Anda akan menemukan uji coba dalam gambar di bawah ini, navigasi melalui mereka
Nah itu adalah uji coba proyek, sama untuk solenoid atau relay, dan tombol push membuka dari dalam jika Anda ingin atau Anda dapat menghapusnya.
Saya harap berguna dan jika Anda memiliki masalah atau pertanyaan beri komentar.
Kode
Keypad_doorlock_solenoid.ino
Keypad_doorlock_relay.ino
Keypad_doorlock_solenoid.inoArduino
Ingat untuk mengunggah kode terlebih dahulu lalu uncomment baris 62 hingga 64 dan unggah ulang, ini dilakukan hanya sekali.
/* Kode ini bekerja dengan Keypad Matriks 4x4, LCD ic, transistor IRF510N dan tombol push * Ini adalah kunci di mana transistor mendorong kunci solenoid Anda dapat membuka dengan kode yang benar * atau dengan tombol push dari dalam * Kode dapat diubah langsung oleh keypad dan tidak memerlukan pengunggahan kode lagi * Kode disimpan di EEPROM * Lihat www.surtrtech.com untuk lebih banyak detail */ #include <Keypad.h> #include <EEPROM.h> #include <LiquidCrystal_I2C.h> #define Solenoid 11 //Sebenernya Gate dari transistor yang mengontrol solenoid #define O_Button 10 //Tombol Push #define I2C_ADDR 0x27 //Alamat I2C, Anda harus menggunakan kode untuk memindai alamat terlebih dahulu (0x27) di sini #define BACKLIGHT_PIN 3 // Mendeklarasikan Pin LCD #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 const byte numRows= 4; //jumlah baris pada keypad const byte numCols= 4; //jumlah kolom pada keypad char keymap[numRows][numCols]= { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; char keypressed; //Di mana kunci disimpan berubah sangat sering char code[]= {'6','6','0','1'}; //Kode default, Anda dapat mengubahnya atau membuatnya berdigit 'n' char code_buff1[sizeof(code)]; //Di mana kunci baru disimpan char code_buff2[sizeof(code)]; //Di mana kunci baru disimpan lagi untuk dibandingkan dengan yang sebelumnya short a=0,i=0,s=0,j=0; //Variabel yang digunakan nanti byte rowPins[numRows] = {9,8,7,6}; //Baris 0 sampai 3 //jika Anda memodifikasi pin Anda harus memodifikasi ini juga byte colPins[numCols]= {5,4,3,2}; //Kolom 0 sampai 3 LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols); void setup() { lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); //Menyala backlight lcd.home (); lcd.print("Standby"); //Yang tertulis pada LCD Anda dapat mengubah pinMode(Solenoid,OUTPUT); pinMode(O_Button,INPUT); // for(i=0 ; i<sizeof(code);i++){ //Saat Anda mengunggah kode pertama kali biarkan di-comment // EEPROM.get(i, code[i]); //Unggah kode dan ubah untuk menyimpannya di EEPROM // } //Kemudian uncomment loop ini dan unggah ulang kode (Ini dilakukan hanya sekali) } void loop() { keypressed = myKeypad.getKey(); //Selalu menunggu tombol ditekan if(keypressed == '*'){ // * untuk membuka kunci lcd.clear(); lcd.setCursor(0,0); lcd.print("Enter code"); //Pesan yang ditampilkan GetCode(); //Fungsi mendapatkan kode if(a==sizeof(code)) //Fungsi GetCode menetapkan nilai ke a (benar ketika memiliki ukuran array kode) OpenDoor(); //Fungsi membuka kunci jika kode benar else{ lcd.clear(); lcd.print("Wrong"); //Pesan yang dicetak ketika kode salah } delay(2000); lcd.clear(); lcd.print("Standby"); //Kembali ke mode standby itu adalah pesan yang ditampilkan saat menunggu } if(keypressed == '#'){ //Untuk mengubah kode memanggil fungsi changecode ChangeCode(); lcd.clear(); lcd.print("Standby"); //Selesai kembali ke mode standby } if(digitalRead(O_Button)==HIGH){ //Membuka dengan tombol push digitalWrite(Solenoid,HIGH); delay(3000); //Membuka selama 3 detik Anda dapat mengubah digitalWrite(Solenoid,LOW); } } void GetCode(){ //Urutan mendapatkan kode i=0; //Semua variabel diatur ke 0 a=0; j=0; while(keypressed != 'A'){ //Pengguna menekan A untuk mengonfirmasi kode jika tidak dapat terus mengetik keypressed = myKeypad.getKey(); if(keypressed != NO_KEY && keypressed != 'A' ){ //Jika karakter yang diketik bukan A dan juga bukan "tidak ada" lcd.setCursor(j,1); //Ini untuk menulis "*" pada LCD setiap kali tombol ditekan posisinya dikontrol oleh j lcd.print("*"); j++; if(keypressed == code[i]&& i<sizeof(code)){ //jika karakter yang diketik benar a dan i bertambah untuk memverifikasi karakter berikutnya a++; //Sekarang saya pikir sebaiknya saya hanya menggunakan a atau i ... terlalu malas untuk mencoba -_-' i++; } else a--; //jika karakter yang diketik salah a berkurang dan tidak dapat sama dengan ukuran code [] } } keypressed = NO_KEY; } void ChangeCode(){ //Urutan mengubah kode lcd.clear(); lcd.print("Changing code"); delay(1000); lcd.clear(); lcd.print("Enter old code"); GetCode(); //verifikasi kode lama terlebih dahulu sehingga Anda dapat mengubahnya if(a==sizeof(code)){ //verifikasi nilai a lagi lcd.clear(); lcd.print("Changing code"); GetNewCode1(); //Dapatkan kode baru GetNewCode2(); //Dapatkan kode baru lagi untuk mengonfirmasi s=0; for(i=0 ; i<sizeof(code) ; i++){ //Bandingkan kode dalam array 1 dan array 2 dari dua fungsi sebelumnya if(code_buff1[i]==code_buff2[i]) s++; //lagi cara ini memverifikasi, tambahkan s setiap kali kode cocok } if(s==sizeof(code)){ //Benar selalu ukuran array for(i=0 ; i<sizeof(code) ; i++){ code[i]=code_buff2[i]; //array kode sekarang menerima kode baru EEPROM.put(i, code[i]); //Dan menyimpannya di EEPROM } lcd.clear(); lcd.print("Code Changed"); delay(2000); } else{ //Jika kode baru tidak cocok lcd.clear(); lcd.print("Codes are not"); lcd.setCursor(0,1); lcd.print("matching !!"); delay(2000); } } else{ //Jika kode lama salah Anda tidak dapat mengubahnya lcd.clear(); lcd.print("Wrong"); delay(2000); } } void GetNewCode1(){ i=0; j=0; lcd.clear(); lcd.print("Enter new code"); //katakan kepada pengguna untuk memasukkan kode baru dan menekan A lcd.setCursor(0,1); lcd.print("and press A"); delay(2000); lcd.clear(); lcd.setCursor(0,1); lcd.print("and press A"); //Tekan A tetap ditampilkan sementara baris atas mencetak *** while(keypressed != 'A'){ //A untuk mengonfirmasi dan keluar dari loop keypressed = myKeypad.getKey(); if(keypressed != NO_KEY && keypressed != 'A' ){ lcd.setCursor(j,0); lcd.print("*"); //Pada kode baru Anda dapat menunjukkan * seperti yang saya lakukan atau ubah ke keypressed untuk menampilkan tombol code_buff1[i]=keypressed; //Simpan karakter dalam array i++; j++; } } keypressed = NO_KEY; } void GetNewCode2(){ //Ini sama persis seperti fungsi GetNewCode1 tapi kali ini kode disimpan dalam array lain i=0; j=0; lcd.clear(); lcd.print("Confirm code"); lcd.setCursor(0,1); lcd.print("and press A"); delay(3000); lcd.clear(); lcd.setCursor(0,1); lcd.print("and press A"); while(keypressed != 'A'){ keypressed = myKeypad.getKey(); if(keypressed != NO_KEY && keypressed != 'A' ){ lcd.setCursor(j,0); lcd.print("*"); code_buff2[i]=keypressed; i++; j++; } } keypressed = NO_KEY; } void OpenDoor(){ //Fungsi membuka kunci terbuka selama 3 detik lcd.clear(); lcd.print("Welcome"); //Dengan pesan yang dicetak digitalWrite(Solenoid,HIGH); delay(3000); digitalWrite(Solenoid,LOW); }
Keypad_doorlock_relay.inoArduino
Ingat untuk mengunggah kode terlebih dahulu lalu uncomment baris 62 hingga 64 dan unggah ulang, ini dilakukan hanya sekali.
/* Kode ini bekerja dengan Keypad Matriks 4x4, LCD ic, modul relay dan tombol push * Ini adalah kunci di mana relay dapat mengontrol kunci Anda dapat membuka dengan kode yang benar * atau dengan tombol push dari dalam * Kode dapat diubah langsung oleh keypad dan tidak memerlukan pengunggahan kode lagi * Kode disimpan di EEPROM * Lihat www.surtrtech.com untuk lebih banyak detail */ #include <Keypad.h> #include <EEPROM.h> #include <LiquidCrystal_I2C.h> #define Relay 11 //Mengontrol Relay #define O_Button 10 //Tombol Push #define I2C_ADDR 0x27 //Alamat I2C, Anda harus menggunakan kode untuk memindai alamat terlebih dahulu (0x27) di sini #define BACKLIGHT_PIN 3 // Mendeklarasikan Pin LCD #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 const byte numRows= 4; //jumlah baris pada keypad const byte numCols= 4; //jumlah kolom pada keypad char keymap[numRows][numCols]= { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; char keypressed; //Di mana kunci disimpan berubah sangat sering char code[]= {'6','6','0','1'}; //Kode default, Anda dapat mengubahnya atau membuatnya berdigit 'n' char code_buff1[sizeof(code)]; //Di mana kunci baru disimpan char code_buff2[sizeof(code)]; //Di mana kunci baru disimpan lagi untuk dibandingkan dengan yang sebelumnya short a=0,i=0,s=0,j=0; //Variabel yang digunakan nanti byte rowPins[numRows] = {9,8,7,6}; //Baris 0 sampai 3 //jika Anda memodifikasi pin Anda harus memodifikasi ini juga byte colPins[numCols]= {5,4,3,2}; //Kolom 0 sampai 3 LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols); void setup() { lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); //Menyala backlight lcd.home (); lcd.print("Standby"); //Yang tertulis pada LCD Anda dapat mengubah pinMode(Relay,OUTPUT); pinMode(O_Button,INPUT); // for(i=0 ; i<sizeof(code);i++){ //Saat Anda mengunggah kode pertama kali biarkan di-comment // EEPROM.get(i, code[i]); //Unggah kode dan ubah untuk menyimpannya di EEPROM // } //Kemudian uncomment loop ini dan unggah ulang kode (Ini dilakukan hanya sekali) } void loop() { keypressed = myKeypad.getKey(); //Selalu menunggu tombol ditekan if(keypressed == '*'){ // * untuk membuka kunci lcd.clear(); lcd.setCursor(0,0); lcd.print("Enter code"); //Pesan yang ditampilkan GetCode(); //Fungsi mendapatkan kode if(a==sizeof(code)) //Fungsi GetCode menetapkan nilai ke a (benar ketika memiliki ukuran array kode) OpenDoor(); //Fungsi membuka kunci jika kode benar else{ lcd.clear(); lcd.print("Wrong"); //Pesan yang dicetak ketika kode salah } delay(2000); lcd.clear(); lcd.print("Standby"); //Kembali ke mode standby itu adalah pesan yang ditampilkan saat menunggu } if(keypressed == '#'){ //Untuk mengubah kode memanggil fungsi changecode ChangeCode(); lcd.clear(); lcd.print("Standby"); //Selesai kembali ke mode standby } if(digitalRead(O_Button)==HIGH){ //Membuka dengan tombol push digitalWrite(Relay,LOW); delay(3000); //Membuka selama 3 detik Anda dapat mengubah digitalWrite(Relay,HIGH); } } void GetCode(){ //Urutan mendapatkan kode i=0; //Semua variabel diatur ke 0 a=0; j=0; while(keypressed != 'A'){ //Pengguna menekan A untuk mengonfirmasi kode jika tidak dapat terus mengetik keypressed = myKeypad.getKey(); if(keypressed != NO_KEY && keypressed != 'A' ){ //Jika karakter yang diketik bukan A dan juga bukan "tidak ada" lcd.setCursor(j,1); //Ini untuk menulis "*" pada LCD setiap kali tombol ditekan posisinya dikontrol oleh j lcd.print("*"); j++; if(keypressed == code[i]&& i<sizeof(code)){ //jika karakter yang diketik benar a dan i bertambah untuk memverifikasi karakter berikutnya a++; //Sekarang saya pikir sebaiknya saya hanya menggunakan a atau i ... terlalu malas untuk mencoba -_-' i++; } else a--; //jika karakter yang diketik salah a berkurang dan tidak dapat sama dengan ukuran code [] } } keypressed = NO_KEY; } void ChangeCode(){ //Urutan mengubah kode lcd.clear(); lcd.print("Changing code"); delay(1000); lcd.clear(); lcd.print("Enter old code"); GetCode(); //verifikasi kode lama terlebih dahulu sehingga Anda dapat mengubahnya if(a==sizeof(code)){ //verifikasi nilai a lagi lcd.clear(); lcd.print("Changing code"); GetNewCode1(); //Dapatkan kode baru GetNewCode2(); //Dapatkan kode baru lagi untuk mengonfirmasi s=0; for(i=0 ; i<sizeof(code) ; i++){ //Bandingkan kode dalam array 1 dan array 2 dari dua fungsi sebelumnya if(code_buff1[i]==code_buff2[i]) s++; //lagi cara ini memverifikasi, tambahkan s setiap kali kode cocok } if(s==sizeof(code)){ //Benar selalu ukuran array for(i=0 ; i<sizeof(code) ; i++){ code[i]=code_buff2[i]; //array kode sekarang menerima kode baru EEPROM.put(i, code[i]); //Dan menyimpannya di EEPROM } lcd.clear(); lcd.print("Code Changed"); delay(2000); } else{ //Jika kode baru tidak cocok lcd.clear(); lcd.print("Codes are not"); lcd.setCursor(0,1); lcd.print("matching !!"); delay(2000); } } else{ //Jika kode lama salah Anda tidak dapat mengubahnya lcd.clear(); lcd.print("Wrong"); delay(2000); } } void GetNewCode1(){ i=0; j=0; lcd.clear(); lcd.print("Enter new code"); //katakan kepada pengguna untuk memasukkan kode baru dan menekan A lcd.setCursor(0,1); lcd.print("and press A"); delay(2000); lcd.clear(); lcd.setCursor(0,1); lcd.print("and press A"); //Tekan A tetap ditampilkan sementara baris atas mencetak *** while(keypressed != 'A'){ //A untuk mengonfirmasi dan keluar dari loop keypressed = myKeypad.getKey(); if(keypressed != NO_KEY && keypressed != 'A' ){ lcd.setCursor(j,0); lcd.print("*"); //Pada kode baru Anda dapat menunjukkan * seperti yang saya lakukan atau ubah ke keypressed untuk menampilkan tombol code_buff1[i]=keypressed; //Simpan karakter dalam array i++; j++; } } keypressed = NO_KEY; } void GetNewCode2(){ //Ini sama persis seperti fungsi GetNewCode1 tapi kali ini kode disimpan dalam array lain i=0; j=0; lcd.clear(); lcd.print("Confirm code"); lcd.setCursor(0,1); lcd.print("and press A"); delay(3000); lcd.clear(); lcd.setCursor(0,1); lcd.print("and press A"); while(keypressed != 'A'){ keypressed = myKeypad.getKey(); if(keypressed != NO_KEY && keypressed != 'A' ){ lcd.setCursor(j,0); lcd.print("*"); code_buff2[i]=keypressed; i++; j++; } } keypressed = NO_KEY; } void OpenDoor(){ //Fungsi membuka kunci terbuka selama 3 detik lcd.clear(); lcd.print("Welcome"); //Dengan pesan yang dicetak digitalWrite(Relay,LOW); delay(3000); digitalWrite(Relay,HIGH); }