Cuprins:
Video: Touch capacitiv cu microcontroler PIC16F886: 3 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:45
Î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
Î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
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:
Interfață senzor capacitiv de amprentă digitală cu Arduino UNO: 7 pași
Interfață senzor capacitiv de amprentă digitală cu Arduino UNO: Hei, ce se întâmplă, băieți! Akarsh aici de la CETech. Astăzi vom adăuga un strat protector proiectelor noastre. Nu vă faceți griji, nu vom numi nici un bodyguarzi pentru același lucru. Va fi un senzor de amprentă digitală drăguț și frumos de la DFRobot. Deci
Stylus capacitiv pentru un stilou de unică folosință: 6 pași (cu imagini)
Stil capacitiv pentru un stilou de unică folosință: Am o duzină de pixuri cu rola cu unghiuri. Vreau să adaug un capac capac la capacul unuia dintre ele. Apoi, capacul și stiloul pot fi mutate de la un stilou la altul, pe măsură ce fiecare se epuizează. Îi sunt recunoscător lui Jason Poel Smith pentru
Ventilator portabil Arduino cu comutator tactil capacitiv: 6 pași
Ventilator portabil Arduino cu comutator tactil capacitiv
Monitor Arduino Plant cu senzor capacitiv sol - Tutorial: 6 pași
Monitor Arduino Plant cu senzor capacitiv sol - Tutorial: În acest tutorial vom învăța cum să detectăm umiditatea solului folosind un senzor capacitiv de umiditate cu afișaj OLED și Visuino
Touch capacitiv cu Evive (controler bazat pe Arduino): 6 pași (cu imagini)
Touch capacitiv cu Evive (Arduino Based Controller): știți cum funcționează ecranul tactil al smartphone-ului dvs. Smartphone-ul are o gamă de senzori tactili sub ecranul de sticlă. În zilele noastre, se bazează pe tehnologia de detectare a capacității prin atingere și chiar o atingere delicată este ușor de detectat. Se simte atingerea capacitivă