#include <Mouse.h>
const int xAxis = A1; // Analoger sensor für die X-Achse
const int yAxis = A2; // Analoger sensor für die Y-Achse
int range = 12; // Ausgabebreite der X- und Y-Bewegung
int responseDelay = 2; // Antwortverzögerung der Maus in ms
int threshold = range / 4; // Wartethreshold
int center = range/2; // Warteposition
int minima[] = {1023, 1023}; // Aktuelle analogRead Minima für {x, y}
int maxima[] = {0, 0}; // Aktuelle analogRead Maxima für {x, y}
int axis[] = {xAxis, yAxis}; // Pinnummern für {x, y}
int mouseReading[2]; // Finale Position von {x, y}
void setup() {
Mouse.begin();
}
void loop() {
// Lies uns skaliere beide Achsen:
int xReading = readAxis(0);
int yReading = readAxis(1);
// Bewege die Maus:
Mouse.move(xReading, yReading, 0);
delay(responseDelay);
}
/*
Liest eine Achse (0 oder 1 für x oder y) und skaliert die
analoge Eingabebreite auf eine Breite von 0 bis <range>
*/
int readAxis(int axisNumber) {
int distance = 0; // Distanz von der Bildschirmmitte zum Rand
// Lies den analogen Inputpin
int reading = analogRead(axis[axisNumber]);
// Wenn der aktuelle Wert das Maximum oder Minimum über-/ untersteigt,
// setze das Maximum oder Minimum neu:
if (reading < minima[axisNumber]) {
minima[axisNumber] = reading;
}
if (reading > maxima[axisNumber]) {
maxima[axisNumber] = reading;
}
// Mappe den gelesenen Wert von der Eingabebreite auf die Ausgabebreite:
reading = map(reading, minima[axisNumber], maxima[axisNumber], 0, range);
// Wenn die Ausgabe außerhalbe des Wartethresholds liegt,
// nutze sie als Distanz:
if (abs(reading - center) > threshold) {
distance = (reading - center);
}
// Die Y-Achse muss invertiert werden, um die Bewegung richtig anzuzeigen.
if (axisNumber == 1) {
distance = -distance;
}
// Gibt die Distanz für die Achse zurück
return distance;
}