Удерживающие кнопки (клавиатура)
Я сделал беспроводную клавиатуру, но для моего проекта мне нужно всего 4 кнопки: левое управление, левый шифт, F1, F2. Проблема: когда я удерживаю кнопку - она действует как множество нажатий и отпусканий клавиш, но мне нужно, чтобы при нажатии & кнопка удержания - она также действует так, как будто я нажимаю & держи.
Не могли бы вы мне помочь?
Вот исходный код:
Transfer_e5.ino: https://www.paste.org/108039
Receiver_e5.ino: https://www.paste.org/108040
Или 1 rar-пакет: https://easyupload.io/o3 c5sp
Спасибо
Или я могу разместить их здесь, если хотите.
Получатель:
#include <Keyboard.h>
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
RF24 radio(8,7); // (се, кс)
RF24Network network(radio);
const uint16_t this_node = 00;
const uint16_t other_node = 03;
unsigned int laser_state=0;
const unsigned long my_interval = 500;
unsigned long last_sent;
unsigned int income=0;
void setup(void)
{
Serial.begin(115200);
pinMode(9,INPUT_PULLUP);
SPI.begin();
radio.begin();
network.begin(90,this_node);
pinMode(4,OUTPUT);
digitalWrite(4,LOW);
}
void loop(void){
digitalWrite(4,LOW);
network.update();
if ( network.available() ) {
RF24NetworkHeader header;
network.read(header,&income,sizeof(income));
if(income==10){
Serial.println("f1");
Keyboard.press(KEY_F1);
income=0;
}
if(income==11){
Serial.println("f2");
Keyboard.press(KEY_F2);
income=0;
}
if(income==12){
Serial.println("ctrl");
Keyboard.press(KEY_LEFT_CTRL);
income=0;
}
if(income==13){
Serial.println("shift");
Keyboard.press(KEY_LEFT_SHIFT);
income=0;
}
Keyboard.releaseAll();
}
unsigned long now = millis();
if ( now - last_sent >= my_interval )
{
// Serial.print("pin");
// Serial.println(digitalRead(9));
last_sent = now;
laser_state = digitalRead(9);
RF24NetworkHeader header(other_node);
bool ok = network.write(header,&laser_state,sizeof(laser_state));
}
}
Перенос
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
RF24 radio(8,7);
RF24Network network(radio);
const uint16_t this_node = 03;
const uint16_t other_node = 00;
unsigned int laser_state=0;
const unsigned long interval = 5;
unsigned long last_sent;
unsigned int b1=1;
unsigned int b2=1;
unsigned int b3=1;
unsigned int b4=1;
unsigned int d1=10;
unsigned int d2=11;
unsigned int d3=12;
unsigned int d4=13;
//TR1
int btn1 = 3;
int btn2 = 4;
int btn3 = 5;
int btn4 = 6;
void setup(void)
{
// Serial.begin(9600);
pinMode(btn1,INPUT_PULLUP);
pinMode(btn2,INPUT_PULLUP);
pinMode(btn3,INPUT_PULLUP);
pinMode(btn4,INPUT_PULLUP);
SPI.begin();
radio.begin();
network.begin(90,this_node);
}
void loop(void){
network.update();
unsigned long now = millis();
if ( now - last_sent >= interval )
{
last_sent = now;
b1 = digitalRead(btn1);
b2 = digitalRead(btn2);
b3 = digitalRead(btn3);
b4 = digitalRead(btn4);
if(b1==0){
// Serial.println("F1");
RF24NetworkHeader header(other_node);
bool ok = network.write(header,&d1,sizeof(d1));
}
if(b2==0){
// Serial.println("F2");
RF24NetworkHeader header(other_node);
bool ok = network.write(header,&d2,sizeof(d2));
}
if(b3==0){
// Serial.println("Ctrl");
RF24NetworkHeader header(other_node);
bool ok = network.write(header,&d3,sizeof(d3));
}
if(b4==0){
// Serial.println("Shift");
RF24NetworkHeader header(other_node);
bool ok = network.write(header,&d4,sizeof(d4));
}
}
}
@Amin Abbasi, 👍0
Обсуждение1 ответ
Коренная проблема заключается в том, что каждые несколько мс вы отправляете новое событие клавиши, а на получателе каждый раз, когда вы получаете это событие, вы вызываете Keyboard.press
и сразу же Keyboard.release
. Таким образом, он ведет себя как несколько ключевых пресс-релизов.
На стороне отправителя вы должны отправлять 2 типа событий:
- Кнопка нажата (и какая кнопка)
- Ключ отпущен (и какая кнопка)
На стороне получателя вы должны
- Когда вы получаете сообщение "нажмите" событие, вызовите
Keyboard.press
и не вызывайтеKeyboard.release
- Когда вы получаете сообщение "освобождение" событие, вызовите
Keyboard.release
Обновление: я внес изменения в ваш исходный код, пожалуйста, попробуйте
Перенос
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
RF24 radio(8,7);
RF24Network network(radio);
const uint16_t this_node = 03;
const uint16_t other_node = 00;
unsigned int laser_state=0;
const unsigned long interval = 5;
unsigned long last_sent;
unsigned int b1=1;
unsigned int b2=1;
unsigned int b3=1;
unsigned int b4=1;
unsigned int d1=10;
unsigned int d2=11;
unsigned int d3=12;
unsigned int d4=13;
//ТР1
int btn1 = 3;
int btn2 = 4;
int btn3 = 5;
int btn4 = 6;
void setup(void)
{
// Serial.begin(9600);
pinMode(btn1,INPUT_PULLUP);
pinMode(btn2,INPUT_PULLUP);
pinMode(btn3,INPUT_PULLUP);
pinMode(btn4,INPUT_PULLUP);
SPI.begin();
radio.begin();
network.begin(90,this_node);
}
void loop(void){
network.update();
unsigned long now = millis();
if (now - last_sent >= interval)
{
last_sent = now;
auto newB1 = digitalRead(btn1);
auto newB2 = digitalRead(btn2);
auto newB3 = digitalRead(btn3);
auto newB4 = digitalRead(btn4);
unsigned int packet[2];
if(newB1 != b1){
// Serial.println("F1");
packet[0] = d1;
packet[1] = newB1;
RF24NetworkHeader header(other_node);
bool ok = network.write(header,packet,sizeof(packet));
}
if(newB2 != b2){
// Serial.println("F2");
packet[0] = d2;
packet[1] = newB2;
RF24NetworkHeader header(other_node);
bool ok = network.write(header,packet,sizeof(packet));
}
if(newB3 != b3){
// Serial.println("Ctrl");
packet[0] = d3;
packet[1] = newB3;
RF24NetworkHeader header(other_node);
bool ok = network.write(header,packet,sizeof(packet));
}
if(newB4 != b4){
// Serial.println("Shift");
packet[0] = d4;
packet[1] = newB4;
RF24NetworkHeader header(other_node);
bool ok = network.write(header,packet,sizeof(packet));
}
b1 = newB1;
b2 = newB2;
b3 = newB3;
b4 = newB4;
}
}
Получатель
#include <Keyboard.h>
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
RF24 radio(8,7); // (се, кс)
RF24Network network(radio);
const uint16_t this_node = 00;
const uint16_t other_node = 03;
unsigned int laser_state=0;
const unsigned long my_interval = 500;
unsigned long last_sent;
void setup(void)
{
Serial.begin(115200);
pinMode(9,INPUT_PULLUP);
SPI.begin();
radio.begin();
network.begin(90,this_node);
pinMode(4,OUTPUT);
digitalWrite(4,LOW);
}
void loop(void){
digitalWrite(4,LOW);
network.update();
unsigned int income[2] = {0, 0};
if ( network.available() ) {
RF24NetworkHeader header;
network.read(header,&income,sizeof(income));
auto keyCode = income[0];
auto keyPress = !income[1];
if(keyCode == 10){
Serial.println("f1");
if (keyPress) {
Keyboard.press(KEY_F1);
} else {
Keyboard.release(KEY_F1);
}
}
if(keyCode == 11){
Serial.println("f2");
if (keyPress) {
Keyboard.press(KEY_F2);
} else {
Keyboard.release(KEY_F2);
}
}
if(keyCode == 12){
Serial.println("ctrl");
if (keyPress) {
Keyboard.press(KEY_LEFT_CTRL);
} else {
Keyboard.release(KEY_LEFT_CTRL);
}
}
if(keyCode == 13){
Serial.println("shift");
if (keyPress) {
Keyboard.press(KEY_LEFT_SHIFT);
} else {
Keyboard.release(KEY_LEFT_SHIFT);
}
}
keyCode = 0;
}
unsigned long now = millis();
if ( now - last_sent >= my_interval )
{
// Serial.print("pin");
// Serial.println(digitalRead(9));
last_sent = now;
laser_state = digitalRead(9);
RF24NetworkHeader header(other_node);
bool ok = network.write(header,&laser_state,sizeof(laser_state));
}
}
спасибо за ответ на мой вопрос, то, что я хочу от этой клавиатуры, это когда я удерживаю 3 кнопки вместе (левый контроль + левый Shift + F1), затем я нажимаю кнопку F2, это должно работать так (я знаю, что это звучит глупо, но мне это нужно) ,,, я был бы признателен, если бы вы могли исправить коды и отправить их для меня, еще раз спасибо, @Amin Abbasi
@AminAbbasi готово, @Ihor Drachuk
еще раз спасибо, я в пути, и это займет 2 дня, я проверю коды и устройство в воскресенье и немедленно сообщу вам об этом, еще раз спасибо, и как я могу компенсировать, я должен вам один, @Amin Abbasi
@AminAbbasi рад вам помочь, надеюсь все получится :) Если нет - напишите еще раз и мы постараемся выяснить что не так!, @Ihor Drachuk
- Arduino nano как клавиатура HID
- Keyboard.h не найден
- Нажать клавишу Windows, используя «keyboard.press();»
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Какие диоды использовать в матричном вводе кнопок/клавиш? (Изготовление игровой клавиатуры)
- NodeMCU поддерживает внедрение ключей?
- ESP8266: #include <Keyboard.h>вызывает фатальную ошибку: HID.h: No such file or directory
- Digispark ATtiny 85 - не распознается как HID устройство
Я *** НЕ *** загружаю какой-то случайный файл RAR с какого-то случайного сайта. Разместите свой код здесь, если вам нужна помощь., @Majenko
твое право, лол, @Amin Abbasi
я добавляю коды в заметку, еще раз спасибо, @Amin Abbasi