Isi kandungan:

Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886: 3 Langkah
Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886: 3 Langkah

Video: Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886: 3 Langkah

Video: Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886: 3 Langkah
Video: SENSOR SENTUH TANPA PERLU DISENTUH Tutorial Singkat Module Capacitive Touch Sensor Sentuh TTP223 2024, Julai
Anonim
Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886
Sentuhan Kapasitif Dengan Mikrokontroler PIC16F886

Dalam tutorial ini kita akan membahas bagaimana anda dapat menggunakan mikrokontroler PIC16F886 untuk mengesan perbezaan kapasitansi, ini kemudian dapat digunakan untuk mengetahui apakah pad sentuhan sedang ditekan. Ada baiknya kita mengenal mikrokontroler pic sebelum membuat projek ini.

Langkah 1: Kabelkan Litar Anda

Kabelkan Litar Anda
Kabelkan Litar Anda

Pertama, mari kita mulakan dengan memasang litar mengikut skema di atas. Untuk membuat pad sentuh, anda boleh melipat aluminium foil menjadi kotak dan pita pada wayar. Anda boleh bereksperimen dengan nilai yang berbeza untuk perintang 100k, saya dapati 100k berfungsi dengan baik untuk saya.

Pin RC4 digunakan untuk mulai mengisi / melepaskan kapasitansi yang akan diukur. C12IN0 disambungkan ke - sisi pembanding dalaman dan pin C1IN disambungkan ke sisi + pembanding yang sama. Mikrokontroler melihat kapasitansi sebagai terisi penuh apabila voltan C12IN0 mencapai di atas voltan C1IN. Pembahagi voltan resistif memastikan C1IN mendekati 5 volt.

Oleh kerana pad sentuh bergantung pada kapasitansi yang signifikan antara anda dan tanah litar, ada kemungkinan bateri mungkin tidak berfungsi.

Langkah 2: Fail Header

Fail Pengepala
Fail Pengepala

Selesai dengan semua sambungan? Bagus, kami akan meneruskan fail header. Kami akan menggunakan penyusun XC8 dan seperti yang dicadangkan oleh judul anda sekarang anda harus membuat fail tajuk baru dalam projek anda dan menyalin-tampal kod berikut. Anda juga boleh menyalin-paste di atas kod utama anda tanpa fail tajuk.

#tentukan CALIBRATION_SAMPLE 20 # tentukan TOUCH_SAMPLE 10 # tentukan DISCHARGE_TIME 5

kiraan int;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // kapasitansi pelepasan yang akan diukur RC4 = 0; _delay_ms (DISCHARGE_TIME); // beri kelewatan yang cukup untuk sepenuhnya (hampir sepenuhnya benar) melepaskan "kapasitor" // membersihkan bendera limpahan pemasa T0IF = 0; // tunggu pemasa meluap, mulakan kiraan dari 0 sementara (! T0IF); T0IF = 0; // mulakan pengisian kapasitansi yang akan diukur RC4 = 1; // tunggu kapasitansi untuk mengecas voltan rujukan sementara (C1OUT) {timerCount = TMR0; jika (T0IF) {overflowCount ++; T0IF = 0; }} kiraan = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; kiraan pulangan; }

int isTouching (toleransi int) {

// purata pelbagai sampel purata berganda = 0; untuk (int i = 0; i calibrationValue + toleransi) purata ++; } purata / = TOUCH_SAMPLE; // purata akan menjadi nombor antara 0 dan 1 jika (purata> 0,2) pulangan 1; pulangan 0; }

kalibrasi tidak sah () {

rata-rata int = 0; contoh int [CALIBRATION_SAMPLE]; // dapatkan nilai purata untuk (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); purata + = sampel ; } purata / = CALIBRATION_SAMPLE; calibrationValue = purata; // dapatkan nilai max / min maxCalibrationValue = sampel [0]; minCalibrationValue = sampel [0]; untuk (int i = 0; i maxCalibrationValue) maxCalibrationValue = sampel ; jika (sampel <minCalibrationValue) minCalibrationValue = sampel ; }}

batal persediaanCapacitiveTouch () {

// menetapkan pin cas / pelepasan sebagai output, dalam kes ini ia adalah RC4 TRISCbits. TRISC4 = 0; // menetapkan pemasa0 T0CS = 0; PSA = 1; // menetapkan pembanding C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // mengosongkan nilai nilai kiraan = 0; // membersihkan nilai penentukuran calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // jalankan penentukuran pada permulaan kalibrasi (); }

Langkah 3: Menulis Kod Utama

Bermula dengan kod utama, anda perlu memasukkan fail tajuk yang dibuat pada langkah sebelumnya. Kod berikut adalah contoh bagaimana anda boleh menggunakan fungsi isTouching sebagai suis. Dalam kes saya, saya memberi tajuk tajuk capacitiveTouch.h.

#sertakan

#masuk "capacitiveTouch.h"

// pemboleh ubah ini memberitahu sama ada butang sudah atau belum ditekan

int lastState = 0;

kekosongan utama () {

// menetapkan RC5 sebagai output TRISCbits. TRISC5 = 0; // anda perlu memanggil fungsi ini pada permulaan program setupCapacitiveTouch (); _delay_ms (1000); // calibrate setelah penyediaan tepat anda calibrate (); sementara (1) {// memeriksa apakah butang ditekan jika (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; lain-lain RC5 = 1; LastState = 1; } // memeriksa sama ada butang dilepaskan jika lain (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

menentukur:

Apabila fungsi ini dipanggil pemboleh ubah calibrationValue, maxCalibrationValue dan minCalibrationValue akan dikemas kini. calibrationValue digunakan oleh fungsi isTouching. Perlu diingat bahawa pad sentuh harus ditinggalkan sendiri semasa penentukuran.

persediaanCapacitiveTouch:

Perlu dipanggil pada awal program anda. Ia menetapkan bit yang diperlukan yang digunakan oleh fungsi lain. Ia juga menjalankan kalibrasi. Walau bagaimanapun, saya mendapat keputusan yang lebih baik dengan menunggu sebentar dan menjalankan penentukuran sekali lagi secara berasingan.

ialah Menyentuh:

Fungsi ini mengembalikan 1 jika mengesan peningkatan kapasitansi pada C12IN0 dan mengembalikan 0 jika kapasitansi mendekati fungsi yang berlaku semasa penentukuran. Secara sederhana, jika seseorang menyentuh pad, fungsi isTouching akan kembali 1. Fungsi ini juga mahu parameter sebagai input, inilah toleransi untuk mencetuskannya. Semakin tinggi nilai toleransi semakin kurang sensitif. Dalam persediaan saya, saya dapati 15 berfungsi dengan baik, tetapi kerana ini bergantung pada frekuensi ocsillator dan berapa kapasitansi yang ditambahkan semasa anda menekannya, anda harus bereksperimen dengan nilai ini sehingga anda menemui sesuatu yang sesuai untuk anda.

getChargeTime:

Apabila anda ingin mengetahui berapa lama masa yang diperlukan untuk mengisi kapasitans ke voltan CVREF, fungsi ini akan mengujinya dan mengembalikan bilangan bulat. Untuk mendapatkan masa dalam beberapa saat, anda menggunakan formula ini: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Formula ini juga dapat digunakan untuk mendapatkan input toleransi dari fungsi isTouching hingga detik.

Disyorkan: