Arduino Asked by Amin Abbasi on December 7, 2021
I made a wireless keyboard, but I just need 4 button for my project: left control, left shift, F1, F2.
The problem: When I hold button – it acts like many key presses and releases, but I need, that when I press & hold button – it also acts like I press & hold it.
Could you please help me?
Here is source code:
Transfer_e5.ino: https://www.paste.org/108039
Receiver_e5.ino: https://www.paste.org/108040
Or 1 rar package:
https://easyupload.io/o3c5sp
Thank you
Or I can put them just here, if you wish.
Receiver:
#include <Keyboard.h>
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
RF24 radio(8,7); // (ce,cs)
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));
}
}
Transfer
#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));
}
}
}
The root problem is that you send each several ms new key event and on receiver each time you get this event, you call Keyboard.press
and right away Keyboard.release
. So, it behaves as several key press-releases.
At sender side you should send 2 types of events:
At receiver side you should
Keyboard.press
, and don't call Keyboard.release
Keyboard.release
Edit: I've made changes to your source code, please, try it
Transfer
#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;
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;
}
}
Receiver
#include <Keyboard.h>
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
RF24 radio(8,7); // (ce,cs)
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));
}
}
Answered by Ihor Drachuk on December 7, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP