通过USB控制外设电源的方法
外部设备又称“外设”,是计算机系统中的重要组成部分,主要是指除了计算机主机以外的硬件设备,可进行传输、转送、储存大量的数据和信息等内容。DIY实现通过USB控制外设电源,下面是学习啦小编给大家整理的一些相关解决方法步骤,希望对大家有帮助!
通过USB控制外设电源的方法
家里的电脑通过无线路由器上网,经常长时间开机下载一些高清电影、音乐、软件,但是无线路由器不够稳定,时不时的就死机,死机后不论是无线还是有线全部都无法链接,只能断电重启路由器才能恢复正常,而且死机往往是随机出现的,有时候连续运行几天也没事,有时候重启了十分钟就又死掉了,有时候开机下载了一晚上,早上起来一看,路由器早就死掉了,电脑白白的运行了一夜。如果能够让电脑控制无线路由的电源,在路由器死机的时候自动重启它,就不会出现这种让人崩溃的事情了,再进一步,如果能在下载完成后自动关机,关外设电源(下载软件里的“下载完成后关机”功能,只能关机,不能关外设电源),节能减排,那就更完美了。
想要控制电源,简单的点的办法就是使用继电器,想要用电脑控制,那就需要用到串口,但是串口控制有一个弊端,就是需要外接直流电源,解决的方法就是使用USB转串口,这样可以直接从USB口取5V电。思路确定以后,接下来就简单了,在淘宝搜索
“USB 继电器”,找到一个现成的产品,:
这个继电器板还是比较小巧的,可以直接改装到插座里,而且触电容量有AC250V10A,足够用来控制电源插座了。为了增加绝缘性能,需要在电路板部分套上了热缩管。拍下付款,几天以后收到货,DIY开工喽:
首先要找一个内部空间能够放得下这块继电器板的插座,我用的是这款: 这是把插座拆开后的样子:拆开插座,正好有一块空间可以放下,而且长度刚刚好。可以看出,这款插座的做工还是非常好的,排线规矩,该有的都有。
这款插座和买的USB继电器都是采用接线柱的方式接线,所以改造非常简单,甚至连焊接都不用。首先,要把原插座里接线柱上接火线的一组两根线拆下,分别接到继电器输出模块的中间接线柱和“常开”接线柱上,然后整理好线,固定好继电器板的位置。
下面改造插座外壳,为了能把USB接口露出来,需要在外壳上开一个孔。量好位置,使用锯条、刀片和钳子破开一个缺口,然后用锉把边缘磨光滑,最后盖好后盖,拧紧螺丝,这样,硬件部分就改造完成了。下面是完工以后的样子:当电源插座上的USB线没有插在电脑上时,电源开关负责插座电源通断,与普通插座无异,当USB通过一根USB延长线插在电脑上时,会在电脑上模拟出一个串口来,可以通过程序向串口发送指令,来触发继电器动作,实现交流电的导通和断开。
插上USB延长线的样子:接下来编写控制软件,控制流程很简单,先通过API检测网络状态,如果发现网络不通,则打开串口,写入继电器断开指令,延迟2秒后再写入继电器闭合指令,然后关闭串口。把这个程序编译好后,用WINDOWS计划任务调用,每隔10分钟或更短时间自动执行一次,这样就实现了只要发现网络断开,就自动重启路由器的功能。
主要代码清单:
Attribute VB_Name = "main_form"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim RXDDATA(1 To 100) As Long
Private Declare Function InternetGetConnectedState Lib "c:\windows\system32\wininet.dll" (ByRef dwFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) '
Declare Function GetPrivateProfileString Lib "kernel32.dll"Alias"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Function MyGetSetting(Section As String, KeyName As String, DefaultValue As String) As String
Dim X
As Long
Dim Holder
As String * 255
X = GetPrivateProfileString(Section, KeyName, DefaultValue, Holder, 254, App.Path + "\comConfig.ini ")
MyGetSetting = Left$(Holder, InStr(Holder, Chr$(0)) - 1)
End Function
Private Sub Form_Load()
chuankou_num = MyGetSetting("本机", "COM号", " ")
Me.Hide
Dim ret As Long
If InternetGetConnectedState(ret, 0&) = 0 Then
‘判断网络连接状态
'打开串口
MSComm1.CommPort = chuankou_num
If MSComm1.PortOpen = False Then
main_form.MSComm1.PortOpen = True
main_form.MSComm1.RThreshold = 8 '一次接受的字节数
main_form.Timer1.Enabled = True
End If
Call tx_read_frame(1, 1, 0, 0, 0)
'断开
DoEvents
Sleep 1000
Call tx_read_frame(1, 2, 0, 0, 0) '吸合
'关闭串口
main_form.MSComm1.PortOpen = False
main_form.Timer1.Enabled = False
End If
End Sub
Public Function tx_read_frame(leixing As Byte, data1 As Byte, data2 As Byte, data3 As Byte, data4 As Byte)
Static Byteout(0 To 7) As Byte, i As Byte
'向外发送
Dim sum As Integer
Byteout(0) = &H55
Byteout(1) = 1
Byteout(2) = leixing
Byteout(3) = data1
Byteout(4) = data2
Byteout(5) = data3
Byteout(6) = data4
sum = 0
For i = 0 To 6 Step 1
sum = sum + Byteout(i)
Next
Byteout(7) = sum Mod 256
main_form.MSComm1.InBufferCount = 0
main_form.MSComm1.Output = Byteout
End Function
程序稍微改造一下,就可以实现关机时自动关闭外设电源,或者定时开启外设电源,或者按需要是自动开启或关闭外设电源,有了这个改造过的插座,再也不怕无线路由器死机了,可以畅快的连夜下载喜欢的高清电影啦。前面用到的继电器板是最简单的一路控制板,还可以使用4路、8路、16路,甚至还可以使用多块板子级联,以控制更多路继电器,如果加入温度、湿度传感器、压力传感器、热量传感器、光传感器等等,配合自己开发的控制软件,控制家电、灯光、水、暖、窗帘、门禁……,其实比尔盖茨豪宅里的智能家居离我们也不算遥远啊。