Obsah:

Kapacitný dotyk s mikrokontrolérom PIC16F886: 3 kroky
Kapacitný dotyk s mikrokontrolérom PIC16F886: 3 kroky

Video: Kapacitný dotyk s mikrokontrolérom PIC16F886: 3 kroky

Video: Kapacitný dotyk s mikrokontrolérom PIC16F886: 3 kroky
Video: How to user Makerfabs ESP32 3.5" TFT Capacitive Touch with Camera 2024, Júl
Anonim
Kapacitný dotyk s mikrokontrolérom PIC16F886
Kapacitný dotyk s mikrokontrolérom PIC16F886

V tomto tutoriále sa pozrieme na to, ako môžete pomocou mikrokontroléra PIC16F886 detekovať rozdiely v kapacite, čo sa dá neskôr použiť na zistenie, či je stlačený dotykový panel. Pred uskutočnením tohto projektu je dobré sa zoznámiť s obrazovými mikrokontrolérmi.

Krok 1: Zapojte obvod

Zapojte svoj obvod
Zapojte svoj obvod

Najprv začneme zapojením obvodu podľa vyššie uvedenej schémy. Na výrobu dotykovej podložky môžete alobal zložiť do štvorca a prilepiť páskou na drôte. Môžete experimentovať s rôznymi hodnotami rezistora 100 k, zistil som, že 100 k pre mňa funguje dobre.

Kolík RC4 sa používa na spustenie nabíjania/vybíjania meranej kapacity. C12IN0 je pripojený k - strane interného komparátora a kolík C1IN je pripojený k + strane rovnakého komparátora. Mikrokontrolér vidí kapacitu ako úplne nabitú, keď napätie C12IN0 dosiahne napätie C1IN. Odporový delič napätia zaisťuje, že C1IN je blízko 5 voltov.

Pretože dotyková podložka závisí od existencie významnej kapacity medzi vami a uzemnením obvodu, je možné, že batéria nebude fungovať.

Krok 2: Súbor hlavičky

Súbor hlavičky
Súbor hlavičky

Dokončili ste všetky pripojenia? Dobre, budeme pokračovať v hlavičkovom súbore. Budeme používať kompilátor XC8 a ako naznačuje názov, teraz vytvorte vo svojom projekte nový súbor hlavičky a skopírujte a prilepte nasledujúci kód. Rovnako dobre ho môžete skopírovať a prilepiť nad svoj hlavný kód bez akéhokoľvek hlavičkového súboru.

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

int počet;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // vybíjacia kapacita, ktorá sa má merať RC4 = 0; _delay_ms (DISCHARGE_TIME); // poskytnutie dostatočného oneskorenia na úplné (takmer úplné) vybitie "kondenzátora" // vymazanie príznaku pretečenia časovača T0IF = 0; // počkajte na pretečenie časovača, spustite počítanie od 0 while (! T0IF); T0IF = 0; // spustite nabíjaciu kapacitu, ktorá sa má merať RC4 = 1; // počkajte, kým sa kapacita nabije na referenčné napätie, kým (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} počet = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; počet návratov; }

int isTouching (int tolerancia) {

// priemer viacerých vzoriek dvojitý priemer = 0; pre (int i = 0; i calibrationValue+tolerancia) priemer ++; } priemer /= TOUCH_SAMPLE; // priemer bude číslo medzi 0 a 1, ak (priemer> 0,2) vráti 1; návrat 0; }

void calibrate () {

int priemer = 0; int vzorky [CALIBRATION_SAMPLE]; // získanie priemernej hodnoty pre (int i = 0; i <CALIBRATION_SAMPLE; i ++) {sample = getChargeTime (); priemer += vzorky ; } priemer /= CALIBRATION_SAMPLE; calibrationValue = priemer; // získanie hodnôt max/min maxCalibrationValue = vzorky [0]; minCalibrationValue = vzorky [0]; pre (int i = 0; i maxCalibrationValue) maxCalibrationValue = vzorky ; if (vzorky <minCalibrationValue) minCalibrationValue = vzorky ; }}

neplatné nastavenieCapacitiveTouch () {

// nastavenie nabíjacieho/vybíjacieho kolíka ako výstupu, v tomto prípade je to RC4 TRISCbits. TRISC4 = 0; // nastavenie časovača0 T0CS = 0; PSA = 1; // nastavenie komparátora C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // vymazanie hodnôt počítania count = 0; // vymazanie kalibračných hodnôt calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // spustenie kalibrácie pri spustení calibrate (); }

Krok 3: Napísanie hlavného kódu

Počnúc hlavným kódom budete musieť zahrnúť súbor hlavičky vytvorený v predchádzajúcom kroku. Nasledujúci kód je príkladom toho, ako môžete použiť funkciu isTouching ako prepínač. V mojom prípade som hlavičke dal názov kapacitnýTouch.h.

#zahrnúť

#include "capacitiveTouch.h"

// táto premenná hovorí, či je alebo nie je tlačidlo už stlačené

int lastState = 0;

void main () {

// nastavenie RC5 ako výstupu TRISCbits. TRISC5 = 0; // túto funkciu musíte vyvolať na začiatku programu setupCapacitiveTouch (); _delay_ms (1000); // kalibrácia po vašom presnom nastavení calibrate (); while (1) {// kontrola, či je tlačidlo stlačené, ak (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; inak RC5 = 1; lastState = 1; } // kontrola, či sa uvoľňuje tlačidlo else if (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

kalibrovať:

Keď sa táto funkcia nazýva premenné calibrationValue, aktualizujú sa maxCalibrationValue a minCalibrationValue. calibrationValue používa funkcia isTouching. Majte na pamäti, že dotykový panel by mal byť počas kalibrácie ponechaný sám.

setupCapacitiveTouch:

Je potrebné ho zavolať na začiatku programu. Nastavuje potrebné bity používané ostatnými funkciami. Spustí sa aj kalibrácia. Lepšie výsledky som však dosiahol, keď som chvíľu počkal a znova spustil kalibráciu oddelene.

je Dotyk:

Táto funkcia vráti hodnotu 1, ak zistí nárast kapacity na C12IN0, a vráti hodnotu 0, ak je kapacita blízka kapacite, ktorá bola počas kalibrácie. Jednoducho povedané, ak sa niekto dotkne podložky, funkcia isTouching vráti hodnotu 1. Funkcia tiež chce ako vstup parameter, to je tolerancia, ktorú môže spustiť. Čím vyššia je hodnota tolerancie, tým je citlivejšia. V mojom nastavení som zistil, že 15 funguje dobre, ale pretože to závisí od frekvencie ocsilátora a od toho, koľko kapacity sa pridá, keď ho stlačíte, mali by ste s touto hodnotou experimentovať, kým nenájdete niečo, čo vám vyhovuje.

getChargeTime:

Ak chcete vedieť, ako dlho trvá nabitie kapacity na napätie CVREF, táto funkcia to otestuje a vráti celé číslo. Na získanie času v sekundách použijete tento vzorec: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Tento vzorec je možné použiť aj na získanie vstupu tolerancie z funkcie isTouching na sekundy.

Odporúča: