This code grabs the integrated gamepad API of your browser to use in context of P5. The connection is down through the integrated BLE interface of the ESP32.
This code grabs the integrated gamepad API of your browser to use in context of P5. The connection is down through the integrated BLE interface of the ESP32.
Also have a look at a shader based example: https://editor.p5js.org/simon_oakey/sketches/5rAhgQXJM
CODE FOR ESP32
This sketch is based on the brilliant BLE lib written for Arduino and ESP32 by … . It grabs four Touchpins to send it via Bluetooth as a generic gamepad 🙂
// ---------------------------------- // -------MAIN LOOP ----------------- // ---------------------------------- // init BLE interface to communicate #include <BleGamepad.h> BleGamepad bleGamepad("HELLO_TWO", "Hello Studios",99); // initalize the aTouch objects : aTouch namewahtevet(yourpinnumber); aTouch touch1(2); aTouch touch2(4); aTouch touch3(12); aTouch touch4(13); void setup() { // Serial.begin(9600); bleGamepad.begin(4,2,2); bleGamepad.setAutoReport(true); } void loop() { // simply read input and do some calc touch1.readAndProcessInput(); touch2.readAndProcessInput(); touch3.readAndProcessInput(); touch4.readAndProcessInput(); // just call the touch object properties for further logic :) if(touch1.on_pressed){ Serial.println("T1 pressed"); bleGamepad.press(BUTTON_1); } if(touch2.on_pressed){ Serial.println("T2 pressed"); bleGamepad.press(BUTTON_2); } if(touch3.on_pressed){ Serial.println("T3 pressed"); bleGamepad.press(BUTTON_3); } if(touch4.on_pressed){ Serial.println("T4 pressed"); bleGamepad.press(BUTTON_4); } if(touch1.on_released){ Serial.println("T1 pressed"); bleGamepad.release(BUTTON_1); } if(touch2.on_released){ Serial.println("T2 pressed"); bleGamepad.release(BUTTON_2); } if(touch3.on_released){ Serial.println("T3 pressed"); bleGamepad.release(BUTTON_3); } if(touch4.on_released){ Serial.println("T4 pressed"); bleGamepad.release(BUTTON_4); } delay(10); }
// ---------------------------------- // ------- 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); } };