bin recht neu und versuche folgendes:
Verwende aktuell einen Arduino Micro und möchte mit Schalter Tastatureingaben ausgeben.
Für die Eingabe verwende ich einen 3 Positionen Wippschalter der je nach Stellung einen einzelnen Tastendruck ausgeben soll. Ich hab schon einige Codes ausprobiert aber keiner erbrachte das erwartete Ergebnis. Wäre daher dankbar für Anregungen
Hallo.
Was verstehst Du unter "einen Tastendruck ausgeben". Simulierst Du mit dem Arduino Micro eine Tastatur und möchtest beim Umschalten des Schalters einen Keycode an den Computer senden?
Oder willst Du beim Umschalten irgendein Zeichen seriell übertragen und ev. im Seriellen Monitor darstellen?
Ok dann versuche ich mein Ziel zu verdeutlichen.
ich möchte mit dem Micro eine Tastatur simulieren. Geplant ist auf dem Pin2 den Buchstaben "b" und über dem Pin3 den Buchstaben "a" auszugeben. Dazu verwende ich einen 3 Positionsschalter(Wippschalter). Wird der Schalter z.B. auf pin2 gestellt und gehalten, soll nur einmal der Buchstabe "b" ausgeben werden.
Mein Sketch erzeugt aber leider eine pausenlose Ausgabe bis der Schalter wieder in Mittelstellung gestellt wird.
#include "Keyboard.h"
int ENG1_Pin = 2;
int ENG2_Pin = 3;
void setup() {
pinMode(ENG1_Pin, INPUT_PULLUP);
pinMode(ENG2_Pin, INPUT_PULLUP);
Keyboard.begin();
}
void loop() {
if (digitalRead(ENG1_Pin) == LOW)
{
Keyboard.press('b');
Keyboard.releaseAll();
}
if (digitalRead (ENG2_Pin) == LOW)
{
Keyboard.press('a');
Keyboard.releaseAll();
}
}
Ich habe Dir alles geliefert.
.press() und .release() gehört dann jeweils unter die serielle Ausgabe für links und rechts, da Du Mitte nicht benutzt. (da könnte noch ein dritter Buchstabe rein)
Auch wenn my_xy_projekt es schon geschrieben habe und ich es nicht gleich verstanden habe erklähre ich Dir es mit Worten.
Wenn Du etwas nur einmal auslösen willst nußt Du erkennen ob der Taster/Schalter seine Position/Zustand gerade geändert hat. Das erkennt man indem man sich den Wert den man im vorherigen Durchlauf der loop() Funktion mißt abspeichert.
ZB speichert die Varible rechtsold den Wert des vorherigen Durchgangs.
Dann kontrolliert man
rechts = digitalRead(ENG1_Pin)
If (rechts != rechtsold && rechtsold == LOW)
{
//Taster gerade gedrückt ( ENG1_Pin auf HIGH gegangen
Ausgabe Taste "a"
}
rechtsold = rechts;
delay(20); // zum Entprellen
@my_xy_projekt: dein Sketch hätte mit Sicherheit funktioniert aber wirkt auf mich wie chinesisch. Mir ist es wichtig zu verstehen was ich da Anwende. Zumal das Adaptieren nach "Keyboard.h" hätte mich vor einer Herausforderung gestellt
@uwefed: danke für deine Erklärung inkl. Beispiel. Hat auch funktioniert
hab nun aber noch ein weiteres wohl kleines Problem. Z.z ist das bei mir so, das der Buchstabe erst dann ausgegeben wird wenn der Kontakt zu Pin 2 geöffnet wird. Der Buchstabe soll aber ausgebeben werden, wenn der Kontakt zu Pin2 geschlossen ist. Wie bei einer echten Tastatur halt. Bei drucken soll der Buchstabe ausgegeben werden und nicht beim los lassen.
Tja.
Mein Sketch löst beim drücken aus.
Ich kann Dir leider nicht helfen, wenn Du Dich der Herausforderung nicht stellst.
Und PS: Das delay() wird Dir irgendwann auf die Füsse fallen. gewöhne es Dir nicht an.
Schade. Es war ein einfacher Versuch.
PPS: Was hat Dich gehindert Serial raus und keyboard rein zu nehmen? Aber ich glaub das ist vergebens Liebesmüh.
@my_xy_projekt: Danke dir! Nachdem ich mittlerweile herausgefunden habe das dieser Serial.Print bzw. Serial-Monitor ist bin ich auch selbst auf die Idee gekommen gegen Keyboard-Befehle auszutauschen. Jetzt wird mir auch einiges klarer auch wenn manche Zeilen Fragen aufwerfen. Das finde ich aber noch heraus
Danke dir für deine/eure Hilfe.
Dennoch würde mich Interessieren warum Keyboard.press() nicht beim Drücke auslöst. Ist das so gewollt?
Hatte ich auch schon als erstes probiert gehabt. Aber auch hier erst beim loslassen wird der Buchstaben ausgegeben. Daraufhin habe ichs mit Press() / Release() probiert. Leider mit dem gleichem Ergebnis. Bin dann erstmal bei Press()/Release() geblieben.
/*
* Arduino Pro Micro - 2 Tastendrücke
* https://forum.arduino.cc/t/einen-tastendruck-ausgeben/1028454/
* by noiasca
* 2022-09-07
* board Resetten und halten
* Serial auf die angegebenen umschalten
* Kompilieren&Hochladen drücken
* Wenn fertig Reset loslassen
*
*/
#include "Keyboard.h"
constexpr byte schalterRechtsPin = 2;
constexpr byte schalterLinksPin = 3;
class Button { // class to debounce switches
const byte buttonPin; // the pin for the button
static constexpr byte debounceDelay = 40; // the debounce time - one value for all buttons (hence "static")
const bool active; // is the button HIGH or LOW active
bool lastButtonState = HIGH; // previous state of pin
byte lastDebounceTime = 0; // previous debounce time (we just need short debounce delay, so the rollover of the byte variable works fine and spares 3 bytes compared to an unsigned long)
public:
Button(byte attachTo, bool active = LOW) : buttonPin(attachTo), active(active) {}
void begin() { // sets the pinMode and optionally activates the internal pullups
if (active == LOW)
pinMode(buttonPin, INPUT_PULLUP);
else
pinMode(buttonPin, INPUT);
}
bool wasPressed() {
bool buttonState = LOW;
byte reading = LOW;
if (digitalRead(buttonPin) == active) reading = HIGH;
if (((millis() & 0xFF ) - lastDebounceTime) > debounceDelay) {
if (reading != lastButtonState && lastButtonState == LOW) {
buttonState = HIGH;
}
lastDebounceTime = millis() & 0xFF; // we store just the last byte from millis()
lastButtonState = reading;
}
return buttonState;
}
};
Button buttonA(schalterRechtsPin); // create a button object on this pin, by default, activate internal pullups
Button buttonB(schalterLinksPin);
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
buttonA.begin();
buttonB.begin();
}
void loop()
{
if (buttonA.wasPressed())
{
Keyboard.print('a');
}
if (buttonB.wasPressed())
{
Keyboard.print('b');
}
}
gibt sofort den Buchstaben aus auch wenn der Kontakt länger geschlossen bleibt.
Meine Aussage bezog sich auf meinen Code der nicht so ganz funzt wie gewollt. Das .print() in euren Code funktioniert war mir klar. Wie dem auch sei...mir wurde geholfen und hab in der tat was dazugelernt.