Laboratorium Digital NR05: Membuat Kunci Kode

Kami melanjutkan serangkaian artikel tentang penggunaan kapabilitas Digital Lab kit NR05 untuk mempelajari pemrograman mikrokontroler menggunakan contoh Arduino dan merancang perangkat elektronik yang bermanfaat.



Materi kami tidak berpura-pura menjadi desain jadi, tetapi, seperti yang akan Anda lihat, itu sepenuhnya memenuhi semua fungsi dasar dari kode kunci, dan dapat berfungsi sebagai ilustrasi yang baik tentang kemampuan mikrokontroler dan penggunaan plug-in eksternal. Program untuk mikrokontroler dapat diulang kembali atas kebijakan Anda, menambah atau mengubah fungsi kunci, dan pada saat yang sama meningkatkan tingkat pengetahuan pemrograman Anda.

Pertama-tama, kita akan menggunakan fakta bahwa papan ekspansi, yang merupakan bagian dari set, memiliki layar kristal cair dua garis, serta 5 tombol. Kami menggunakan elemen-elemen ini untuk membangun kunci kombinasi.

Mari kita buat persyaratan berikut:
1. Ada 5 tombol untuk memasukkan kode yang membuka kunci;
2. Tombol paling kiri sesuai dengan kode 1, lalu dari kiri ke kanan - 2,3,4,5;
3. Jumlah digit kode input dapat berupa apa saja (dalam batas yang wajar) dan cukup diinstal dalam program;
4. Kode yang diputar ditampilkan dengan tanda bintang;
5. Jika kode yang dimasukkan bersamaan dengan kode yang dicontohkan, dorongan positif dari durasi yang ditentukan dalam program diberikan ke aktuator;
6. Jika kode yang dimasukkan salah, pesan kesalahan muncul;
7. Jika Anda mengetik kode secara parsial, maka setelah beberapa saat nilai yang dihidupkan diatur ulang.
8. Kami menggunakan layar, LED RGB, dan penghasil suara yang disertakan dalam kit untuk menampilkan informasi yang mudah digunakan.
9. Kami akan membuka kunci elektromekanis nyata yang didukung oleh 12 volt.

Sekarang kita mengambil perangkat yang akan menerapkan voltase pembuka ke kunci. Tegangan ini, sesuai dengan paspor dari kunci elektromekanis, yang akan kami buka, adalah 12 volt pada arus sekitar 1 ampere. Papan ekspansi kit NR05 tidak dapat bekerja dengan voltase dan arus seperti itu, sehingga diperlukan modul switching tambahan. Modul tersebut dapat berupa relay MP515 yang ditawarkan oleh Master Kit , atau relay unit MP2211 , MP4411tergantung pada apakah kita ingin mengontrol tidak hanya kunci, tetapi juga perangkat lain, misalnya, menyalakan lampu ketika pintu dibuka. Semua perangkat ini kompatibel dengan level sinyal kontrol Arduino. Dalam kasus khusus kami, kami menggunakan MP2211 - modul dengan dua relay.

Mengingat hal di atas, kami akan menggambar diagram koneksi dari perangkat yang digunakan:



Jika Anda memperhatikan tanda pada papan ekspansi, kita akan melihat bahwa saluran hijau dari LED RGB HIJAU dan output ke relai CH3 terhubung ke satu pin dari D9 Arduino Nano. Dalam hal ini, ini diizinkan, karena input dari rangkaian kontrol relai memiliki resistansi input yang cukup tinggi, dan pin D9 hanya digunakan sebagai output digital. Secara umum, Anda harus memeriksa untuk melihat apakah pin papan yang Anda gunakan terhubung ke pin Arduino yang sama, dan menghindari situasi ini.

Kunci mengkonsumsi cukup banyak arus selama operasi, jadi kami menyalakannya dan sirkuit kontrol secara terpisah.

Ini adalah sketsa yang berfungsi di Arduino, spoiler
// RGB-
// NR05
//-------------------------------------------------------------------
// LiquidCrystalRus
#include <LiquidCrystalRus.h>
#include <LineDriver.h>
#include <LiquidCrystalExt.h>
// RGB-
#define red 5
#define blue 6
#define green 9
#define beep 12
// ,
#define NUM_KEYS 5
// ( )
int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};
///////////////////////////////////////////////////////////
// ,
#define codeLength 6
// , , . codeLength
const int codeOrigin[codeLength] = {1, 2, 3, 4, 5, 3};
// ,
const int unlockTime = 400;
///////////////////////////////////////////////////////////
//
int codePressed[codeLength];
// ( )
int pressCount;
//
unsigned long oldTime;
unsigned long currentTime;
const int timeout = 5; // , .
//-----------------------------------------------------------------------
// , RS,EN,DB4,DB5,DB6,DB7
LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);

//-----------------------------------------------------------------------
// 1 Arduino
void setup()
{
// LCD: 16 2
lcd.begin(16, 2);
// ()
// « »
lcd.print(« »);
//
lcd.setCursor(0,1);
lcd.print(«t.: „);
lcd.print(unlockTime);
lcd.print(“ »);
// 2000 = 2
delay(2000);
//
lcd.clear();
//
pressCount = 0;
// « » RGB-
pinMode(red, OUTPUT);
pinMode(blue, OUTPUT);
pinMode(green, OUTPUT);
pinMode(beep, OUTPUT);
}

//-----------------------------------------------------------------------
// setup .

void loop() {
// ( ),
currentTime = millis();
// ,
if (currentTime — oldTime <= timeout*1000){
// key
int key;
// , get_key
key = get_key();
lcd.setCursor(0, 0);
lcd.print(« :»);
//
digitalWrite(blue, HIGH);
if (key > 0){ //
codePressed[pressCount] = key; //
// (50 )
digitalWrite(beep, HIGH);
delay(50);
digitalWrite(beep, LOW);
// ,
lcd.setCursor(pressCount, 1);
lcd.print('*');
digitalWrite(blue, LOW);
delay(200);
digitalWrite(blue, HIGH);
pressCount++; //
//
oldTime = currentTime;
}
}
// ,
else{
pressCount = 0;
lcd.clear();
oldTime = currentTime;
}
// , : codeOrigin codePressed
if (pressCount == codeLength){
int compareResult = 1;
for (int i = 0; i < codeLength; i++)
if (codeOrigin[i] != codePressed[i])
compareResult = 0; //
//
if (compareResult == 1){ //
digitalWrite(blue, LOW);
digitalWrite(green, HIGH);
lcd.setCursor(0, 0);
lcd.print(« „);
delay(unlockTime);
digitalWrite(green, LOW);
pressCount = 0;
delay(1000);
lcd.clear();
digitalWrite(blue, HIGH);
}
//
else {
lcd.setCursor(0, 1);
lcd.print(“ »);
digitalWrite(blue, LOW);
digitalWrite(red, HIGH);
digitalWrite(beep, HIGH);
delay(2000);
pressCount = 0;
lcd.clear();
digitalWrite(beep, LOW);
digitalWrite(blue, HIGH);
digitalWrite(red, LOW);
}
}
}

//-----------------------------------------------------------------------
//
// ,
// ,
int get_key()
{
int input = analogRead(A6);
int k;
for(k = 0; k < NUM_KEYS; k++)
if(input < adcKeyVal[k])
return k + 1;
return 0;
}
//


Daftar sketsa disediakan dengan komentar terperinci untuk membantu Anda memahami program.
Namun demikian, kami menarik perhatian Anda ke beberapa fitur-fiturnya.
Seperti yang sudah kami tulis, di papan ekspansi digunakan skema koneksi tombol yang hanya menggunakan satu pin Arduino. Skema semacam itu menghemat output mikroprosesor, tetapi tidak memungkinkan untuk memproses penekanan beberapa tombol secara bersamaan pada saat yang bersamaan, tetapi dalam kasus kami ini tidak perlu. Perhatikan fungsi get_key di akhir sketsa. Jika tidak ada tombol yang ditekan, fungsi mengembalikan 0, jika ditekan, maka jumlah tombol yang ditekan.
Lihat juga implementasi membandingkan dua array: referensi dan kode yang diketik:

int compareResult = 1;
untuk (int i = 0; i <codeLength; i ++)
if (codeOrigin [i]! = codePressed [i])
compareResult = 0; // jika setidaknya satu pasangan elemen tidak sama

Pertanyaan tentang algoritma perbandingan seperti ini sering dibahas di forum pemrograman, tetapi setiap kali turun ke perbandingan elemen, yang digunakan dalam kasus kami. Variabel compareResult tetap sama dengan 1 jika elemen array dengan indeks yang sama adalah sama, dan menjadi sama dengan 0 jika setidaknya satu pasangan elemen tidak cocok.
Untuk menampilkan karakter Cyrillic, perpustakaan LiquidCrystalRus, yang dikembangkan oleh Ilya Danilov, digunakan. Agar perpustakaan berfungsi dengan benar, harus ada tiga baris dalam judul sketsa kami:

#sertakan
<LiquidCrystalRus.h>
#sertakan <LineDriver.h> #sertakan <LiquidCrystalExt.h>

Dan inisialisasi tampilan akan terlihat seperti ini:

LiquidCrystalRus lcd (A1, A2, A3, 2, 4, 7);

Panjang kode input ditentukan oleh konstanta codeLength yang telah ditentukan, misalnya, untuk kode enam-klik

#define codeLength 6

Array nilai referensi untuk kode 6-klik ditentukan oleh baris berikut:

code code intOrigin [codeLength] = {1, 2, 3, 4, 5, 3} ;

Jumlah nilai dalam kurung harus sama dengan codeLength. Jika ada lebih banyak nilai, kompiler akan melempar kesalahan, jika ada lebih sedikit, tidak akan ada kesalahan, tetapi nilai acak akan digunakan sebagai elemen yang hilang, yang tidak akan memungkinkan untuk mengetik kode yang akan membuka kunci.

Setiap 5 detik, program me-reset elemen kode yang diketik. Jika tombol ditekan, maka waktu penekanan diingat, dan hitungan mundur interval lima detik dimulai lagi. Ini diimplementasikan menggunakan fungsi bawaan milis (), yang mengembalikan jumlah milidetik yang telah berlalu sejak awal sketsa, dan variabel oldTime dan currentTime.

Ini adalah video pendek yang menunjukkan operasi kunci kode:



Untuk programmer elektronik yang penasaran dan ingin tahu, Anda dapat melemparkan beberapa ide lagi untuk menyelesaikan sketsa secara mandiri dan memasukkan modul dalam rangkaian yang memperluas kemampuan kastil. Misalnya, masukkan kode master ke dalam program, dengan bantuan kunci dimasukkan ke dalam mode pemrograman dan mengingat tombol yang ditekan sebagai kode referensi, agar tidak mengubah kode ini dalam sketsa. Pemrograman kode baru berakhir jika interval antar klik melebihi waktu tertentu.

Atau, berdasarkan materi tentang interaksi Arduino dengan smartphone melalui Bluetooth, buat kunci yang terbuka dengan kode yang dikirim oleh smartphone ini.

Anda juga dapat dengan mudah memasukkan saluran kontrol nirkabel ke perangkat kami. Untuk melakukan ini, cukup menggunakan dua modul: pemancar-pemancar MP910 dan penerima saluran tunggal dengan output relai MP911 , yang beroperasi pada frekuensi 433 MHz. Kontak relai modul MP2211 terhubung secara paralel dengan tombol pada remote control, dan relai modul penerima terhubung ke kunci. Jarak kendali dapat mencapai 100 m.

Pelajari Arduino, pelajari mikrokontroler, dan pemrogramannya - dan Anda dapat membuat banyak perangkat elektronik yang cerdas dan bermanfaat!

Source: https://habr.com/ru/post/id392559/


All Articles