🔍

Basic touch helpers for ESP32

Here is an example of basic usage for the helper functions.

// ----------------------------------
// -------MAIN LOOP -----------------
// ----------------------------------

// initalize the aTouch objects : aTouch namewahtevet(yourpinnumber);
aTouch touch1(2);
aTouch touch2(4);
aTouch touch3(12);

void setup() {
  
  Serial.begin(9600);

}

void loop() {
 
  // simply read input and do some calc
  touch1.readAndProcessInput();
  touch2.readAndProcessInput();
  touch3.readAndProcessInput();

  // just call the touch object properties for further logic :)
  if(touch2.on_pressed){ Serial.println("Touch2 pressed"); }
  if(touch2.on_released){ Serial.println("Touch2 released");}
  if( touch2.is_holded){ Serial.println("Touch2 hold very long"); }
  
  delay(40);

}

This is the main code for the helpers. This code needs to be put prior to your mainloop code.


// ----------------------------------
// ------- TRXYS TOUCH HELPERS ------
// ----------------------------------
// ( put this code PRIOR to your mainloop code or you will get nice errors :) )

  // simple lerp helper function

float return_lerp(float _s, int _target,int _time){
 
   _s = _s + (( float(_target) - _s)/float(_time));
   return _s;
   
}

class aTouch {
  private:
    bool prev_touch_state = false;
    byte pin;
    int smooth_time = 4;
    int trigger_threshold = 15;
    long ts = 0;
  public:
    int current_val = 0;
    int smoothed_val = 0;
    int diff_val = 0;
    bool is_triggered = false;
    bool on_pressed = false;
    bool on_released = false;
     bool is_holded = false;
    aTouch(byte pin) {
     this->pin = pin;
    }
    

    void readAndProcessInput() {

        // reset interaction states
        on_pressed = false;
        on_released = false;
        
         // directly read out values TWICE = BUGFIX for debouncing 
         current_val = touchRead(pin);
         delayMicroseconds(10);
         current_val = touchRead(pin);

        //calculate smoothed input values 
         smoothed_val = return_lerp(smoothed_val,current_val,smooth_time);

         // calc current differential sum of button
          diff_val =   smoothed_val - current_val;

          // check if there is a noticable difference input values
          if(  diff_val  > trigger_threshold){

              if(prev_touch_state == false){
                is_triggered = true;
                prev_touch_state = is_triggered;
                on_pressed = true;
                ts = millis(); // set timestamp for hold routine
             }
             
          }else if( diff_val < trigger_threshold*-.4){

              if(prev_touch_state == true){
                is_triggered = false;
                 prev_touch_state = is_triggered;
                 on_released = true;
              }
                
          }


          // calculate timed holding function
          
          if( ts + 2500 < millis() && is_triggered){

               
              is_holded = true;
          }else{

              is_holded = false;
           }
      
     }


     void printAllMetadata() {

           // only use this on one touchinput only - it will skrew up else
           Serial.print (on_pressed);
           Serial.print(","); 
           Serial.print (on_released);
           Serial.print(","); 
           Serial.print (is_triggered);
           Serial.print(","); 
           Serial.print (current_val);
           Serial.print(","); 
           Serial.println(smoothed_val);
           

      
      
     }
};