INHOUDSOPGAWE:
Video: Kapasitiewe aanraking met PIC16F886 mikrokontroller: 3 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:27
In hierdie tutoriaal gaan ons oor hoe u 'n PIC16F886 -mikrobeheerder kan gebruik om die kapasiteitsverskille op te spoor; dit kan later gebruik word om te bepaal of 'n raakvlak ingedruk word. Dit is goed om vertroud te wees met foto -mikrobeheerders voordat u hierdie projek maak.
Stap 1: Skakel u stroombaan op
Eerstens, laat ons begin deur die stroombaan aan te sluit volgens die skema hierbo. Om die raakvlak te maak, kan u aluminiumfoelie in 'n vierkant vou en op 'n draad plak. U kan eksperimenteer met verskillende waardes vir die 100k -weerstand; ek het gevind dat 100k goed vir my werk.
Die RC4 -pen word gebruik om die kapasiteit wat gemeet moet word, te laai/ontlaai. C12IN0 is aan die - kant van 'n interne vergelyker gekoppel en die C1IN -pen is aan die + kant van dieselfde vergelyker gekoppel. Die mikrobeheerder sien die kapasitansie as vol gelaai wanneer die C12IN0 spanning bo die C1IN spanning bereik. Die weerstandspanningsverdeler sorg dat C1IN naby 5 volt is.
Aangesien die raakvlak afhanklik is van 'n aansienlike kapasiteit tussen u en die stroombaan, is daar 'n moontlikheid dat 'n battery nie werk nie.
Stap 2: Die koptekstlêer
Klaar met al die verbindings? Goed, ons gaan voort met die koplêer. Ons sal die XC8-samesteller gebruik, en soos die titel aandui, moet u nou 'n nuwe koplêer in u projek skep en die volgende kode kopieer en plak. U kan dit net so bo die hoofkode kopieer en plak sonder enige koplêer.
#definieer CALIBRATION_SAMPLE 20 #definieer TOUCH_SAMPLE 10 #definieer DISCHARGE_TIME 5
int telling;
int calibrationValue, maxCalibrationValue, minCalibrationValue;
int getChargeTime () {
int timerCount = 0; int overflowCount = 0; // ontladingskapasiteit wat gemeet moet word RC4 = 0; _vertraag_ms (DISCHARGE_TIME); // gee genoeg vertraging om die "kapasitor" ten volle (feitlik ten volle) te ontlaai // maak die timer -oorloopvlag skoon T0IF = 0; // wag totdat die timer oorloop, begin tel vanaf 0 terwyl (! T0IF); T0IF = 0; // begin laaikapasiteit wat gemeet moet word RC4 = 1; // wag totdat kapasitansie laai tot by die verwysingsspanning terwyl (C1OUT) {timerCount = TMR0; as (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // reset timerCount timerCount = 0; overflowCount = 0; opgawe telling; }
int isTouching (int tolerance) {
// gemiddelde van veelvoudige monsters dubbel gemiddelde = 0; vir (int i = 0; i calibrationValue+tolerance) gemiddelde ++; } gemiddeld /= TOUCH_SAMPLE; // gemiddelde sal 'n getal tussen 0 en 1 wees as (gemiddelde> 0.2) opbrengs 1; terugkeer 0; }
leemte kalibreer () {
int gemiddelde = 0; int monsters [CALIBRATION_SAMPLE]; // kry gemiddelde waarde vir (int i = 0; i <CALIBRATION_SAMPLE; i ++) {monsters = getChargeTime (); gemiddelde += monsters ; } gemiddeld /= CALIBRATION_SAMPLE; kalibrasiewaarde = gemiddeld; // kry max/min waardes maxCalibrationValue = monsters [0]; minCalibrationValue = monsters [0]; vir (int i = 0; i maxCalibrationValue) maxCalibrationValue = monsters ; if (monsters <minCalibrationValue) minCalibrationValue = monsters ; }}
leemte setupCapacitiveTouch () {
// die laai-/ontladingspen as uitset stel, in hierdie geval is dit RC4 TRISCbits. TRISC4 = 0; // die opstel van timer0 T0CS = 0; PSA = 1; // die opstel van vergelyking C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // die opruiming van telwaardes tel = 0; // skoonmaak van kalibrasie waardes calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // hardloop kalibrasie by begin kalibreer (); }
Stap 3: Skryf die hoofkode
Vanaf die hoofkode moet u die koptekstlêer insluit wat in die vorige stap geskep is. Die volgende kode is 'n voorbeeld van hoe u die isTouching -funksie as 'n skakelaar kan gebruik. In my geval het ek die kop die naam capacitiveTouch.h gegee.
#insluit
#sluit "capacitiveTouch.h" in
// hierdie veranderlike sê of die knoppie al dan nie ingedruk is nie
int lastState = 0;
void main () {
// die instelling van RC5 as uitset TRISCbits. TRISC5 = 0; // u moet hierdie funksie oproep met die aanvang van die program setupCapacitiveTouch (); _vertraag_ms (1000); // kalibreer na u presiese opstelling kalibreer (); terwyl (1) {// kyk of die knoppie ingedruk word as (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; anders RC5 = 1; laaste staat = 1; } // kyk of die knoppie vrygestel word, anders as (lastState == 1 &&! isTouching (15)) lastState = 0; _vertraag_ms (20); }}
kalibreer:
As hierdie funksie die veranderlikes calibrationValue genoem word, sal maxCalibrationValue en minCalibrationValue opgedateer word. calibrationValue word gebruik deur die isTouching -funksie. Hou in gedagte dat die raakvlak alleen tydens kalibrasie gelaat moet word.
setupCapacitiveTouch:
Moet aan die begin van u program gebel word. Dit stel die nodige stukkies op wat deur die ander funksies gebruik word. Dit voer ook 'n callibration uit. Ek het egter beter resultate behaal deur 'n oomblik te wag en die kalibrasie afsonderlik weer uit te voer.
is aanraak:
Hierdie funksie gee 1 terug as dit 'n toename in kapasitansie op die C12IN0 opspoor en 0 as die kapasitansie naby die een is wat tydens kalibrasie was. Eenvoudig gestel, as iemand aan die pad raak, sal die isTouching -funksie terugkeer 1. Die funksie wil ook 'n parameter as 'n invoer hê, dit is die toleransie wat dit veroorsaak. Hoe hoër die verdraagsaamheid, hoe minder sensitief word dit. In my opstelling het ek gevind 15 werk goed, maar omdat dit afhang van die frekwensie van die ocsillator en hoeveel kapasitansie bygevoeg word as u daarop druk, moet u met hierdie waarde eksperimenteer totdat u iets vind wat vir u werk.
getChargeTime:
As u wil weet hoe lank dit sal neem om die kapasitansie na die CVREF -spanning op te laai, sal hierdie funksie dit toets en 'n heelgetal teruggee. Om die tyd in sekondes te kry, gebruik u hierdie formule: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Hierdie formule kan ook gebruik word om die toleransie -invoer van die isTouching -funksie na sekondes te kry.
Aanbeveel:
Toets Bare Arduino, met speletjiesagteware met behulp van kapasitiewe invoer en LED: 4 stappe
Toets Bare Arduino, met speletjiesagteware met behulp van kapasitiewe invoer en LED: " Push-It " Interaktiewe spel met 'n kaal Arduino -bord, geen eksterne onderdele of bedrading nodig nie (gebruik 'n kapasitiewe 'aanraak' invoer). Hierbo getoon hoe dit op twee verskillende borde werk. Push-It het twee doeleindes. Om vinnig te demonstreer/v
U kan dit met 'n eenvoudige aanraking doen ?: 15 stappe (met foto's)
U kan dit met 'n eenvoudige aanraking doen ?: Ek kon nooit verstaan waarom iemand 'n e-reader wil besit nie. Toe gee my volwasse kinders my 'n Kindle Touch, en ek het maniere gevind om dit vir my te laat doen, baie van wat 'n slimfoon of 'n iPad vir ander mense doen. Eendag sal dit my veroudering vervang
ESP32 Kapasitiewe raakinvoer met behulp van "Metaalgatproppe" vir knoppies: 5 stappe (met foto's)
ESP32 Kapasitiewe raakinvoer met behulp van 'Metallic Hole Plugs' vir knoppies: Terwyl ek besig was met die ontwerpbesluite vir 'n komende ESP32 WiFi Kit 32 -projek wat drie knoppie -invoer benodig, was 'n opvallende probleem dat die WiFi Kit 32 nie 'n enkele meganiese drukknop het nie, tog alleen drie meganiese knoppies, f
ESP8266 Modbus -termostaat met aanraking: 5 stappe
ESP8266 Modbus-termostaat met aanraking: ek sal u in hierdie instruksies wys hoe u 'n mooi termostaat met aanraakskerm kan maak met opsionele Modbus-ondersteuning via RS485 met ArduiTouch ESP en 'n ESP8266 (NodeMCU of Wemos D1 Mini)
Kapasitiewe aanraking met Evive (Arduino -gebaseerde beheerder): 6 stappe (met foto's)
Kapasitiewe aanraking met Evive (Arduino -gebaseerde beheerder): Weet u hoe die aanraakskerm van u slimfoon werk? Die slimfoon het 'n verskeidenheid aanraaksensors onder die glasskerm. Deesdae is dit maklik gebaseer op kapasitansie -aanraakwaarnemingstegnologie en selfs 'n sagte aanraking. Kapasitiewe aanraking word waargeneem