Cuprins:

Touch capacitiv cu microcontroler PIC16F886: 3 pași
Touch capacitiv cu microcontroler PIC16F886: 3 pași

Video: Touch capacitiv cu microcontroler PIC16F886: 3 pași

Video: Touch capacitiv cu microcontroler PIC16F886: 3 pași
Video: Breadboard capacitive touch sensor tutorial 2024, Iulie
Anonim
Touch capacitiv cu microcontroler PIC16F886
Touch capacitiv cu microcontroler PIC16F886

În acest tutorial vom analiza modul în care puteți utiliza un microcontroler PIC16F886 pentru a detecta diferențele de capacitate, acesta putând fi folosit ulterior pentru a afla dacă este apăsat un touch pad. Este bine să vă familiarizați cu microcontrolerele pic înainte de a face acest proiect.

Pasul 1: conectați-vă circuitul

Conectați-vă circuitul
Conectați-vă circuitul

În primul rând, să începem prin cablarea circuitului conform schemei de mai sus. Pentru a face touch pad-ul, puteți plia folie de aluminiu într-un pătrat și bandați pe un fir. Puteți experimenta diferite valori pentru rezistența de 100k, am găsit că 100k au funcționat bine pentru mine.

Pinul RC4 este utilizat pentru a începe încărcarea / descărcarea capacității de măsurat. C12IN0 este conectat la partea - a unui comparator intern și pinul C1IN este conectat la partea + a aceluiași comparator. Microcontrolerul vede capacitatea ca fiind complet încărcată atunci când tensiunea C12IN0 depășește tensiunea C1IN. Divizorul de tensiune rezistiv asigură faptul că C1IN este aproape de 5 volți.

Deoarece touch pad-ul depinde de o capacitate semnificativă între dvs. și masa circuitului, există posibilitatea ca o baterie să nu funcționeze.

Pasul 2: fișierul antet

Fișierul antet
Fișierul antet

Ați terminat cu toate conexiunile? Bine, vom continua cu fișierul antet. Vom folosi compilatorul XC8 și așa cum sugerează titlul, acum veți crea un nou fișier antet în proiectul dvs. și copiați-lipiți următorul cod. La fel de bine îl puteți copia-lipi deasupra codului principal fără fișier antet.

#define CALIBRATION_SAMPLE 20 # define TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5

int count;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // capacitate de descărcare de măsurat RC4 = 0; _delay_ms (DISCHARGE_TIME); // dați suficientă întârziere pentru a descărca complet (aproape complet efectiv) „condensatorul” // ștergeți semnalizatorul de depășire a temporizatorului T0IF = 0; // așteptați ca temporizatorul să se revarsă, începeți numărul de la 0 în timp ce (! T0IF); T0IF = 0; // începeți încărcarea capacității de măsurat RC4 = 1; // așteptați ca capacitatea să se încarce până la tensiunea de referință în timp ce (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // resetare timerCount timerCount = 0; overflowCount = 0; număr de returnări; }

int is Touching (int toleranță) {

// media probelor multiple media dublă = 0; pentru (int i = 0; i calibrationValue + tolerance) medie ++; } medie / = TOUCH_SAMPLE; // media va fi un număr între 0 și 1 dacă (medie> 0,2) returnează 1; retur 0; }

void calibrate () {

int medie = 0; probe int [CALIBRATION_SAMPLE]; // obțineți valoarea medie pentru (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); medie + = probe ; } medie / = CALIBRATION_SAMPLE; calibrationValue = medie; // obține valori max / min maxCalibrationValue = mostre [0]; minCalibrationValue = mostre [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = mostre ; if (samples <minCalibrationValue) minCalibrationValue = samples ; }}

void setupCapacitiveTouch () {

// setarea pinului de încărcare / descărcare ca ieșire, în acest caz este RC4 TRISCbits. TRISC4 = 0; // setare cronometru0 T0CS = 0; PSA = 1; // setarea comparatorului C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // ștergerea numărului de valori număr = 0; // ștergerea valorilor calibrării calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // rulați calibrarea la începutul calibrării (); }

Pasul 3: Scrierea codului principal

Începând cu codul principal, va trebui să includeți fișierul de antet creat în pasul anterior. Următorul cod este un exemplu al modului în care puteți utiliza funcția isTouching ca un comutator. În cazul meu, am dat antetului numele capacitiveTouch.h.

#include

#include "capacitiveTouch.h"

// această variabilă spune dacă butonul este sau nu este apăsat deja

int lastState = 0;

void main () {

// setarea RC5 ca ieșire TRISCbits. TRISC5 = 0; // trebuie să apelați această funcție la începutul programului setupCapacitiveTouch (); _delay_ms (1000); // calibrare după configurarea exactă calibrate (); while (1) {// verificând dacă butonul este apăsat dacă (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; altfel RC5 = 1; lastState = 1; } // verificarea dacă butonul se eliberează altfel dacă (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

calibra:

Când această funcție este numită variabilele calibrationValue, maxCalibrationValue și minCalibrationValue vor fi actualizate. calibrationValue este utilizat de funcția isTouching. Rețineți că touch pad-ul trebuie lăsat singur în timpul calibrării.

setupCapacitiveTouch:

Trebuie apelat la începutul programului. Setează biții necesari utilizați de celelalte funcții. De asemenea, rulează o calibrare. Cu toate acestea, am obținut rezultate mai bune așteptând o secundă și rulez calibrarea din nou separat.

isTouching:

Această funcție returnează 1 dacă detectează o creștere a capacității pe C12IN0 și returnează 0 dacă capacitatea este apropiată de cea pe care o avea în timpul calibrării. Simplu spus, dacă cineva atinge pad-ul, funcția isTouching va reveni 1. Funcția dorește și un parametru ca intrare, aceasta este toleranța pentru declanșare. Cu cât valoarea toleranței este mai mare, cu atât devine mai puțin sensibilă. În configurarea mea, am găsit că 15 funcționau bine, dar pentru că acest lucru depinde de frecvența oscilatorului și de cât de multă capacitate este adăugată atunci când o apăsați, ar trebui să experimentați cu această valoare până când veți găsi ceva care funcționează pentru dvs.

getChargeTime:

Când doriți să știți cât timp ar dura încărcarea capacității la tensiunea CVREF, această funcție o va testa și va returna un număr întreg. Pentru a obține timpul în secunde, utilizați această formulă: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Această formulă poate fi utilizată și pentru a obține intrarea de toleranță de la funcția isTouching la secunde.

Recomandat: