FLProg + RemoteXY =手机计算机上的无线键盘

我在家有一个有趣的情况。卧室中的电视与另一间房间的计算机相连,为了让我的妻子观看该系列的下一集(尽管我在电视旁有一个安卓机顶盒,但她更喜欢从计算机上观看),我必须付出很多努力。由于儿童的存在,无线鼠标和键盘在这里不扎根。很长一段时间以来,我一直对Arduino Leonardo假装成鼠标和键盘的功能感兴趣,当我来到这块板子时,我在FLProg 2.2版程序中意识到了这个机会。加上RevoteXY项目的功能,结果变得非常有趣。开始生成设备的视频。



首先,在RemoteXY网站上创建一个项目。这个项目的特点是您创建的界面不需要加载到手机上。在手机上安装RemoteXY程序就足够了,所有创​​建的接口都存储在Arduino固件中。连接到该接口后,该接口的说明会传输到手机,并在程序中打开。

现在,在RemoteXY网站上,有机会分享他们的项目,这是本课程中讨论的设备的我的项目链接。该项目包括四个屏幕。

第一个屏幕是鼠标控制。



使用操纵杆控制鼠标的移动。它的控制与借助著名的ThinkPad T41的键盘中间伸出的东西进行控制非常相似。



我已经有很长时间了,所以我有经验。 RemoteXY项目的开发人员承诺将制作一个新元素-“触摸面板”,借助它,可以完全模拟笔记本电脑的触摸板。在此项目中发生这种情况时,我将用它替换操纵杆。屏幕右侧的滑块模拟滚轮。它从中心的偏移越大,虚拟鼠标的滚轮旋转得越快。

屏幕左侧的三列按钮模拟对虚拟鼠标按钮的不同单击。每列负责其按钮-分别为左,中和右。按钮的第一行(带有“ P”符号)模拟正常按下。也就是说,当您单击此按钮时,虚拟鼠标的相应按钮将被按下,释放后将被释放。第二行(带有符号“ PF”)-模拟带有闩锁的咔嗒声。第一次按下此按钮时,将按下虚拟鼠标按钮,第二次则释放。例如,这在拖动窗口时很有用。将鼠标指向窗口标题,单击“ PF”按钮(将窗口固定在鼠标上),拖动窗口,再次单击“ PF”(释放窗口)。好吧,第三行(带有符号“ C”)是对虚拟鼠标的相应按钮的单击。

第二个屏幕是英文键盘。



尤其没有什么可解释的。 “ Caps”按钮启用大写字符,“ Shft”按钮每个字符包括大写字符。输入一个字符后,将其重置。

第三个屏幕是俄语键盘,



这里的所有内容都清晰可见。 “ Caps”和“ Shift”键的作用与上一个屏幕相同。

好吧,最后一个屏幕-数字和特殊字符,



有一点微妙之处。 RemoteXY的在线编辑器中存在一个小错误。如果按钮标题中使用“ \”符号,则不会保存该项目,也不会对其进行处理。因此,对于该符号的按钮,我使用了“ not /”字样。好吧,我没有想出更好的办法。

在RemoteXY网站上创建项目后,您需要获取代码以下载到FLProg项目中的“ RemoteXY”块。为此,在RemoteXY项目的属性中,选择编程环境-FLProg。



在本课程的RemoteXY网站上获得的代码
REMOTEXY_MODE__SOFTSERIAL
REMOTEXY_SERIAL_RX 8
REMOTEXY_SERIAL_TX 9
REMOTEXY_SERIAL_SPEED 9600
[128,5,144,5,6,8,4,5,32,41
,11,47,47,7,1,4,48,92,11,7
,50,7,1,1,1,1,18,12,12,7
,1,80,0,1,1,14,18,12,12,7
,1,80,0,1,1,27,18,12,12,7
,1,80,0,1,1,1,32,12,12,7
,1,80,70,0,1,1,14,32,12,12
,7,1,80,70,0,1,1,27,32,12
,12,7,1,80,70,0,1,1,1,47
,12,12,7,1,67,0,1,1,14,47
,12,12,7,1,67,0,1,1,27,47
,12,12,7,1,67,0,1,1,1,22
,8,8,6,2,81,0,1,1,10,22
,8,8,6,2,87,0,1,1,19,22
,8,8,6,2,69,0,1,1,28,22
,8,8,6,2,82,0,1,1,37,22
,8,8,6,2,84,0,1,1,46,22
,8,8,6,2,89,0,1,1,55,22
,8,8,6,2,85,0,1,1,64,22
,8,8,6,2,73,0,1,1,73,22
,8,8,6,2,79,0,1,1,82,22
,8,8,6,2,80,0,1,1,1,31
,8,8,6,2,65,0,1,1,10,31
,8,8,6,2,83,0,1,1,19,31
,8,8,6,2,68,0,1,1,28,31
,8,8,6,2,70,0,1,1,37,31
,8,8,6,2,71,0,1,1,46,31
,8,8,6,2,72,0,1,1,55,31
,8,8,6,2,74,0,1,1,64,31
,8,8,6,2,75,0,1,1,1,40
,8,8,6,2,90,0,1,1,10,40
,8,8,6,2,88,0,1,1,19,40
,8,8,6,2,67,0,1,1,28,40
,8,8,6,2,86,0,1,1,37,40
,8,8,6,2,66,0,1,1,46,40
,8,8,6,2,78,0,1,1,55,40
,8,8,6,2,77,0,1,1,1,49
,98,13,6,2,0,1,1,73,31,8
,8,6,2,76,0,1,1,91,22,8
,8,6,2,60,0,1,1,82,31,17
,17,6,2,69,110,116,101,114,0,1
,1,64,40,8,8,6,2,44,0,1
,1,73,40,8,8,6,2,46,0,1
,1,1,16,17,5,6,2,83,104,105
,102,116,0,1,1,7,10,11,5,6
,2,67,97,112,115,0,1,1,1,25
,7,7,0,3,208,153,0,1,1,8
,25,7,7,0,3,208,166,0,1,1
,15,25,7,7,0,3,208,163,0,1
,1,22,25,7,7,0,3,208,154,0
,1,1,29,25,7,7,0,3,208,149
,0,1,1,43,25,7,7,0,3,208
,147,0,1,1,57,25,7,7,0,3
,208,169,0,1,1,78,25,7,7,0
,3,208,170,0,1,1,36,25,7,7
,0,3,208,157,0,1,1,64,25,7
,7,0,3,208,151,0,1,1,71,25
,7,7,0,3,208,165,0,1,1,50
,25,7,7,0,3,208,168,0,1,1
,86,25,13,7,0,3,60,0,1,1
,1,49,98,13,0,3,0,1,1,1
,41,7,7,0,3,208,175,0,1,1
,9,41,7,7,0,3,208,167,0,1
,1,17,41,7,7,0,3,208,161,0
,1,1,25,41,7,7,0,3,208,156
,0,1,1,33,41,7,7,0,3,208
,152,0,1,1,41,41,7,7,0,3
,208,162,0,1,1,49,41,7,7,0
,3,208,172,0,1,1,57,41,7,7
,0,3,208,145,0,1,1,65,41,7
,7,0,3,208,174,0,1,1,1,33
,7,7,0,3,208,164,0,1,1,9
,33,7,7,0,3,208,171,0,1,1
,17,33,7,7,0,3,208,146,0,1
,1,25,33,7,7,0,3,208,144,0
,1,1,33,33,7,7,0,3,208,159
,0,1,1,41,33,7,7,0,3,208
,160,0,1,1,49,33,7,7,0,3
,208,158,0,1,1,57,33,7,7,0
,3,208,155,0,1,1,65,33,7,7
,0,3,208,148,0,1,1,73,33,7
,7,0,3,208,150,0,1,1,81,33
,7,7,0,3,208,173,0,1,1,73
,41,7,7,0,3,44,0,1,1,81
,41,7,7,0,3,46,0,1,1,89
,33,10,15,0,3,69,110,116,101,114
,0,1,1,7,13,11,5,0,3,67
,97,112,115,0,1,1,1,19,17,5
,0,3,83,104,105,102,116,0,1,1
,1,13,9,8,5,4,49,0,1,1
,11,13,9,8,5,4,50,0,1,1
,21,13,9,8,5,4,51,0,1,1
,41,13,9,8,5,4,53,0,1,1
,51,13,9,8,5,4,54,0,1,1
,61,13,9,8,5,4,55,0,1,1
,91,13,9,8,5,4,48,0,1,1
,81,13,9,8,5,4,57,0,1,1
,71,13,9,8,5,4,56,0,1,1
,31,13,9,8,5,4,52,0,1,1
,32,49,68,13,5,4,0,1,1,51
,40,9,8,5,4,60,0,1,1,61
,40,9,8,5,4,39,0,1,1,71
,40,9,8,5,4,34,0,1,1,1
,31,9,8,5,4,95,0,1,1,91
,22,9,8,5,4,60,60,0,1,1
,41,40,9,8,5,4,62,0,1,1
,31,40,9,8,5,4,125,0,1,1
,21,40,9,8,5,4,123,0,1,1
,11,40,9,8,5,4,93,0,1,1
,1,40,9,8,5,4,91,0,1,1
,51,22,9,8,5,4,38,0,1,1
,61,31,9,8,5,4,124,0,1,1
,51,31,9,8,5,4,110,111,116,47
,0,1,1,41,31,9,8,5,4,47
,0,1,1,31,31,9,8,5,4,61
,0,1,1,21,31,9,8,5,4,45
,0,1,1,11,31,9,8,5,4,43
,0,1,1,71,31,9,8,5,4,63
,0,1,1,1,22,9,8,5,4,33
,0,1,1,11,22,9,8,5,4,64
,0,1,1,21,22,9,8,5,4,35
,0,1,1,31,22,9,8,5,4,36
,0,1,1,41,22,9,8,5,4,94
,0,1,1,61,22,9,8,5,4,42
,0,1,1,71,22,9,8,5,4,40
,0,1,1,81,22,9,8,5,4,41
,0,1,1,81,40,9,8,5,4,44
,0,1,1,91,40,9,8,5,4,46
,0,1,1,91,31,9,8,5,4,69
,110,116,101,114,0,1,1,81,31,9
,8,5,4,37,0,1,1,1,49,9
,8,5,4,58,0,1,1,11,49,9
,8,5,4,59,0,1,1,21,49,9
,8,5,4,126,0,65,10,1,10,5
,5,2,2,65,10,1,13,5,5,2
,3,65,9,1,1,5,5,2,2,65
,9,1,1,5,5,2,3,65,9,1
,1,5,5,2,4,131,1,82,1,17
,6,7,1,77,111,117,115,101,0,131
,0,64,1,17,6,6,2,69,110,0
,131,0,46,1,17,6,0,3,208,160
,209,131,209,129,0,131,0,28,1,17
,6,5,4,49,46,46,57,0];
input signed char joystick_1_x; /* =-100..100 x */
input signed char joystick_1_y; /* =-100..100 y */
input signed char slider_1; /* =-100..100 */
input unsigned char pressL; /* =1 , =0 */
input unsigned char PressM; /* =1 , =0 */
input unsigned char PressR; /* =1 , =0 */
input unsigned char pressLF; /* =1 , =0 */
input unsigned char pressMF; /* =1 , =0 */
input unsigned char pressRF; /* =1 , =0 */
input unsigned char ClickL; /* =1 , =0 */
input unsigned char ClickM; /* =1 , =0 */
input unsigned char ClickR; /* =1 , =0 */
input unsigned char bQ; /* =1 , =0 */
input unsigned char bW; /* =1 , =0 */
input unsigned char bE; /* =1 , =0 */
input unsigned char bR; /* =1 , =0 */
input unsigned char bT; /* =1 , =0 */
input unsigned char bY; /* =1 , =0 */
input unsigned char bU; /* =1 , =0 */
input unsigned char bI; /* =1 , =0 */
input unsigned char bO; /* =1 , =0 */
input unsigned char bP; /* =1 , =0 */
input unsigned char bA; /* =1 , =0 */
input unsigned char bS; /* =1 , =0 */
input unsigned char bD; /* =1 , =0 */
input unsigned char bF; /* =1 , =0 */
input unsigned char bG; /* =1 , =0 */
input unsigned char bH; /* =1 , =0 */
input unsigned char bJ; /* =1 , =0 */
input unsigned char bK; /* =1 , =0 */
input unsigned char bZ; /* =1 , =0 */
input unsigned char bX; /* =1 , =0 */
input unsigned char bC; /* =1 , =0 */
input unsigned char bV; /* =1 , =0 */
input unsigned char bB; /* =1 , =0 */
input unsigned char bN; /* =1 , =0 */
input unsigned char bM; /* =1 , =0 */
input unsigned char bSpace; /* =1 , =0 */
input unsigned char bL; /* =1 , =0 */
input unsigned char bBacspace; /* =1 , =0 */
input unsigned char bEnter; /* =1 , =0 */
input unsigned char bZap; /* =1 , =0 */
input unsigned char bTochka; /* =1 , =0 */
input unsigned char ShiftEn; /* =1 , =0 */
input unsigned char CapsEn; /* =1 , =0 */
input unsigned char bQR; /* =1 , =0 */
input unsigned char bWR; /* =1 , =0 */
input unsigned char bER; /* =1 , =0 */
input unsigned char bRR; /* =1 , =0 */
input unsigned char bTR; /* =1 , =0 */
input unsigned char bUR; /* =1 , =0 */
input unsigned char bOR; /* =1 , =0 */
input unsigned char bTverdR; /* =1 , =0 */
input unsigned char bYR; /* =1 , =0 */
input unsigned char bPR; /* =1 , =0 */
input unsigned char bXXR; /* =1 , =0 */
input unsigned char bIR; /* =1 , =0 */
input unsigned char bBacspaceR; /* =1 , =0 */
input unsigned char bSpaceR; /* =1 , =0 */
input unsigned char bZR; /* =1 , =0 */
input unsigned char bXR; /* =1 , =0 */
input unsigned char bCR; /* =1 , =0 */
input unsigned char bVR; /* =1 , =0 */
input unsigned char bBR; /* =1 , =0 */
input unsigned char bNR; /* =1 , =0 */
input unsigned char bMR; /* =1 , =0 */
input unsigned char bRusBR; /* =1 , =0 */
input unsigned char bRusUR; /* =1 , =0 */
input unsigned char bAR; /* =1 , =0 */
input unsigned char bSR; /* =1 , =0 */
input unsigned char bDR; /* =1 , =0 */
input unsigned char bFR; /* =1 , =0 */
input unsigned char bGR; /* =1 , =0 */
input unsigned char bHR; /* =1 , =0 */
input unsigned char bJR; /* =1 , =0 */
input unsigned char bKR; /* =1 , =0 */
input unsigned char bLR; /* =1 , =0 */
input unsigned char bRusGR; /* =1 , =0 */
input unsigned char bRusER; /* =1 , =0 */
input unsigned char bZapR; /* =1 , =0 */
input unsigned char bTochkaR; /* =1 , =0 */
input unsigned char bEnterR; /* =1 , =0 */
input unsigned char CapsRus; /* =1 , =0 */
input unsigned char ShiftRus; /* =1 , =0 */
input unsigned char bNum1; /* =1 , =0 */
input unsigned char bNum2; /* =1 , =0 */
input unsigned char bNum3; /* =1 , =0 */
input unsigned char bNum5; /* =1 , =0 */
input unsigned char bNum6; /* =1 , =0 */
input unsigned char bNum7; /* =1 , =0 */
input unsigned char bNum0; /* =1 , =0 */
input unsigned char bNum9; /* =1 , =0 */
input unsigned char bNum8; /* =1 , =0 */
input unsigned char bNum4; /* =1 , =0 */
input unsigned char bSpaceSim; /* =1 , =0 */
input unsigned char bSim24; /* =1 , =0 */
input unsigned char bSim25; /* =1 , =0 */
input unsigned char bSim26; /* =1 , =0 */
input unsigned char bSim10; /* =1 , =0 */
input unsigned char bBacspaceSim; /* =1 , =0 */
input unsigned char bSim23; /* =1 , =0 */
input unsigned char bSim22; /* =1 , =0 */
input unsigned char bSim21; /* =1 , =0 */
input unsigned char bSim20; /* =1 , =0 */
input unsigned char bSim19; /* =1 , =0 */
input unsigned char bSim6; /* =1 , =0 */
input unsigned char bSim16; /* =1 , =0 */
input unsigned char bSim15; /* =1 , =0 */
input unsigned char bSim14; /* =1 , =0 */
input unsigned char bSim13; /* =1 , =0 */
input unsigned char bSim12; /* =1 , =0 */
input unsigned char bSim11; /* =1 , =0 */
input unsigned char bSim17; /* =1 , =0 */
input unsigned char bSim1; /* =1 , =0 */
input unsigned char bSim2; /* =1 , =0 */
input unsigned char bSim3; /* =1 , =0 */
input unsigned char bSim4; /* =1 , =0 */
input unsigned char bSim5; /* =1 , =0 */
input unsigned char bSim7; /* =1 , =0 */
input unsigned char bSim8; /* =1 , =0 */
input unsigned char bSim9; /* =1 , =0 */
input unsigned char bSim27; /* =1 , =0 */
input unsigned char bSim28; /* =1 , =0 */
input unsigned char bEnterSim; /* =1 , =0 */
input unsigned char bSim18; /* =1 , =0 */
input unsigned char bSim29; /* =1 , =0 */
input unsigned char bSim30; /* =1 , =0 */
input unsigned char bSim31; /* =1 , =0 */
output unsigned char IsShiftEn_g; /* =0..255 */
output unsigned char IsShiftRus_g; /* =0..255 */
output unsigned char hasEngSim_b; /* =0..255 */
output unsigned char hasRusSim_b; /* =0..255 */
output unsigned char hasSpecSim_b; /* =0..255 */

我们完成了RemoteXY网站。我们转到FLProg上的项目。

可以将Arduino Leonardo控制器(已选中),Arduino DUE(对该控制器的支持从2.3版本开始出现-已选中)和Arduino Micro(理论上尚未到达,我正在等待检查)可以假装成标准的(即不需要特殊驱动程序)鼠标和键盘; 。

可在此处下载本课程的FLProg项目蓝牙模块HC-05用作与电话的通信设备。根据表进行连接。
HC-051模块Arduino的莱昂纳多
Vcc+ 5伏
地线地线
TXDD0 (RX1)
RXDD1 (TX1)

考虑该项目:



有一个非常大的“ RemoteXY”单元,可以与手机进行通信。要对其进行配置,您需要将从RemoteXY项目站点接收的代码下载到其中。块的信息(块属性->选项卡“信息”)中详细描述了加载过程,因此在此不再赘述。我只针对那些使用FLProg 2.3及更早版本的用户。这些版本中有一个小错误。如果在RemoteXY网站上创建项目时,在设置中选择将要加载描述的项目中不存在或繁忙的端口,则该程序将在加载时崩溃。为避免这种情况,必须首先在块设置中选择一个空闲端口,然后加载描述。在更高版本的FLProg中,此错误已修复。

CD(编码器)块用于确定所按按钮的数量。他们在输出上给出出现逻辑1的输入数字,而没有日志。在所有输入中为1,在此块0的输出中。



这里,从电话接收的数据中,我们检测到鼠标和滚轮的移动方向。我选择了5个单位的死区(每个方向的操纵杆和滑块0-100的信号变化最大)。原则上,为了改善鼠标的工作量,可以使用此值。在此还可以确定步长(鼠标移动或滚动的速度)。还可以播放“比例”块参数,以实现更舒适的鼠标控制。



在这里,我们直接发送命令来移动虚拟鼠标。为此,请使用新的“鼠标移动”块。如果“发送”输入端有一个高电平,则每个块发送命令,每10ms(在块设置中设置)每隔10ms沿特定方向移动一次鼠标。



此处还使用了新的“鼠标轮”块。该块发送一个命令来旋转虚拟鼠标的滚轮。在此,为了获得平滑效果,使用了不同的原理(与移动鼠标不同)。如果“发送”输入处的电平很高,则设备会向虚拟鼠标发送命令以使滚轮旋转一步,但要在板2上计算出频率。该频率取决于手机上滑条的位置,并且当值更改时从200毫秒更改为5毫秒。从滑块接收的信号从5(死区)到100(极限位置)。



这里使用“ MousePressKey”块。在“发送”输入的高级别,它按住设置中选择的虚拟鼠标按钮,在低级别时,释放它。为了实现固定压紧的效果,使用了TT触发器(计数触发器)。在入口的第一个前沿,他们将其输出转换为对数状态。 1,然后在第二秒将其降低为0。如此一圈。



在这里,我们使用“ MouseClickKey”块,该块在“ Send”输入的上升沿上,短按一下在块设置中选择的虚拟鼠标按钮。



此处,使用“ KeyboardStatus”和“ MouseStatus”块,当状态输入为高时,分别打开虚拟键盘和鼠标,并在级别为低时将其关闭。在此方案中,要控制开和关,信号是存在与arduino的电话连接。它在“ RemoteXY”块(板1)的“ CS”输出处形成。此外,如果存在连接,我们将点亮arduino板上内置的LED(引脚13)。



在此,确定按下电话上的应用程序中的一个键盘上的按钮的事实,以及确定在哪个特定键盘上按下了按钮(俄语或英语)。此外,还会生成信号,以点亮位于手机上每个应用程序键盘右上角的LED。该LED指示按钮按下信号已到达控制器。我在安装过程中使用了它,但决定将其保留在应用程序的最终版本中。



这确定是否输入大写字母。在手机上的应用程序中按下“ Shift”按钮的前沿将SR触发器设置为log.1状态。字符输入结束后(出现按下字符的信号的后沿),触发器将复位为0。
每次在手机上的应用程序中按“ Caps”按钮都会反转“ Shift”按钮的操作。即,在初始位置,主要输入状态为小写字符,当您按下“ Shift”按钮时,将输入一个大写字符,然后在按下“ Caps”按钮一次之后,模式将改变。大写字母成为主要字母,当您按“ Shift”按钮时,将输入一个小写字符。再次按下“ Caps”按钮时,输入将切换到主模式。此外,还会生成一个信号,以点亮手机上应用程序中的“ Shift”指示灯。



在此,根据按钮电话上的应用程序中键盘上所按的数字,形成该按钮的符号代码。这是通过“代码表”块完成的,该块在“ Q”输出处生成一个代码,该代码在该块中加载的表中的编号与“ I”输入中的值相对应。

代码表被加载到该板上的“代码表”块中。
113q
119w
101e
114r
116t
121y
117u
105i
111o
112p
97a
115s
100d
102f
103g
104h
106j
107k
108l
122z
120x
99c
118v
98b
110n
109m
91[
93]
59
39'
44,
46.


请注意,俄语字符和英语字符都使用相同的代码表。事实是,Keybord库仅理解单字节代码,并且实际上按下了虚拟键盘上的按钮,在该按钮上写入了带有传递给它的代码的符号。要输入俄语字符,输入时,计算机上的输入法会强制切换为俄语。我们将在下一版中考虑如何完成此操作。



这里使用两个“ SequenceKeybord”块。这些位于“发送”输入的上升沿上的块执行在配置块时配置的键盘操作脚本。通过此块,我们可以配置俄语或英语字符的输入,以及切换小写或大写字符。但这还需要对连接我们设备的计算机进行一些配置。您需要配置键盘快捷键以启用俄罗斯和盎格鲁布局。这是在计算机控制面板中完成的。







对于此设备,我使用CTRL + 1键和俄语CTRL + 0键配置了英语的包含。在脚本块中使用的是这些组合。
考虑一个顶级案例。



该脚本在“发送”输入处的上升沿上从上到下逐步执行(当出现电话中应用键盘上存在按下的字符的信号时)。第一步,按住CTRL键并保持在虚拟键盘上。在第二步中,短按按钮,将代码输入到“代码步骤2”输入中。如果在俄语键盘上按下该键,它将为48(字符代码1),而如果为英语,则为49(字符代码0)。在第三步中,释放CTRL按钮。因此,我们将输入语言切换为输入该字符所需的语言。

下一步取决于“活动步骤4”输入的高水平。当大写模式处于活动状态时发生。在这种情况下,执行步骤4,并按住虚拟键盘上的“ Shift”按钮。这样,将输入大写字符。

好了,在最后一步,按下并按住了虚拟键盘按钮,输入了“代码步骤5”的代码(我们在手机应用程序中的键盘上按下的按钮的代码)。

如果由于脚本下半部分输入的反转导致电话应用程序中的键盘上的按钮被按下的信号消失,则执行其中配置的脚本。



首先,我们释放之前按下的符号按钮,然后释放“ Shift”按钮



在这里,类似于板10,我们生成有关键盘上按下的按钮的信号,该按钮用于电话中应用程序中的特殊字符和数字,以及该按钮的代码。

代码表被加载到该板上的“代码表”块中。
44,
44,
46.
46.
178BACKSPACE
178BACKSPACE
178BACKSPACE
32«»
32«»
32«»
176RETURN
176RETURN
176RETURN
491
502
513
524
535
546
557
568
579
480
33!
64@
35#
36$
94^
38&
42*
40(
41)
95_
43+
45-
61=
47/
92\
124|
63?
37%
91[
93]
123{
125}
62>
60<
39'
34"
44,
46.
58:
59
126~




当出现信号,指示在电话上的应用程序中的键盘上按下了特殊键时,将执行“ SequenceKeyboard”块中配置的脚本。其中,我们首先将输入法翻译成英文(按“ CTRL”键→按“ 1”键→松开“ CTRL”键),然后按所需的字符键。如果按下的按钮消失,则执行一次一次性暴露于“ OneKeyboard”键盘的操作,该键盘将执行设置中编程的一项操作。在这种情况下,释放先前按下的特殊字符键。

编译后,该项目仅占用Arduino Leonardo控制器一半以上的内存,从而可以对该项目进行各种修改。
祝您有创造力!

Source: https://habr.com/ru/post/zh-CN400655/


All Articles