| 
		
	
		 | 
		   | 
	 
 
	
	
	
	
	   Pilot + Arduino (Hardware clicker) | 
	 
	    
	  | 
	           | 
	 
   
	 
  
 
	
		| yamenko | 
		
			
			
				   7.3.2020, 19:21
			 
			
			
		 | 
	 
	
		
        	
  
        		   
  
        		Novice 
        		Сообщений: 79 
        		Регистрация: 19.8.2014         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 16.974 
Возраст: 29
  
        		 
        	 
        	   
        | 
       
			
			Добрый день. Хочу представить вам аппаратный кликер на базе UOpilot. Для начала вам необходима будет плата Arduino micro (Arduino Leonardo) обязательно с чипом  Atmega 32u4. Другие не подойдут, так как не определяются системой как HID устройство, и придется долго настраивать аппаратную и программную составляющую. Можете выбрать следующие: (IMG:https://i.ibb.co/5GRGCDW/2020-03-07-18-38-55.png) (IMG:https://i.ibb.co/P1DgmDt/2020-03-07-18-40-05.png) Как только вы заполучили свою новую плату, скачиваем и устанавливаем последнюю версию  Arduino IDE с офф. сайта Arduino.cc (IMG:https://i.ibb.co/HVM0nBK/2020-03-07-18-37-38.png) Пробуем подключить, она должна у вас определится в устройствах как Mikro или Leonardo. (IMG:https://i.ibb.co/SRnMV1S/2020-03-07-18-44-57.png) Если не появляется, тогда устанавливаем драйвера, для не оригинальных плат с алиэкспресс нужен спец драйвер CH340 (ch341ser), пробуйте с разных сайтов, даже с одинаковым названием, они почему-то разные. Вот тут можно посмотреть драйверЗапоминаем СОМ порт! Открываем Arduino IDE Настраиваем нашу плату: (IMG:https://i.ibb.co/4dj9RvK/2020-03-07-18-47-26.png) (IMG:https://i.ibb.co/YbXd4MS/2020-03-07-18-48-38.png) Закидываем скретч отсюда:  https://forum.uokit.com/index.php?s=&sh...st&p=436373устаревший скетч с ошибкой. Используйте скетч из ссылки выше. 
Код #include <Keyboard.h> int i = 0; int trigerKey = 0; int lengthStr = 0; int key[20]; int tmDelayValue; String tmDelayStr;
  void setup() {   Serial.begin(9600);   Keyboard.begin(); }   void loop() {   // Собираем информацию из порта   while (Serial.available()) {     key[i++] = Serial.read();     delay(5);   }    // Триггер, что данные пришли   if (i != 0 && lengthStr == 0){     lengthStr = i;     i = 0;   }      if (lengthStr != 0){          for (i = 0; i <= lengthStr; i++){       delay(5); //Находим задержку с которой необходимо нажимать кнопки       if (trigerKey == 0){         if (key[i] == 124){           tmDelayValue = tmDelayStr.toInt();           trigerKey = 1;           i++;         }          else {           tmDelayStr += char (key[i]);         }       }
  //Находим и нажимаем спец кнопки если необходимо       if (trigerKey == 1){         if (key[i] == 94){Keyboard.press(KEY_LEFT_CTRL);}    //94 - символ "^"         if (key[i] == 64){Keyboard.press(KEY_LEFT_ALT);}     //64 - символ "@"          if (key[i] == 126){Keyboard.press(KEY_LEFT_SHIFT);}  //126 - символ "~"         if (key[i] == 124){trigerKey = 2; i++;}              //124 - символ "|"       }
  //Нажимаем по очереди остальные кнопки с задержкой       if (trigerKey == 2){         delay(tmDelayValue);         Keyboard.print(char (key[i]));       }     } // Сбрасываем все     Keyboard.releaseAll();     i = 0;     trigerKey = 0;     lengthStr = 0;     tmDelayStr = "";   } } заливаем его в плату. (IMG:https://i.ibb.co/W50GRnL/2020-03-07-18-50-19.png) Должно написать «Загрузка завершена» Теперь переходим в Пилот Добавляем функцию Код --lua local function sendKey (symbol)     file = io.open("COM7","w")  --меняем только номер COM порта, остальное не трогаем     file:write(symbol)     file:close() end Пользоваться так:  sendKey ("1000|^|axv") пишем в кавычках1. До первой вертикальной черты это задержка между каждым нажатием кнопок в мс. 2. После первой черты и до второй это спец символы (~@^, такие как настроены в Пилоте, другие не используйте так как ничего все равно работать не будет), если символы не нужны просто удалите их,  2 вертикальные черты обязательны!!!3. Набор символов которые необходимо нажать (каждая кнопка будет нажиматься через заданный интервал),  русские символы не работают!!!PS в данном примере CTRL+a, CTRL+x, CTRL+v, это чтобы вы могли проверить правильно ли работает или нет. Сообщение отредактировал DarkMaster - 9.12.2020, 15:34 
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| cirus | 
		
			
			
				   8.3.2020, 11:50
			 
			
			
		 | 
	 
	
		
        	 
  
        		          
  
        		Elder 
        		Сообщений: 3.480 
        		Регистрация: 18.8.2014         		Группа: Пользователи Наличность: 26044         		
        		Пользователь №: 16.971 
Возраст: 29
  
        		 
        	 
        	   
        | 
       
			
			 
 arduino.zip ( 7,07 килобайт )
 Кол-во скачиваний: 1374 Начало 
 Arduino позволяет эмулировать нажатия клавиш клавиатуры и мыши, в том числе в приложениях, которые блокируют нажатия. Может поворачивать камеру в шутерах и играх, в которых камера поворачивается с зажатой правой кнопкой мыши. Работает только с активным окном.
  Пилот версии 2.41 или выше. Запускать от администратора. Извлечь архив, файл arduino.lua закинуть в папку, где находится exe пилота. Скетч загрузить в ардуино. Для работы функций мыши нужно в настройках мыши снять галочку 'Включить повышенную точность установки указателя'. В функцию get_port (2341, 8036) нужно передавать vid и pid ардуино. Узнать их можно в Arduino IDE, пункт меню 'Инструменты', 'Получить информацию о плате'. При переполнении буфера, хотя такого не должно быть, 3 секунды будет гореть встроенный светодиод L. В этом случае нужно увеличить паузы между нажатиями клавиш мыши/клавиатуры. Все координаты в командах мыши указывать абсолютные, т. е. относительно левого верхнего угла экрана.
 
 Список функций 
 get_port (vid, pid) -- узнать в каком com порте находится ардуино
  set_delay_key (ms) -- установить задержку нажатий клавиатуры set_delay_mouse (ms) -- установить задержку нажатий мыши set_delay_mousemove(ms)  --  установить паузу в мсек между каждым шагом перемещения курсора, чем меньше, тем быстрее перемещается курсор set_offset_mousemove(step) --  шаг перемещения курсора от 1 до 127, чем больше, тем быстрее перемещается курсор. set_random_delay_key(random)   -- рандом от 0 до 9 мсек между нажатием и отпусканием клавиш клавиатуры set_random_delay_mouse(random) -- рандом от 0 до 4 мсек между нажатием и отпусканием клавиш
  key (code) -- нажать клавишу клавиатуры text (text) -- отослать текст, в том числе русские символы key_down (code) -- зажать (не отжимая) клавишу клавиатуры key_up (code) -- отжать клавишу клавиатуры
  mouse.move (x, y) -- переместить мышь mouse.click (x, y, button) -- кликнуть мышью, button должен содержать код клавиши мыши mouse.left (x, y) -- клик левой кнопкой mouse.right (x, y) -- клик правой кнопкой mouse.middle (x, y) -- клик средней кнопкой mouse.dbl (x, y, button) -- двойной клик, button должен содержать код клавиши мыши mouse.left_dbl (x, y) -- двойной клик левой кнопкой мыши mouse.right_dbl (x, y) -- двойной клик правой кнопкой мыши mouse.middle_dbl (x, y) -- двойной клик средней кнопкой мыши mouse.down (x, y, button) -- зажать (не отжимая) кнопку мыши, button должен содержать код клавиши мыши mouse.left_down (x, y) -- зажать (не отжимая) левую кнопку мыши mouse.right_down (x, y) -- зажать (не отжимая) правую кнопку мыши mouse.middle_down (x, y) -- зажать (не отжимая) среднюю кнопку мыши mouse.up (x, y, button) -- отжать кнопку мыши, button должен содержать код клавиши мыши mouse.left_up (x, y) -- отжать левую кнопку мыши mouse.right_up (x, y) -- отжать правую кнопку мыши mouse.middle_up (x, y) -- отжать среднюю кнопку мыши mouse.drag (x, y, x2, y2) -- зажать левую кнопку мыши в точке x y, переместить в точку x2 y2  mouse.wheel_up (x, y, count) -- прокручивание колёсика мыши вверх, count - насколько щелчков прокрутить mouse.wheel_down (x, y, count) -- прокручивание колёсика мыши вниз, count - насколько щелчков прокрутить
 
 Список многосимвольных клавиш 
 mouse_left_button = 1 mouse_right_button = 2 mouse_middle_button = 4
  left_ctrl = 0x80 left_shift = 0x81 left_alt = 0x82 left_gui = 0x83 right_ctrl = 0x84 right_shift = 0x85 right_alt = 0x86 right_gui = 0x87 up_arrow = 0xDA down_arrow = 0xD9 left_arrow = 0xD8 right_arrow = 0xD7 backspace = 0xB2 tab = 0xB3 enter = 0xB0 esc = 0xB1 insert = 0xD1 delete = 0xD4 page_up = 0xD3 page_down = 0xD6 home = 0xD2 ["end"] = 0xD5 caps_lock = 0xC1 f1 = 0xC2 f2 = 0xC3 f3 = 0xC4 f4 = 0xC5 f5 = 0xC6 f6 = 0xC7 f7 = 0xC8 f8 = 0xC9 f9 = 0xCA f10 = 0xCB f11 = 0xCC f12 = 0xCD F1 = 0xC2 F2 = 0xC3 F3 = 0xC4 F4 = 0xC5 F5 = 0xC6 F6 = 0xC7 F7 = 0xC8 F8 = 0xC9 F9 = 0xCA F10 = 0xCB F11 = 0xCC F12 = 0xCD
 
 Пример использования клавиатуры 
Код --lua local hw = require'arduino' hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино  if hw.com < 1 then   -- если номер порта меньше 1      log ('error = ' .. tostring(hw.com))    -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено      end_script ()  end hw.set_delay_key (20)     -- установить паузу между нажатиями клавиш клавиатуры hw.set_random_delay_key(10)  -- установить рандом между нажатием и отпускание клавиш -- т. е. между нажатием и отпусканием клавиши будет пауза от 20 до 29 мсек
  wait (3000)    -- пауза 3 секунды чтобы переключиться на нужное окно hw.key ('k')    -- нажать клавишу 'k' hw.key (hw.enter)  -- нажать 'Enter'
  wait (1000)   -- пауза 1 сек.
  hw.key_down ('s')   -- зажать клавишу 's' wait (3000)         -- пауза 3 сек., при этом клавиша будет зажата hw.key_up ('s')     -- отпустить клавишу 's' hw.key (hw.enter)   -- нажать 'Enter'
  hw.text ('Hello Привет')  -- напечатать текст hw.key ('V')    -- нажать Shift+'v' Пример использования мыши 
Код --lua local hw = require'arduino' hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино  if hw.com < 1 then   -- если номер порта меньше 1      log ('error = ' .. tostring(hw.com))    -- код ошибки      end_script ()  end hw.set_delay_mouse (20)   -- установить паузу между нажатиями клавиш мыши hw.set_offset_mousemove(4)  -- шаг перемещения курсора hw.set_random_delay_mouse(10)  -- установить рандом между нажатиями клавиш мыши -- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
  hw.mouse.left (200, 100)      -- клик левой кнопкой мыши в координатах 200, 100 hw.mouse.right (200, 100)     -- клик правой кнопкой мыши wait (3000)                   -- пауза 3 секунды hw.mouse.left_dbl (35, 35)    -- двойной клик левой кнопкой мыши wait (2000) hw.mouse.left_down (200, 200) -- зажать левую кнопку мыши wait(500) hw.mouse.left_up (900, 300)   -- отпустить левую кнопку мыши  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| yamenko | 
		
			
			
				   8.3.2020, 19:26
			 
			
			
		 | 
	 
	
		
        	
  
        		   
  
        		Novice 
        		Сообщений: 79 
        		Регистрация: 19.8.2014         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 16.974 
Возраст: 29
  
        		 
        	 
        	   
        | 
       
			
			Цитата(cirus @ 8.3.2020, 11:50)   С этой штукой будет нажимать клавиши в обход gameguard, frost и прочих? Надо так: Код я не пробовал, по-идее нажимать будет не программа, а аппаратное устройство типа доп клавиатуры и других манипуляторов.  Было бы хорошо если бы кто то мог испытать (IMG: style_emoticons/default/smile.gif) PS отредактировал...  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Crocotea | 
		
			
			
				   10.11.2020, 15:48
			 
			
			
		 | 
	 
	
		
        	
  
        		   
  
        		Novice 
        		Сообщений: 51 
        		Регистрация: 30.10.2020         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 19.787
  
        		 
        	 
        	   
        | 
       
			
			при запуске скрипта пилота, после нескольких запусков, начинает вписывать лишние символы. Либо с предыдущей редакции, либо рандомные Запустил в пилоте sendKey ("11||r") вывело r поменял на sendKey ("11||rrr") вывело rrrr опять поменял на sendKey ("11||r") вывело r0r Также есть один момент. непосредственно в игру sendKey ("11||r") не реагирует. sendKey ("11||rrr") - реагирует, кнопка нажимается так видео сделал. работает совсем некорректно  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Cockney | 
		
			
			
				   16.11.2020, 11:48
			 
			
			
		 | 
	 
	
		
        	
  
        		        
  
        		Master 
        		Сообщений: 1.404 
        		Регистрация: 22.6.2013         		Группа: Пользователи Наличность: 22676         		
        		Пользователь №: 16.156
  
        		 
        	 
        	   
        | 
       
			
			Накидал вариант. Насколько рабочий не знаю, не могу собрать за неимением устройства и инструментария. Развернуть 
Код  #include <Keyboard.h> #include <stdlib.h>
  // Максимальный размер буффера #define MAX_BUFFER_SIZE 20 // Порт #define SERIAL_PORT 9600 // Задержка считывания с порта #define SERIAL_READ_DELAY 5 // Задержка нажатия клавиш по умолчанию #define DEFAULT_SEND_DELAY 0
  void setup() {     Serial.begin(SERIAL_PORT);     Keyboard.begin(); }
  void loop() {     // буффер под коммандную строку     char buffer[MAX_BUFFER_SIZE];     // размер полученного буфера     int buffSize = 0;     // текущая позиция в буффере     int buffPos = 0;     // задержка нажатия клавиш     int send_delay_value = DEFAULT_SEND_DELAY;
      // Собираем информацию из порта     while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {         buffer[buffSize++] = Serial.read();         delay(SERIAL_READ_DELAY);     }
      // если данные пришли     if (buffSize > 0) {         // пытаемся сначала выбрать задержку          send_delay_value = parseSendDelay(buffPos, buffer, buffSize);         // разбор и нажатие контрольных клавиш         sendControlKeys(buffPos, buffer, buffSize);         // нажатие клавиш         while (buffPos < buffSize) {             delay(send_delay_value);             Keyboard.print(buffer[buffPos++]);         };
          // очистка         Keyboard.releaseAll();         buffPos = 0;         buffSize = 0;     } }
  // парсинг задержки отправки клавиш int parseSendDelay(int* curPos, char* buff, int buffSize) {     // идем по полученным данным пока не встретим разделитель     while (buff[*curPos] != '|') {         ++*curPos;     }     // далее получаем задержку в числовом виде     // не очень красиво, но должно работать.
      // заменяем | на символ конца строки     buff[*curPos] = '\0';     // получаем задержку     int parsedDelay = atoi(buff);     // возвращаем если нужно     //data[*curPos] = '\|';          // пропуск разделителя     ++*curPos;
      //возврат     return parsedDelay; }
  // парсинг клавиши int parseKey(int *curPos, const char *buff, int buffSize) {     switch (buff[(*curPos)++])     {     case '^':         return KEY_LEFT_CTRL;     case '@':         return KEY_LEFT_ALT;     case '~':         return KEY_LEFT_SHIFT;     default:         return -1;     } }
 
  // нажатие контрольных клавиш void sendControlKeys(int *curPos, const char* buff, int buffSize) {     // пока не встретили разделитель     while (buff[(*curPos)++] != '|') {         // попытка распарсить управляющую клавишу         int key = parseKey(curPos, buff, buffSize);         // если успешно         if (key > 0) {             Keyboard.press(key);         }     }     // пропускаем разделитель     ++*curPos; }
 
  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| DarkMaster | 
		
			
			
				   16.11.2020, 15:53
			 
			
			
		 | 
	 
	
		
        	
  
        		           
  
        		Модератор UOPilot 
        		Сообщений: 9.766 
        		Регистрация: 2.12.2008         		Группа: Супермодераторы Наличность: 30010         		
        		Пользователь №: 11.279
  
        		 
        	 
        	   
        | 
       
			
			 Cockney, не будет ли правильным использовать какой-то символ для флага окончания передаваемых данных? Я понимаю, что тут 20 байт(хотя я бы увеличил пока памяти бы хватало, но тут железка нужна), но не может ли получиться ситуация, когда мы получим в буфер только кусок сообщения за попытку сбора данных из порта? Ту да же вопрос о слишком длинных (больше буфера) передачах. По сути это приведет к непредсказуемым последствиям, до выставления задержки диких размеров и переподключения устройства. 
			
			
  -------------------- 
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Контакт актуален, подпись актуальна. 
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Crocotea | 
		
			
			
				   17.11.2020, 15:04
			 
			
			
		 | 
	 
	
		
        	
  
        		   
  
        		Novice 
        		Сообщений: 51 
        		Регистрация: 30.10.2020         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 19.787
  
        		 
        	 
        	   
        | 
       
			
			Цитата(Cockney @ 16.11.2020, 11:48)   Накидал вариант. Насколько рабочий не знаю, не могу собрать за неимением устройства и инструментария. Развернуть 
Код  #include <Keyboard.h> #include <stdlib.h>
  // Максимальный размер буффера #define MAX_BUFFER_SIZE 20 // Порт #define SERIAL_PORT 9600 // Задержка считывания с порта #define SERIAL_READ_DELAY 5 // Задержка нажатия клавиш по умолчанию #define DEFAULT_SEND_DELAY 0
  void setup() {     Serial.begin(SERIAL_PORT);     Keyboard.begin(); }
  void loop() {     // буффер под коммандную строку     char buffer[MAX_BUFFER_SIZE];     // размер полученного буфера     int buffSize = 0;     // текущая позиция в буффере     int buffPos = 0;     // задержка нажатия клавиш     int send_delay_value = DEFAULT_SEND_DELAY;
      // Собираем информацию из порта     while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {         buffer[buffSize++] = Serial.read();         delay(SERIAL_READ_DELAY);     }
      // если данные пришли     if (buffSize > 0) {         // пытаемся сначала выбрать задержку          send_delay_value = parseSendDelay(buffPos, buffer, buffSize);         // разбор и нажатие контрольных клавиш         sendControlKeys(buffPos, buffer, buffSize);         // нажатие клавиш         while (buffPos < buffSize) {             delay(send_delay_value);             Keyboard.print(buffer[buffPos++]);         };
          // очистка         Keyboard.release();         buffPos = 0;         buffSize = 0;     } }
  // парсинг задержки отправки клавиш int parseSendDelay(int* curPos, char* buff, int buffSize) {     // идем по полученным данным пока не встретим разделитель     while (buff[*curPos] != '|') {         ++curPos;     }     // далее получаем задержку в числовом виде     // не очень красиво, но должно работать.
      // заменяем | на символ конца строки     buff[*curPos] = '\0';     // получаем задержку     int parsedDelay = atoi(buff);     // возвращаем если нужно     //data[*curPos] = '\|';          // пропуск разделителя     ++curPos;
      //возврат     return parsedDelay; }
  // парсинг клавиши int parseKey(int *curPos, const char *buff, int buffSize) {     switch (buff[*curPos++])     {     case '^':         return KEY_LEFT_CTRL;     case '@':         return KEY_LEFT_ALT;     case '~':         return KEY_LEFT_SHIFT;     default:         return -1;     } } // нажатие контрольных клавиш void sendControlKeys(int *curPos, const char* buff, int buffSize) {     // пока не встретили разделитель     while (buff[*curPos++] != '|') {         // попытка распарсить управляющую клавишу         int key = parseKey(curPos, buff, buffSize);         // если успешно         if (key > 0) {             Keyboard.press(key);         }     }     // пропускаем разделитель     ++curPos; }
 
 Так результат по парсингу Пишет ошибку в строчке Keyboard.release(); (скрин приложил)  
			
  Эскизы прикрепленных изображений
   
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Cockney | 
		
			
			
				   17.11.2020, 18:37
			 
			
			
		 | 
	 
	
		
        	
  
        		        
  
        		Master 
        		Сообщений: 1.404 
        		Регистрация: 22.6.2013         		Группа: Пользователи Наличность: 22676         		
        		Пользователь №: 16.156
  
        		 
        	 
        	   
        | 
       
			
			Очередная правка, выношу код сюда, ибо старый пост сломался и не отображает правленый код Версия №3 
Код  #include <Keyboard.h> #include <stdlib.h>
  // Максимальный размер буффера #define MAX_BUFFER_SIZE 20 // Порт #define SERIAL_PORT 9600 // Задержка считывания с порта #define SERIAL_READ_DELAY 5 // Задержка нажатия клавиш по умолчанию #define DEFAULT_SEND_DELAY 0
  void setup() {     Serial.begin(SERIAL_PORT);     Keyboard.begin(); }
  void loop() {     // буффер под коммандную строку     char buffer[MAX_BUFFER_SIZE];     // размер полученного буфера     int buffSize = 0;     // текущая позиция в буффере     int buffPos = 0;     // задержка нажатия клавиш     int send_delay_value = DEFAULT_SEND_DELAY;
      // Собираем информацию из порта     while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {         buffer[buffSize++] = Serial.read();         delay(SERIAL_READ_DELAY);     }
      // если данные пришли     if (buffSize > 0) {         // пытаемся сначала выбрать задержку          send_delay_value = parseSendDelay(buffPos, buffer, buffSize);         // разбор и нажатие контрольных клавиш         sendControlKeys(buffPos, buffer, buffSize);         // нажатие клавиш         while (buffPos < buffSize) {             delay(send_delay_value);             Keyboard.print(buffer[buffPos++]);         };
          // очистка         Keyboard.releaseAll();         buffPos = 0;         buffSize = 0;     } }
  // парсинг задержки отправки клавиш int parseSendDelay(int* curPos, char* buff, int buffSize) {     // идем по полученным данным пока не встретим разделитель     while (buff[*curPos] != '|') {         ++*curPos;     }     // далее получаем задержку в числовом виде     // не очень красиво, но должно работать.
      // заменяем | на символ конца строки     buff[*curPos] = '\0';     // получаем задержку     int parsedDelay = atoi(buff);     // возвращаем если нужно     //data[*curPos] = '\|';          // пропуск разделителя     ++*curPos;
      //возврат     return parsedDelay; }
  // парсинг клавиши int parseKey(int *curPos, const char *buff, int buffSize) {     switch (buff[(*curPos)++])     {     case '^':         return KEY_LEFT_CTRL;     case '@':         return KEY_LEFT_ALT;     case '~':         return KEY_LEFT_SHIFT;     default:         return -1;     } }
 
  // нажатие контрольных клавиш void sendControlKeys(int *curPos, const char* buff, int buffSize) {     // пока не встретили разделитель     while (buff[(*curPos)++] != '|') {         // попытка распарсить управляющую клавишу         int key = parseKey(curPos, buff, buffSize);         // если успешно         if (key > 0) {             Keyboard.press(key);         }     }     // пропускаем разделитель     ++*curPos; }
 
  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Crocotea | 
		
			
			
				   17.11.2020, 18:45
			 
			
			
		 | 
	 
	
		
        	
  
        		   
  
        		Novice 
        		Сообщений: 51 
        		Регистрация: 30.10.2020         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 19.787
  
        		 
        	 
        	   
        | 
       
			
			Цитата(Cockney @ 17.11.2020, 18:37)   Очередная правка, выношу код сюда, ибо старый пост сломался и не отображает правленый код Версия №3 
Код  #include <Keyboard.h> #include <stdlib.h>
  // Максимальный размер буффера #define MAX_BUFFER_SIZE 20 // Порт #define SERIAL_PORT 9600 // Задержка считывания с порта #define SERIAL_READ_DELAY 5 // Задержка нажатия клавиш по умолчанию #define DEFAULT_SEND_DELAY 0
  void setup() {     Serial.begin(SERIAL_PORT);     Keyboard.begin(); }
  void loop() {     // буффер под коммандную строку     char buffer[MAX_BUFFER_SIZE];     // размер полученного буфера     int buffSize = 0;     // текущая позиция в буффере     int buffPos = 0;     // задержка нажатия клавиш     int send_delay_value = DEFAULT_SEND_DELAY;
      // Собираем информацию из порта     while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {         buffer[buffSize++] = Serial.read();         delay(SERIAL_READ_DELAY);     }
      // если данные пришли     if (buffSize > 0) {         // пытаемся сначала выбрать задержку          send_delay_value = parseSendDelay(buffPos, buffer, buffSize);         // разбор и нажатие контрольных клавиш         sendControlKeys(buffPos, buffer, buffSize);         // нажатие клавиш         while (buffPos < buffSize) {             delay(send_delay_value);             Keyboard.print(buffer[buffPos++]);         };
          // очистка         Keyboard.releaseAll();         buffPos = 0;         buffSize = 0;     } }
  // парсинг задержки отправки клавиш int parseSendDelay(int* curPos, char* buff, int buffSize) {     // идем по полученным данным пока не встретим разделитель     while (buff[*curPos] != '|') {         ++*curPos;     }     // далее получаем задержку в числовом виде     // не очень красиво, но должно работать.
      // заменяем | на символ конца строки     buff[*curPos] = '\0';     // получаем задержку     int parsedDelay = atoi(buff);     // возвращаем если нужно     //data[*curPos] = '\|';          // пропуск разделителя     ++*curPos;
      //возврат     return parsedDelay; }
  // парсинг клавиши int parseKey(int *curPos, const char *buff, int buffSize) {     switch (buff[(*curPos)++])     {     case '^':         return KEY_LEFT_CTRL;     case '@':         return KEY_LEFT_ALT;     case '~':         return KEY_LEFT_SHIFT;     default:         return -1;     } } // нажатие контрольных клавиш void sendControlKeys(int *curPos, const char* buff, int buffSize) {     // пока не встретили разделитель     while (buff[(*curPos)++] != '|') {         // попытка распарсить управляющую клавишу         int key = parseKey(curPos, buff, buffSize);         // если успешно         if (key > 0) {             Keyboard.press(key);         }     }     // пропускаем разделитель     ++*curPos; }
 
 кликер реагирует, индикаторы моргают, но реакции ноль. ничего не вводится из скрипта в предыдущем видео Спустя некоторое время пилот перестает отвечать и вылетает(  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Cockney | 
		
			
			
				   18.11.2020, 12:50
			 
			
			
		 | 
	 
	
		
        	
  
        		        
  
        		Master 
        		Сообщений: 1.404 
        		Регистрация: 22.6.2013         		Группа: Пользователи Наличность: 22676         		
        		Пользователь №: 16.156
  
        		 
        	 
        	   
        | 
       
			
			Версия №4 
Код  #include <Keyboard.h> #include <stdlib.h>
  // Максимальный размер буффера #define MAX_BUFFER_SIZE 20 // Порт #define SERIAL_PORT 9600 // Задержка считывания с порта #define SERIAL_READ_DELAY 5 // Задержка нажатия клавиш по умолчанию #define DEFAULT_SEND_DELAY 0
  void setup() {     Serial.begin(SERIAL_PORT);     Keyboard.begin(); }
  void loop() {     // буффер под коммандную строку     char buffer[MAX_BUFFER_SIZE];     // размер полученного буфера     int buffSize = 0;     // текущая позиция в буффере     int buffPos = 0;     // задержка нажатия клавиш     int send_delay_value = DEFAULT_SEND_DELAY;
      // Собираем информацию из порта     while (Serial.available() && buffSize < MAX_BUFFER_SIZE) {         buffer[buffSize++] = Serial.read();         delay(SERIAL_READ_DELAY);     }
      // если данные пришли     if (buffSize > 0) {         // пытаемся сначала выбрать задержку          send_delay_value = parseSendDelay(&buffPos, buffer, buffSize);         // разбор и нажатие контрольных клавиш         sendControlKeys(&buffPos, buffer, buffSize);         // нажатие клавиш         while (buffPos < buffSize) {             delay(send_delay_value);             Keyboard.print(buffer[buffPos++]);         };
          // очистка         Keyboard.releaseAll();         buffPos = 0;         buffSize = 0;     } }
  // парсинг задержки отправки клавиш int parseSendDelay(int* curPos, char* buff, int buffSize) {     // идем по полученным данным пока не встретим разделитель     while (buff[*curPos] != '|') {         ++*curPos;     }     // далее получаем задержку в числовом виде     // не очень красиво, но должно работать.
      // заменяем | на символ конца строки     buff[*curPos] = '\0';     // получаем задержку     int parsedDelay = atoi(buff);     // возвращаем если нужно     //data[*curPos] = '\|';          // пропуск разделителя     ++*curPos;
      //возврат     return parsedDelay; }
  // парсинг клавиши int parseKey(int *curPos, const char *buff, int buffSize) {     switch (buff[*curPos])     {     case '^':         return KEY_LEFT_CTRL;     case '@':         return KEY_LEFT_ALT;     case '~':         return KEY_LEFT_SHIFT;     default:         return -1;     } }
 
  // нажатие контрольных клавиш void sendControlKeys(int *curPos, const char* buff, int buffSize) {     // пока не встретили разделитель     while (buff[*curPos] != '|') {         // попытка распарсить управляющую клавишу         int key = parseKey(curPos, buff, buffSize);         // если успешно         if (key > 0) {             Keyboard.press(key);         }         // следующий байт         ++*curPos;     }     // пропускаем разделитель     ++*curPos; }
 
  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
 
	
		 | 
		   | 
	 
 
	2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0) 
	Пользователей: 0  
 
        				  
  | 
 |