Sketch Tombol Sentuh Arduino

Tidak perlu hardware tambahan, arduino saja dengan sketch yang ada dibawah ini sudah dapat digunakan untuk mendeteksi sentuhan tangan, Karena saya suka object oriented programing, jadi saya sudah buatkan struct/class c++ nya agar nanti ketika suatu saat ingin menggunakan tidak perlu repot coding lagi.

Sebagai contoh saya sudah membuat sebuah project sederhana Tombol Sentuh untuk mengatur led yang saya upload videonya diyoutube. dalam artikel ini saya tidak akan membahas tentang lednya, untuk kode lednya bisa langsung dilihat sendiri di sketchnya.

Touch Sensor

Ini adalah struct c++ class untuk mendeteksi nilai capasitas
code ini dapat bekerja dengan cara menghubungkan pin send dan receive pin dengan resitor yang memiliki nilai hambatan besar, saya disini menggunakan resistor 670K, mungkin bisa dicoba dengan nilai lain misalkan 1M.

Dalam gambar saya menggunakan pin Analog tapi sebenarnya tidak harus.
Selanjutnya buat sebuah file dengan nama touch_sensor.h kemudian copy code berikut ini,, eh terserah sih mau ditulis satu-satu juga boleh 🙂
file ini dapat anda simpan di folder library atau bisa juga disimpan dalam satu folder dengan sketch arduino,

 

#ifndef TOUCH_SENSOR_H
#define TOUCH_SENSOR_H
 
#define MICRODELAY 100 

struct TouchSensor
{
    uint8_t spin;
    uint8_t rpin;
    uint8_t maxreadingtime = 100; 
    
    TouchSensor(uint8_t s,uint8_t r)
    {
        spin = s;
        rpin = r;
    }

    void prepare()
    {
        pinMode(spin,OUTPUT);
        pinMode(rpin,INPUT);
    }

    int trigPin()
    {  

        
    noInterrupts();
         
        digitalWrite(spin,HIGH);
        pinMode(rpin,OUTPUT);
        digitalWrite(rpin,LOW);
        delayMicroseconds(MICRODELAY);
        pinMode(rpin,INPUT); 

        int errtime = 0;
        while(digitalRead(rpin) == LOW && errtime < maxreadingtime)
        {
            errtime++;
        } 
        
        digitalWrite(spin,LOW);
        pinMode(rpin,OUTPUT);
        digitalWrite(rpin,HIGH);
        delayMicroseconds(MICRODELAY);
        pinMode(rpin,INPUT);  
        while(digitalRead(rpin) == HIGH && errtime < maxreadingtime)
        {
            errtime++;
        } 
    interrupts();
        return errtime - 2;
        
    }

   int getValue(uint8_t sampletime)
    {
        int total = 0;
        for(int i=0; i < sampletime;i++)
        {
            total += trigPin();
            
        } 
        float ftotal = total / sampletime;        
        return (int) ftotal;
    }
  
};

#endif

Prinsip kerjanya tangan manusia ini memiliki sifat dapat menyimpan arus listrik, seperti capasitor,
touchsensor ini melibatkan dua pin arduino, kita sebut saja spin dan rpin.

Dalam function trigPin, arduino akan mengirimkan arus (+) HIGH melalui melalui spin, dimana spin ini terhubung dengan rpin dengan sebuah resistor besar, kemudian code akan merubah rpin menjadi mode output dilancjutkan dengan delaymicroseconds, setelah delay, rpin akan dirubah menjadi mode Input dan akan dilanjutkan dengan digitalRead(rpin).

Jika pada kondisi normal (tidak disentuh) maka seketika digitalRead menjadi HIGH karena rpin terhubung dengan spin yang sedari tadi sudah dalam posisi HIGH, namun jika dalam kondisi disentuh, rpin akan menerima LOW karena tangan kita menyimpan arus negative dari rpin itu sendiri dan menyimpan untuk beberapa saat, nah waktu simpan inilah yang kita hitung untuk menentukan seberapa besar nilai kapasitasnya,

pada proses selanjutnya saya membalik polaritas untuk mendapatkan hasil lebih akurat.

TButton

Untuk memudahkan juga saya membuat sebuah class agar implementasi touch_sensor menjadi lebih mudah, disini saya sudah memperhitungkan nilai yang didapat untuk menentukan longpress dan shortpress
untuk menggunakannya kita cukup meng-extends class TButton dan meng-override function shortpress atau longpress, atau keduanya tergantung kebutuhan.

disini saya beri nama filenya tbutton.h
berikut ini codenya

#ifndef TBUTTON_H
#define TBUTTON_H

#define LONGPRESSEDTIME 10
#include "touch_sensor.h"


struct TButton
{
    TouchSensor *touchsensor;

    uint8_t rpin;
    TButton(uint8_t pinS, uint8_t pinR)
    {    
      rpin = pinR;
      touchsensor = new TouchSensor(pinS,pinR);
    }
    ~TButton()
    {
      delete touchsensor;
    }

    void setupPin()
    {  
        touchsensor->prepare();
    }

    virtual void shortPress()
    { 
    }

    virtual void longPress()
    { 
    }
   
    uint8_t pressed = 0;  
    void check()
    {  
        
        int total =  touchsensor->getValue(30);    
//        Serial.print(rpin);
//        Serial.print(" : ");
//        Serial.print(total);
//        Serial.print("\t");
//        Serial.println();
 
        if(total > 10)
        { 
             pressed++;
             if(pressed == LONGPRESSEDTIME)
             {
                 longPress(); 
             }
        } else 
        {  
            if(pressed>0 && pressed < LONGPRESSEDTIME)
               { 
                   
                  shortPress();
               }
               
               pressed = 0;
        } 

         
    }
};

#endif


TimeWait.h

Untuk memudahkan saya membuat timewait sebagai pengganti delay, karena delay akan mengganggu Tbutton
dapat anda simpan difile bernama time_wait.h
kodenya hanya sederhana seperti ini..

#ifndef TIME_WAIT_H
#define TIME_WAIT_H

struct TimeWait
{
    unsigned long mytime=0;
    boolean micromode  =false;
    unsigned long getmytime()
    {
        if(micromode) return micros();
        return millis();
    }
    
    boolean waitUntil(unsigned long waittime,boolean autoreset)
    {
        unsigned long currenttime = getmytime();
        if((currenttime - mytime) > waittime)
        {
            if(autoreset)
            mytime = currenttime;
            return true;
        }
        return false; 
    }

    boolean waitUntil(unsigned long waittime)
    {
        return waitUntil(waittime,true);
    }
    void resetoTimeNow()
    {
        mytime = getmytime();
    }
};

#endif

Semua file-file itu dapat anda simpan di folder library tapi saya lebih suka menyimpannya di foolder prokect saya berdampingan dengan file sketch nya sehingga tidak semua file header numpuk di folder librarry.

jadi semua filenya adalah

  • tbutton.h
  • tbutton.h
  • time_wait.h
  • touch_sensor.h; dan
  • demoSpeedUpDown.ino

demoSpeedUpDown.ino adalah nama file sketch isi kodenya seperti ini..

#include "time_wait.h"
#include "tbutton.h"

struct CircleLed
{
    void prepare()
    {
        
      for(int i=2;i< 10;i++)
      pinMode(i,OUTPUT);  
    }
    TimeWait tw;
    int last = 2;
    int waitfor = 100;
    int lamp = 1;
    boolean rightmode = true;
    boolean testmode = false;
    void check()
    {
        
      
        if(!tw.waitUntil(waitfor)) return;

        if(testmode)
        { 
            int count = 0;
            for(int i=2;i< 10;i++)
            {   
                if(count <= lamp) digitalWrite(i,HIGH);
                else  digitalWrite(i,LOW);
                count++;
            } 
            return;
        }
        for(int i=2;i< 10;i++)
        {
            int B = (i==last)? HIGH:LOW; 
            digitalWrite(i,B);
        } 

        if(rightmode)             
          last++;
        else
          last--;
        
        if(last >9) last  = 2;
        if(last < 2) last = 9;
    }
    
    void up()
    {
        if(testmode)
        {
            lamp++;            
            if(lamp > 9) lamp = 9;
            return;
        }
        waitfor -=10;
        if(waitfor<0) waitfor = 0;

        
    }
    void down()
    {
        if(testmode)
        {
            lamp--;
            if(lamp < 0) lamp = 0;
            return;
        }
        waitfor +=10;
    }
};


struct But1:public TButton
{
    CircleLed *led;
    But1(): TButton(A3,A4) {}
    void shortPress()
    {
        led->up();
    }
    void longPress()
    {
        led->testmode ^=  true;
        if(led->testmode)
        {
            led->waitfor = 100;
        }
    }

};

struct But2:public TButton
{
    CircleLed *led;
    But2(): TButton(A3,A5) {}
    void shortPress()
    {
        led->down();
    }
    void longPress()
    {
        Serial.println("Touched");
        led->rightmode ^=  true;
    }
};

CircleLed cl;
But1 but1;
But2 but2;

TimeWait twbut;
void setup() { 
    Serial.begin(9600);
    cl.prepare();
    but1.setupPin();
    but1.led = &cl;
    
    but2.setupPin();
    but2.led = &cl;
}


void loop() {

    cl.check();
    if(twbut.waitUntil(10))
    {
        but1.check();
        but2.check();
    }
    
}