#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Mouse.h>
#include <Keyboard.h>
#include <MPU6050_tockn.h>
#include <ClickEncoder.h>
// OLED display settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// MPU6050 settings
MPU6050 mpu6050(Wire);
// Rotary encoder settings
const int encoderPinA = 2;
const int encoderPinB = 3;
const int encoderButtonPin = 4;
ClickEncoder encoder(encoderPinA, encoderPinB, encoderButtonPin, 2);
// Shortcut keys
const int numShortcuts = 10;
const uint8_t shortcutKeys[numShortcuts] = {
KEY_C, KEY_X, KEY_V, KEY_ESC, KEY_RETURN, KEY_LEFT_CTRL, KEY_LEFT_SHIFT, KEY_LEFT_ALT, KEY_TAB
};
const char* shortcutNames[numShortcuts] = {
"Copy", "Cut", "Paste", "Esc", "Enter", "Ctrl", "Shift", "Alt", "Tab"
};
int currentShortcut = 0;
// Variables for tracking encoder rotation
int16_t lastEncoderValue = 0;
void setup() {
Wire.begin();
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
}
void loop() {
display.clearDisplay();
// Read gyroscope data
mpu6050.update();
float gyroX = mpu6050.getAngleX();
float gyroY = mpu6050.getAngleY();
float gyroZ = mpu6050.getAngleZ();
// Control rotation, panning, and zooming in Fusion 360
Fusion360Control(gyroX, gyroY, gyroZ);
// Rotate the encoder and change the current shortcut key
int16_t encoderValue = encoder.getValue();
if (encoderValue != lastEncoderValue) {
if (encoderValue > lastEncoderValue) {
currentShortcut = (currentShortcut + 1) % numShortcuts;
} else {
currentShortcut = (currentShortcut - 1 + numShortcuts) % numShortcuts;
}
lastEncoderValue = encoderValue;
}
// Display active shortcut key on the OLED display
display.setCursor(0, 0);
display.print("Active Shortcut: ");
display.println(shortcutNames[currentShortcut]);
display.display();
delay(10);
}
void Fusion360Control(float x, float y, float z) {
// Adjust the sensitivity of rotation, panning, and zooming here
float rotationSpeed = 0.5;
float panSpeed = 2.0;
float zoomSpeed = 5.0;
// Control rotation
Mouse.move(0, 0, z * rotationSpeed);
// Control panning
Mouse.move(x * panSpeed, -y * panSpeed, 0);
// Control zooming
Mouse.move(0, 0, y * zoomSpeed);
}