This commit is contained in:
2025-09-11 18:21:15 +02:00
commit a31f0bc666
3 changed files with 2351 additions and 0 deletions

2163
base/Haptic-Tester v7.step Normal file

File diff suppressed because it is too large Load Diff

BIN
base/Haptic-Tester-v7.f3d Normal file

Binary file not shown.

View File

@ -0,0 +1,188 @@
/*
EEncoder Basic Example
Demonstrates simple usage of the EEncoder library with a rotary
encoder and push button for RP2040-based boards.
Hardware:
- Connect encoder A pin to GPIO 2
- Connect encoder B pin to GPIO 3
- Connect encoder button to GPIO 4
- Assumes encoder module has built-in pull-up resistors
This example:
- Increments/decrements a value with the encoder
- Resets to zero on button press
- Enters fine-tune mode on long press
- Shows acceleration when turning quickly
*/
#include <EEncoder.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "Adafruit_DRV2605.h"
Adafruit_DRV2605 drv;
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, OLED_RESET);
// Pin definitions
const uint8_t ENCODER_PIN_A = 5;
const uint8_t ENCODER_PIN_B = 13;
const uint8_t ENCODER_BUTTON = 3;
// Create encoder instance
// The last parameter (4) indicates this encoder produces 4 counts per physical detent
// Adjust this value based on your specific encoder hardware
EEncoder encoder(ENCODER_PIN_A, ENCODER_PIN_B, ENCODER_BUTTON, 4);
// Variable to track the current value
int currentValue = 0;
bool fineTuneMode = false;
bool triggered = false;
// Encoder rotation callback
void onEncoderRotate(EEncoder& enc) {
// Get the increment - always ±1 per physical detent (normalized)
int8_t increment = enc.getIncrement();
// In fine-tune mode, ignore acceleration
if (fineTuneMode) {
currentValue += increment; // 1 per click
} else {
// Normal mode - use the increment (may be accelerated to ±5)
currentValue += increment;
}
if(currentValue > 122) currentValue = 0;
if(currentValue < 0) currentValue = 122;
// Print the new value
Serial.print("Value: ");
Serial.print(currentValue);
if (fineTuneMode) Serial.print(" [FINE]");
if (abs(increment) > 1) Serial.print(" [FAST]");
Serial.println();
}
// Button press callback
void onButtonPress(EEncoder& enc) {
// Reset value to zero
fineTuneMode = false;
triggered = true;
Serial.println("Button pressed - haptic feedback triggered");
}
// Long press callback
void onLongPress(EEncoder& enc) {
// Toggle fine-tune mode
fineTuneMode = !fineTuneMode;
Serial.print("Long press - Fine tune mode ");
Serial.println(fineTuneMode ? "ON" : "OFF");
}
void setup() {
// Initialize serial communication
Serial.begin(115200);
while (!Serial) {
; // Wait for serial port to connect (needed for some boards)
}
Wire1.setSCL(15);
Wire1.setSDA(14);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();
delay(2000); // Pause for 2 seconds
display.clearDisplay();
Serial.println("EEncoder Basic Example");
Serial.println("Rotate encoder to change value, press button to reset");
Serial.println("Long press to toggle fine-tune mode");
Serial.println("Turn quickly to see acceleration!");
// Set up the callbacks
encoder.setEncoderHandler(onEncoderRotate);
encoder.setButtonHandler(onButtonPress);
encoder.setLongPressHandler(onLongPress);
// Enable acceleration with 5x multiplier
encoder.setAcceleration(true);
encoder.setAccelerationRate(5);
// Optional: adjust timing if needed
// encoder.setDebounceInterval(5); // Faster debounce
// encoder.setLongPressDuration(750); // Longer press required
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
Wire.setSCL(17);
Wire.setSDA(16);
if (! drv.begin()) {
Serial.println("Could not find DRV2605");
while (1) delay(10);
}
drv.writeRegister8(DRV2605_REG_OVERDRIVE, 1);
drv.writeRegister8(DRV2605_REG_RATEDV, 255);
drv.selectLibrary(1);
// I2C trigger by sending 'go' command
// default, internal trigger when sending GO command
drv.setMode(DRV2605_MODE_INTTRIG);
}
void setup1(){
}
String value = "";
void loop() {
// Update the encoder - this must be called as often as possible
encoder.update();
if(triggered){
// set the effect to play
drv.setWaveform(0, currentValue); // play effect
drv.setWaveform(1, 0); // end waveform
// play the effect!
drv.go();
delay(500);
triggered = false;
}
}
void loop1(){
display.clearDisplay();
display.setCursor(0,0); // Start at top-left corner
display.println(currentValue);
display.display();
delay(20);
}