手把手教學(xué): 鍵鼠 有線/適配器 改無線(藍(lán)牙/WiFi), 普通鍵鼠改鼠標(biāo)宏

一: 需要準(zhǔn)備的材料/設(shè)備/環(huán)境:
???1.arduino1.8以上 (最好是1.8,因?yàn)?.0我沒用過)

???2.?esp32帶藍(lán)牙的單片機(jī)*1 (改藍(lán)牙的需要一個, 如果改WiFi需要一個esp32s2,淘寶10塊錢?),? ?

? ?3.?ch9350模塊一個? (帶host的esp32 s2也可以,不過我手里只有一個s2, 用來插沒藍(lán)牙功能的臺式機(jī)上了)

???4.?杜邦線幾根
二 :? 設(shè)備連接
????沒啥好說的,直接上圖
????


????這里連接的是單片機(jī)的16 17 引腳
三 : 代碼(全功能代碼)
? ? 直接上圖
#include <HardwareSerial.h> //串口庫
#include "CH9350_USBKEY.h"//ch9350
#include <BleMouse.h> //藍(lán)牙庫

這里如果需要改WiFi就需要引用的庫,只用藍(lán)牙功能就可以不要


如果需要WiFi功能

這段程序?qū)崿F(xiàn)WiFi發(fā)送結(jié)構(gòu)體, 由于點(diǎn)對點(diǎn),所以不需要加密

各種初始化






代碼部分結(jié)束----------------------------------------------------------
四:藍(lán)牙連接(改無線完成,學(xué)會了嗎)
好了,代碼直接上傳之后電腦就能搜索到一個藍(lán)牙

連接成功后將鼠標(biāo)插入就能看到串口打印的鼠標(biāo)信息了

同時你的電腦上的鼠標(biāo)指針也會跟著動起來, 到這一步改藍(lán)牙就完成了,可能有的人會覺得沒有意義, 請接著往下看
五: WiFi連接
首先我的代碼本身是支持WiFi 藍(lán)牙同時工作的, 也就是除了之前介紹的設(shè)備外不需要其他任何輔助設(shè)備或軟件
WiFi的優(yōu)勢:? 可以實(shí)現(xiàn)一個鼠標(biāo)同時控制多個設(shè)備而不需要設(shè)備提前安裝啥軟件之類的.
WiFi控制的缺點(diǎn):? 被控制的每個設(shè)備都需要花10塊錢買一個esp32 s2 模塊作為物理連接使用, 如果不用物理連接的話網(wǎng)上辦法一堆,我就不廢話了
本程序使用的WiFi方案是ESP-NOW, 想詳細(xì)了解的同學(xué)請參考官方文檔, NOW的控制距離受WiFi信號的約束(空曠距離一百米左右,穿墻要看多厚), 如果需要在復(fù)雜環(huán)境遠(yuǎn)程使用建議將NOW換成 ESP-MESH, mesh相較于NOW優(yōu)勢是理論上AB兩個設(shè)備之間只要有若干個設(shè)備C,那么控制距離可以是很遠(yuǎn)很遠(yuǎn), 鋪滿全國也不是不可能, NOW的優(yōu)勢是兩個設(shè)備之間不需要連接,跟無線鍵鼠的原理類似.
使用WiFi的情況下需要將程序稍做改動,例如以鼠標(biāo)左鍵為例 , jm_arr(String a)?中可以是任意值,這主要看接收端的配套程序


????5. ESP32 s2 接收端程序 :? ? ??
? ? ? ??



由于我本身不需要使用WiFi功能,只是先弄著等以后需要的時候再玩,到這里WiFi功能介紹完畢
附上五郎esp32 s2 實(shí)現(xiàn)速射的視頻【10塊錢的簡單鼠標(biāo)宏】
六: 普通鼠標(biāo)添加宏功能
首先感謝能耐心看到這里, 關(guān)于之前的代碼部分相信大家有看到

這就是鼠標(biāo)按下組合鍵后esp32要實(shí)現(xiàn)的功能

這段程序就是將鼠標(biāo)左鍵與右鍵同時按住就會觸發(fā)鼠標(biāo)左鍵連續(xù)單擊的程序

????這段代碼很重要!!! 如果不想玩游戲被封號的話請一定要注意,!!
????目前大多數(shù)游戲都排斥鼠標(biāo)宏, 想我這個案例使用的嚴(yán)格來講屬于物理外掛, 但是各大游戲廠商都只能通過判斷游戲內(nèi)的數(shù)據(jù)普通人能不能辦到從而來判斷是不是使用了外掛, 像我現(xiàn)在這個配置就是我自己按鼠標(biāo)能達(dá)到的一個平均值.
?????玩FPS游戲的時候也能自己調(diào)節(jié)壓槍,當(dāng)然也可以調(diào)節(jié)武器射速

這一段是將鼠標(biāo)右鍵與后退鍵同時按住就觸發(fā)左右鍵同時按住的程序, 比如你想要掃射的時候但是鎖了射速就可以這樣解決

這一段是觸發(fā)后就用WiFi發(fā)送一條消息出去,比如桌子接收到后就亮紅光,RGB開始光污染等等, 我這里是通知鍵盤可以按下"R"鍵了
七: 如果覺得有用還請點(diǎn)個三連,附代碼
鼠標(biāo)端口
#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; //按鍵延時
//<<< <<< <<< <<< <<< <<< == == == == == 設(shè)置ESP-NOW數(shù)據(jù)結(jié)構(gòu)體 == == == == == >>> >>> >>> >>> >>> >>> >>
// REPLACE WITH THE MAC Address of your receiver
uint8_t mac_to[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
typedef struct test_struct? {? ? ? ? ? ? ? ? ? ? ? ? ?// 設(shè)置ESP-NOW數(shù)據(jù)結(jié)構(gòu)體
? char a[250];
} test_struct ;
test_struct? to_str;
//創(chuàng)建類型變量esp_now_peer_info_t存儲有關(guān)對等點(diǎn)的信息。
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("`發(fā)送回調(diào) :" + st + " `");
}
//<<< <<< <<< <<< <<< <<< == == == == == 各函數(shù) == == == == == >>> >>> >>> >>> >>> >>> >>
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);? //發(fā)送回調(diào)
? //? esp_now_register_recv_cb(OnDataRecv);? //接收回調(diào)
? memcpy(peerInfo.peer_addr, mac_to, 6); //配對點(diǎn)
? 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秒未動鼠標(biāo)清空坐標(biāo)
//? ? USBKeyMouse.SetMouseXY(0, 0);
//? ? x1 = 0;
//? ? yi = 0;
//? }
? if (bleMouse.isConnected()) { //如果藍(lán)牙連接成功
? ? sbmov_go(Change);? //鼠標(biāo)篇
? }
}
//鼠標(biāo)按鈕及移動
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) {? ? ? ? ? ? ? ? //同時按下執(zhí)行鼠標(biāo)連點(diǎn)
? ? ? bleMouse.click(MOUSE_LEFT);
? ? ? StartTime1 = millis() + random(120, 153);
? ? ? //? ? ? bleMouse.move(0, 10);//鼠標(biāo)下移 壓槍
? ? }
? } else? if (Button == 17) {? ? ? ? ? ? ? ? ? ?//左鍵 前進(jìn)鍵 執(zhí)行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) {? ? ? ? ? ? ? ? ? ? ? //左鍵 后退鍵 同時按下執(zhí)行鼠標(biāo)連點(diǎn)
? ? 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);
? ? }
? ? //前進(jìn)
? ? if (Button == 16) {
? ? ? if (!bleMouse.isPressed(MOUSE_FORWARD)) {
? ? ? ? bleMouse.press(MOUSE_FORWARD);
? ? ? }
? ? } else if (bleMouse.isPressed(MOUSE_FORWARD)) {
? ? ? bleMouse.release(MOUSE_FORWARD);
? ? }
? }
}