用 Arduino 打造一个自动锁屏装置

2015-06-021.5万
AI 快速预览详细 收起
本文介绍了如何使用Arduino制作一个自动锁屏装置。通过红外传感器检测人体存在,当无人时自动发送WinKey+L键码锁定电脑。项目包括硬件清单、电路图和代码示例。适合初学者和STEM教育场景。


上大学的时候,当团支书,负责同学交入Party申请书之类的事情。想入Party有一关是“群众评议”,就是看看是否有反对的意见。当时我和班级上的同学说“一个好人,进入Party是追求进步,是好事;一个坏人,进入Party会让群众队伍更纯洁,因此也是好事。大家都不要反对哈”。所以我们班级在这一关从来没有过什么问题。后来有一次,我去帮同学交入Party申请书,顺便讨价还价一下(我记得有规定是交了之后必须间隔一段才能进入正式的城西,为此我会和辅导员商量这个申请书的时间多多提前一些)。辅导员不在,我就稍等了一下。期间无聊,顺便翻翻其他班级的评议,结果让我大吃一惊,真有班级同学特别反对某个人的,罗列了很多条意见。正在我看在兴头上,辅导员看到急忙过来将东西收了起来,半开玩笑的批评另外帮忙的女同学,说这样的东西怎么能让这种人看到………所以信息安全非常重要。

当你起身去上厕所或者喝水的时候,是否可曾担心屏幕上的信息被人有意或者无意的看到?或者你外出办事,是否担心有人悄悄操作你的电脑?解决这个问题最简单的办法就是给Windows设置一个密码,然后在离开的时候按下 WinKey+L 。

下面就来使用Arduino制作一个自动完成这个“人走屏锁”的装置。

简单的说,工作分为两步:第一步,制作Arduino模拟USB键盘;第二步,让这个模拟键盘发出WinKey+L的键码。

使用的BOM如下:
A.USB公头(有供电和通讯能力的USB头皆可) x1
B.120欧电阻(原文建议68欧,但是我刚好没有所以并联2个来实现60欧) x4
C. 2.2K欧电阻 x1
D.3.6伏稳压管 x2
E.红外线传感器 x1 (用来实现人体感应)

先说第一步,根据 《Arduino学习笔记A11 - Arduino模拟电脑键盘(基于AVR-USB的USB-HID设备)》参考[1]。使用到BOM中提到的A-D,具体电路如下

按照上图设计,首先用面包板进行搭建:

测试能够正常实现一个USB Keyboard的功能,具体调试可以参照《Arduino USB keyboard debug经验》。确定上述能够正常工作之后,进行简单的焊接,用大头针将Pin脚引出。

再使用纸壳做了一个盒子,将Arduino装了进去。

下一步的目标就是加入一个能够判断人体是否存在的功能了。最先想到的是人体感应模块。通常都是长得下面这个样子。

我也入手了一块,但是测试中感觉很奇怪,手放在它前面一段时间之后就没有输出了。后来再仔细阅读资料发现,这个东西应该叫做“人体运动感应模块”。是根据判断当前的红外线变化来判断是否有人体进入。如果想做到“人体感应”,还要加入更复杂的设计。
万幸,手边还有一块红外距离模块,这是用来判断一定距离内是否有遮挡的元件。探测距离可以在0-100cm以内调节。当有阻挡的时候输出低电平,反之输出高。

使用时,探头的VCC和GND同样取自USB供给。输出OUT连接到Arduino的D8。


  1.         #include "UsbKeyboard.h"
  2.         int KEYPIN = 8; //使用D8作为检测输入,直接使用D1的话
  3.         //灌入电流过大,会导致死机。最好是加入限流电阻
  4.         //手边没有,就这样暂时这样了
  5.         unsigned long ElspTimer=0;
  6.         void setup()
  7.         {
  8.          TIMSK0 &= !(1 << TOIE0); //这里的中断给USB使用了,所以Delay(), Millis()
  9.         //micros() delay() delayMicroseconds()统统不好用了
  10.         //取而代之的是用串口输出做的粗糙的延时
  11.          pinMode(KEYPIN, INPUT);
  12.          Serial.begin(9600);
  13.         }
  14.         void loop()
  15.         {
  16.          UsbKeyboard.update();
  17.          if(digitalRead(KEYPIN) == LOW)
  18.          {
  19.          ElspTimer=0;
  20.          }
  21.          ElspTimer++;
  22.          Serial.println(ElspTimer); //这里主要是为了延时使用
  23.          if (ElspTimer>6000L) //循环6000次,在Uno上是40s左右
  24.          {
  25.          UsbKeyboard.sendKeyStroke(KEY_L,MOD_GUI_LEFT); //发出WinKey+L 来锁定
  26.          ElspTimer=0;
  27.          }
  28.         }
复制代码





这样,当人离开的时候,红外探头就无法检查到障碍物,会输出一个高电平。经过40s左右的延时,如果始终为高,就会模拟按下WinKey+L来锁定电脑。从而实现了人走屏锁的功能。
为了美观,最好再做个盒子之类的,我这里只是找了一个啤酒杯,露出探头和USB线。大功告成。

总结:Arduino通过IO来模拟一个低速设备能够完成一些有趣的功能,还有更多种的“玩法”等待我们去探索。


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(6)
微笑的rockets
微笑的rockets
话说为什么不搞个3D打印机来打印一个壳子呢。
会好看很多啊。
R2D2
R2D2
这是在家打游戏的利器。。。
qq815076543322
qq815076543322
作者
回复R2D2
不用担心被妈妈发现了
touchfree
touchfree
楼主 创新能力好强!
Cain
Cain
哈哈,好实用。检测信号反过来就可以在家长推门的时候自动锁屏,妈妈再也不会看到我在打游戏了,或者可以在别人用电脑的时候自动“帮忙”锁屏了:lol
qq815076543322
qq815076543322
作者
回复Cain
可是尝试着做做看
qq815076543322
qq815076543322
作者
回复Cain
可是尝试着做做看
hnyzcj
hnyzcj
这个貌似很屌呀
qq815076543322
qq815076543322
作者
回复hnyzcj
看着确实很屌 要不试试看
丄帝De咗臂
丄帝De咗臂
代码就一句呢
丄帝De咗臂
丄帝De咗臂回复qq815076543322
加油
qq815076543322
qq815076543322
作者
回复丄帝De咗臂
不好意思 我再整理一下子
- 没有更多了 -