|
本帖最后由 Zoologist 于 2017-11-29 21:02 编辑
很多时候,我们需要更简单的方式定义按键(特别是对于笔记本之类的),因此我使用 Pro Micro 制作一个小型键盘,上面有三个全尺寸的按键,能够完成特定的功能。
功能如下:
1.一键发出自定义快捷键。 比如,我们使用 Win + Space 来切换输入法。具体的代码实现就是模拟按下2个按键。
2.一键锁屏。比如,我们离开座位,最好将屏幕锁定,使用Win+L 来锁定屏幕,方法和上面的相同
3.一键调出应用程序。这个的实现比较特殊,需要重新加入一个 HID 的描述符,为此我编写了一个函数库。每次按下按钮,会掉出来计算器
4.一键静音。这个实现原理和3类似。只是因为我键盘上只有3个按钮所以代码中没有加入。
电路图
板子上有3个按键,5个LED, 3个在按键下面,2个在板子上。多余的2个LED是原本计划用来实现提醒的功能的。比如说,电脑上在编译,然后当编译结束的时候,这个LED会进行闪烁提醒。
装配的部分过程
焊接好之后,还有一个激光切割的外壳,按下之后LED会亮起来逐渐熄灭(PWM 实现)
完整的代码:
[kenrobot_code]#include <Keyboard.h>
#include <Remote.h>
#define MOD_GUI_LEFT 0x83 // Win 按键
//从左到右,Key[1-3]
byte key[3]={2,4,7};
//从左到右,按键上的LED,Led[1-3]
byte led[5]={3,5,6,9,8};
byte brightness[3];
void setup() {
Serial.begin(9600);
Keyboard.begin();
Remote.begin();
Serial.println("Q Starting....");
for (byte i=0;i<sizeof(key);i++)
{
pinMode(key,INPUT_PULLUP);
}
for (byte i=0;i<sizeof(led);i++)
{
pinMode(led,OUTPUT);
digitalWrite(led,HIGH);
delay(300);
digitalWrite(led,LOW);
}
}
void loop() {
for (byte i=0;i<3;i++)
{
if (LOW==digitalRead(key))
{
delay(50);
if (LOW==digitalRead(key))
{
Serial.print(i);
Serial.println("key pressed");
brightness=255;
if (0==i) {
Keyboard.press(MOD_GUI_LEFT); //按下 Win Key
Keyboard.press('l'); //按下 L
delay(200);
Keyboard.releaseAll(); //抬起全部按键
}
if (1==i) {
Keyboard.press(MOD_GUI_LEFT); //按下 Win Key
Keyboard.press(' '); //按下 Space
delay(200);
Keyboard.releaseAll(); //抬起全部按键
}
if (2==i) {
Remote.calc();
}
}
}
}
delay(30);
for (byte i=0;i<3;i++) {
if (brightness!=0) {
brightness--;
analogWrite(led,brightness);
}
}
}
[/kenrobot_code]
实现功能3 4 的库:
Remote.zip
(4.09 KB, 下载次数: 10)
|
|