手把手教学: 键鼠 有线/适配器 改无线(蓝牙/WiFi), 普通键鼠改鼠标宏

一: 需要准备的材料/设备/环境:
1.arduino1.8以上 (最好是1.8,因为2.0我没用过)

2. esp32带蓝牙的单片机*1 (改蓝牙的需要一个, 如果改WiFi需要一个esp32s2,淘宝10块钱 ),

3. ch9350模块一个 (带host的esp32 s2也可以,不过我手里只有一个s2, 用来插没蓝牙功能的台式机上了)

4. 杜邦线几根
二 : 设备连接
没啥好说的,直接上图


这里连接的是单片机的16 17 引脚
三 : 代码(全功能代码)
直接上图
#include <HardwareSerial.h> //串口库
#include "CH9350_USBKEY.h"//ch9350
#include <BleMouse.h> //蓝牙库

这里如果需要改WiFi就需要引用的库,只用蓝牙功能就可以不要


如果需要WiFi功能

这段程序实现WiFi发送结构体, 由于点对点,所以不需要加密

各种初始化






代码部分结束----------------------------------------------------------
四:蓝牙连接(改无线完成,学会了吗)
好了,代码直接上传之后电脑就能搜索到一个蓝牙

连接成功后将鼠标插入就能看到串口打印的鼠标信息了

同时你的电脑上的鼠标指针也会跟着动起来, 到这一步改蓝牙就完成了,可能有的人会觉得没有意义, 请接着往下看
五: WiFi连接
首先我的代码本身是支持WiFi 蓝牙同时工作的, 也就是除了之前介绍的设备外不需要其他任何辅助设备或软件
WiFi的优势: 可以实现一个鼠标同时控制多个设备而不需要设备提前安装啥软件之类的.
WiFi控制的缺点: 被控制的每个设备都需要花10块钱买一个esp32 s2 模块作为物理连接使用, 如果不用物理连接的话网上办法一堆,我就不废话了
本程序使用的WiFi方案是ESP-NOW, 想详细了解的同学请参考官方文档, NOW的控制距离受WiFi信号的约束(空旷距离一百米左右,穿墙要看多厚), 如果需要在复杂环境远程使用建议将NOW换成 ESP-MESH, mesh相较于NOW优势是理论上AB两个设备之间只要有若干个设备C,那么控制距离可以是很远很远, 铺满全国也不是不可能, NOW的优势是两个设备之间不需要连接,跟无线键鼠的原理类似.
使用WiFi的情况下需要将程序稍做改动,例如以鼠标左键为例 , jm_arr(String a) 中可以是任意值,这主要看接收端的配套程序


5. ESP32 s2 接收端程序 :



由于我本身不需要使用WiFi功能,只是先弄着等以后需要的时候再玩,到这里WiFi功能介绍完毕
附上五郎esp32 s2 实现速射的视频【10块钱的简单鼠标宏】
六: 普通鼠标添加宏功能
首先感谢能耐心看到这里, 关于之前的代码部分相信大家有看到

这就是鼠标按下组合键后esp32要实现的功能

这段程序就是将鼠标左键与右键同时按住就会触发鼠标左键连续单击的程序

这段代码很重要!!! 如果不想玩游戏被封号的话请一定要注意,!!
目前大多数游戏都排斥鼠标宏, 想我这个案例使用的严格来讲属于物理外挂, 但是各大游戏厂商都只能通过判断游戏内的数据普通人能不能办到从而来判断是不是使用了外挂, 像我现在这个配置就是我自己按鼠标能达到的一个平均值.
玩FPS游戏的时候也能自己调节压枪,当然也可以调节武器射速

这一段是将鼠标右键与后退键同时按住就触发左右键同时按住的程序, 比如你想要扫射的时候但是锁了射速就可以这样解决

这一段是触发后就用WiFi发送一条消息出去,比如桌子接收到后就亮红光,RGB开始光污染等等, 我这里是通知键盘可以按下"R"键了
七: 如果觉得有用还请点个三连,附代码
鼠标端口
#include <HardwareSerial.h> //Serial Interfaces
#include "CH9350_USBKEY.h"
#include <BleMouse.h>
#include <esp_now.h>
#include <WiFi.h>
BleMouse bleMouse;
//IOs for CH9350 used on ESP32
#define RXKEY 16
#define TXKEY 17
HardwareSerial SerialKey(2); //Keyboard USB to Serial CH9350 @ Serial Interface 1
USB9350_KeyMouse USBKeyMouse; //Create an Instance for Keyboard/ Mouse Decoder
int x, y, z, x1, yi, Button;
unsigned long StartTime, StartTime1, sbmov;
unsigned long rrl; //按键延时
//<<< <<< <<< <<< <<< <<< == == == == == 设置ESP-NOW数据结构体 == == == == == >>> >>> >>> >>> >>> >>> >>
// REPLACE WITH THE MAC Address of your receiver
uint8_t mac_to[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
typedef struct test_struct { // 设置ESP-NOW数据结构体
char a[250];
} test_struct ;
test_struct to_str;
//创建类型变量esp_now_peer_info_t存储有关对等点的信息。
esp_now_peer_info_t peerInfo;
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
String st = status ? "No!" : "Ok!";
Serial.println("`发送回调 :" + st + " `");
}
//<<< <<< <<< <<< <<< <<< == == == == == 各函数 == == == == == >>> >>> >>> >>> >>> >>> >>
void jm_arr(String a) {
// char jm = 'z'; //加密
// char lls[245];
// a.toCharArray(lls, sizeof(lls));
// for (int i = 0; i < a.length(); i++) {
// if (lls[i] != jm) {
// lls[i] = (char)(lls[i] ^ jm);
// }
// }
// String(lss).toCharArray(to_str.a, sizeof(to_str.a));
String(a).toCharArray(to_str.a, sizeof(to_str.a));
esp_now_send(mac_to, (uint8_t *)&to_str, sizeof(to_str));
}
//<<< <<< <<< <<< <<< <<< == == == == == SETUP == == == == == >>> >>> >>> >>> >>> >>> >>
void setup()
{
WiFi.mode(WIFI_STA);
Serial.begin(115200);
Serial.println("Start");
Serial.println("[OLD] MAC: " + WiFi.macAddress());
Serial.println("NEW Wi-Fi 通道: " + String(WiFi.channel()));
bleMouse.begin();
SerialKey.begin(115200, SERIAL_8N1, RXKEY, TXKEY);
USBKeyMouse.begin(SerialKey);
Serial.printf("CH9350_USBKEY Demonstration\n");
Serial.printf("14. September 2022 By Jann Oesch\n");
Serial.printf("Press any key or move the mouse. Press space to change ASCII to RAW mode for keyboard\n");
Serial.printf("Press left mousebutton to set the coordinate to 1000/1000 ant the right one for 0/0\n\n");
if (esp_now_init() != ESP_OK) return; //ESP-NOW初始化
esp_now_register_send_cb(OnDataSent); //发送回调
// esp_now_register_recv_cb(OnDataRecv); //接收回调
memcpy(peerInfo.peer_addr, mac_to, 6); //配对点
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer mac1");
return;
}
}
void loop() {
int Change = USBKeyMouse.GetMouseXY(&x, &y, &z, &Button);
if (Change) {
Serial.printf("Mouse X: %d, Y: %d Z: %d Button:%d\n", x, y, z, Button);
sbmov = millis();
}
// else if ((millis() - sbmov) > 10000) { //10秒未动鼠标清空坐标
// USBKeyMouse.SetMouseXY(0, 0);
// x1 = 0;
// yi = 0;
// }
if (bleMouse.isConnected()) { //如果蓝牙连接成功
sbmov_go(Change); //鼠标篇
}
}
//鼠标按钮及移动
void sbmov_go(int Change) {
if (Change) {//滚轮
if (z == 1) bleMouse.move(0, 0, 1);
else if (z == 255) {
bleMouse.move(0, 0, -1);
}
}
//xy
int x2 = x - x1;
int y2 = y - yi;
if ((x2 != 0) || (y2 != 0)) {
bleMouse.move(x2, y2);
x1 = x;
yi = y;
}
if (Button == 6) { //右中键同时
bleMouse.press(MOUSE_RIGHT | MOUSE_MIDDLE);
} else if (Button == 10) { //右后键同时
bleMouse.press(MOUSE_RIGHT | MOUSE_LEFT);
} else if ((Button == 11) || (Button == 3)) { //右后左键同时 || 左右键同时
if (!bleMouse.isPressed(MOUSE_RIGHT)) {
bleMouse.press(MOUSE_RIGHT);
}
if (millis() > StartTime1) { //同时按下执行鼠标连点
bleMouse.click(MOUSE_LEFT);
StartTime1 = millis() + random(120, 153);
// bleMouse.move(0, 10);//鼠标下移 压枪
}
} else if (Button == 17) { //左键 前进键 执行r r 左
if (millis() > rrl) {
jm_arr("r");
rrl = millis() + 190;//延时
StartTime1 = millis() + random(85, 90);//延时
} else if (millis() > StartTime1) {
bleMouse.click(MOUSE_LEFT);
StartTime1 = millis() + 500;//延时
}
} else if (Button == 9) { //左键 后退键 同时按下执行鼠标连点
if (millis() > StartTime1) {
bleMouse.click(MOUSE_LEFT);
StartTime1 = millis() + random(85, 113);//延时
}
} else
{
// if 左键
if (Button == 1) {
if (!bleMouse.isPressed(MOUSE_LEFT)) {
bleMouse.press(MOUSE_LEFT);
}
}
else if (bleMouse.isPressed(MOUSE_LEFT)) {
bleMouse.release(MOUSE_LEFT);
}
//右键
if (Button == 2) {
if (!bleMouse.isPressed(MOUSE_RIGHT)) {
bleMouse.press(MOUSE_RIGHT);
}
}
else if (bleMouse.isPressed(MOUSE_RIGHT)) {
bleMouse.release(MOUSE_RIGHT);
}
//中键
if (Button == 4) {
if (!bleMouse.isPressed(MOUSE_MIDDLE)) {
bleMouse.press(MOUSE_MIDDLE);
}
} else if (bleMouse.isPressed(MOUSE_MIDDLE)) {
bleMouse.release(MOUSE_MIDDLE);
}
//后退
if (Button == 8) {
if (!bleMouse.isPressed(MOUSE_BACK)) {
bleMouse.press(MOUSE_BACK);
}
} else if (bleMouse.isPressed(MOUSE_BACK)) {
bleMouse.release(MOUSE_BACK);
}
//前进
if (Button == 16) {
if (!bleMouse.isPressed(MOUSE_FORWARD)) {
bleMouse.press(MOUSE_FORWARD);
}
} else if (bleMouse.isPressed(MOUSE_FORWARD)) {
bleMouse.release(MOUSE_FORWARD);
}
}
}