Arduino - 改造电脑开机方式,实现密码开机

作为上班族,你是否因为别人经常乱动你的电脑而烦恼?
作为程序猿,你是否因为代码放在办公室里怕被人拷走而担心?
又或者,你电脑里面有些电视台不让播的秘密?
系统没密码裸奔?一般人不会这样。
系统加登录密码?用U盘照样启动你的电脑。
屏蔽USB口?自己用起来麻烦。
怎么做才安全又省心?
从根本上解决。
我们接下来要实现的方案就是:直接控制主板的开机跳线,设置上密码。如果不知道密码,主板直接不开机。
当然,我们需要一把锁,把机箱锁起来。
这里写图片描述
是的,一点也不搞笑,虽然很土,但是确实需要一把机箱锁。
当然,也不排除被人强行开锁或者抱走主机的情况。那人品,我只能送你俩字,呵呵。

所需材料:

1、AVR单片机一块(ATTiny2313A,使用内部振荡器)+母座一个
2、电容一个(稳压)
3、按钮8个(6个密码输入键、一个确定键、一个设置键)
4、led灯一个(操作指示灯) + 1K电阻一个
5、pc816光耦一个(控制开机信号) + 300R左右电阻一个
6、导线若干

接线方法:

1、5V 接ATX电源的5VSB线,已保证单片机随时有电。GND 接ATX电源的GND线。两端接电容进行稳压。
2、0 号针脚做输出,接led灯(串联1K电阻),作为操作指示灯,按键时会亮。
3、1~6 号针脚做输入,作为6个密码输入按键。启用上拉电阻。
4、7 号针脚做输入,作为“确定”按键。启用上拉电阻。
5、8 号针脚做输出,接pc817光耦(串联300R左右电阻),作为开机控制接口,接主板的开机跳线,主板原来的开机跳线去掉。

  • 注意:接主板跳线时正负极不要接反,不然线路不通,无法控制开机。
  • 开机跳线同时引出两个接头(或接到一个开关按钮上)放到机箱里面备用,以防按键无法开机时,可以打开机箱手动开机。

6、16 号针脚做输入,作为“设置”按键。启用上拉电阻。

  • 设置按键放到机箱里面,做好保密措施,以防被随意重置密码。

工作流程:

1、设置密码:

1、依次按下要设置的密码键,最多支持10位密码,多了则只保留最后10位。
2、按下设置键不放开,同时按一下确定键,再松开两键(松开时没有先后顺序)。系统会将输入的密码保存到EEPROM,保证掉电不丢失。

2、输入密码开机:

1、依次按下要设置的密码键,最多支持10位密码,多了则只保留最后10位。
2、按一下确定键。如果密码正确,则开机,并同时清空已输入的密码。如果不正确,则只清空已输入的密码,以便下次输入。

Arduino代码:

#include <EEPROM.h>
byte password[10]; //最多支持10位密码
byte inputpass[10];

void setup() {
    //定义针脚
    pinMode(0,OUTPUT);//指示灯
    pinMode(1,INPUT_PULLUP);
    pinMode(2,INPUT_PULLUP);
    pinMode(3,INPUT_PULLUP);
    pinMode(4,INPUT_PULLUP);
    pinMode(5,INPUT_PULLUP);
    pinMode(6,INPUT_PULLUP);
    pinMode(7,INPUT_PULLUP);//确定
    pinMode(8,OUTPUT);//开机
    pinMode(16,INPUT_PULLUP);//设置
    //读取现有密码
    for (int i=0;i<10;i++){
        password[i] = EEPROM.read(i);
    }
}

void loop() {
      //如果有密码输入,1-6号针
      for (int i=1;i<7;i++){
          if(digitalRead(i)==LOW){
              digitalWrite(0,HIGH);//亮灯
              for (int n=0;n<9;n++){inputpass[n]=inputpass[n+1];}//10个密码位顺序左移,每次左移总是挤掉第一位,并留出最后一位给当前按下的密码。
              inputpass[9]=i; //将当前按下的密码赋值给最后一位    
              while (digitalRead(i)==LOW){delay(1);} //等待按钮松开
              digitalWrite(0,LOW);//灭灯
          }
       }
       //如果按了确定
      if(digitalRead(7)==LOW){
            digitalWrite(0,HIGH);//亮灯
            // 如果设置按钮被按下,写密码
            if (digitalRead(16)==LOW){
                 for (int i=0;i<10;i++){
                      password[i] = inputpass[i];
                      EEPROM.write(i,inputpass[i]);
                      inputpass[i] = 0;
                  }
            }
            // 如果设置按钮未被按下,对比密码
            else{
                  bool b=true;
                  //对比密码
                  for (int i=0;i<10;i++){
                      if ( password[i] != inputpass[i] ){ b=false; }
                      inputpass[i]=0;//清空已输入密码
                  }
                  //如果密码正确则开机
                  if (b) {
                      digitalWrite(8,HIGH);
                      delay(300);  
                      digitalWrite(8,LOW);
                  }
            }
            while ( digitalRead(7) == LOW ){ delay(1); } //等待按钮松开
            digitalWrite( 0 , LOW );//灭灯
      }
    delay(1);
}

猜你喜欢

转载自blog.csdn.net/sdlgq/article/details/77602774