通過USB控制外設(shè)電源的方法
外部設(shè)備又稱“外設(shè)”,是計算機系統(tǒng)中的重要組成部分,主要是指除了計算機主機以外的硬件設(shè)備,可進行傳輸、轉(zhuǎn)送、儲存大量的數(shù)據(jù)和信息等內(nèi)容。DIY實現(xiàn)通過USB控制外設(shè)電源,下面是學習啦小編給大家整理的一些相關(guān)解決方法步驟,希望對大家有幫助!
通過USB控制外設(shè)電源的方法
家里的電腦通過無線路由器上網(wǎng),經(jīng)常長時間開機下載一些高清電影、音樂、軟件,但是無線路由器不夠穩(wěn)定,時不時的就死機,死機后不論是無線還是有線全部都無法鏈接,只能斷電重啟路由器才能恢復(fù)正常,而且死機往往是隨機出現(xiàn)的,有時候連續(xù)運行幾天也沒事,有時候重啟了十分鐘就又死掉了,有時候開機下載了一晚上,早上起來一看,路由器早就死掉了,電腦白白的運行了一夜。如果能夠讓電腦控制無線路由的電源,在路由器死機的時候自動重啟它,就不會出現(xiàn)這種讓人崩潰的事情了,再進一步,如果能在下載完成后自動關(guān)機,關(guān)外設(shè)電源(下載軟件里的“下載完成后關(guān)機”功能,只能關(guān)機,不能關(guān)外設(shè)電源),節(jié)能減排,那就更完美了。
想要控制電源,簡單的點的辦法就是使用繼電器,想要用電腦控制,那就需要用到串口,但是串口控制有一個弊端,就是需要外接直流電源,解決的方法就是使用USB轉(zhuǎn)串口,這樣可以直接從USB口取5V電。思路確定以后,接下來就簡單了,在淘寶搜索
“USB 繼電器”,找到一個現(xiàn)成的產(chǎn)品,:
這個繼電器板還是比較小巧的,可以直接改裝到插座里,而且觸電容量有AC250V10A,足夠用來控制電源插座了。為了增加絕緣性能,需要在電路板部分套上了熱縮管。拍下付款,幾天以后收到貨,DIY開工嘍:
首先要找一個內(nèi)部空間能夠放得下這塊繼電器板的插座,我用的是這款: 這是把插座拆開后的樣子:拆開插座,正好有一塊空間可以放下,而且長度剛剛好??梢钥闯觯@款插座的做工還是非常好的,排線規(guī)矩,該有的都有。
這款插座和買的USB繼電器都是采用接線柱的方式接線,所以改造非常簡單,甚至連焊接都不用。首先,要把原插座里接線柱上接火線的一組兩根線拆下,分別接到繼電器輸出模塊的中間接線柱和“常開”接線柱上,然后整理好線,固定好繼電器板的位置。
下面改造插座外殼,為了能把USB接口露出來,需要在外殼上開一個孔。量好位置,使用鋸條、刀片和鉗子破開一個缺口,然后用銼把邊緣磨光滑,最后蓋好后蓋,擰緊螺絲,這樣,硬件部分就改造完成了。下面是完工以后的樣子:當電源插座上的USB線沒有插在電腦上時,電源開關(guān)負責插座電源通斷,與普通插座無異,當USB通過一根USB延長線插在電腦上時,會在電腦上模擬出一個串口來,可以通過程序向串口發(fā)送指令,來觸發(fā)繼電器動作,實現(xiàn)交流電的導(dǎo)通和斷開。
插上USB延長線的樣子:接下來編寫控制軟件,控制流程很簡單,先通過API檢測網(wǎng)絡(luò)狀態(tài),如果發(fā)現(xiàn)網(wǎng)絡(luò)不通,則打開串口,寫入繼電器斷開指令,延遲2秒后再寫入繼電器閉合指令,然后關(guān)閉串口。把這個程序編譯好后,用WINDOWS計劃任務(wù)調(diào)用,每隔10分鐘或更短時間自動執(zhí)行一次,這樣就實現(xiàn)了只要發(fā)現(xiàn)網(wǎng)絡(luò)斷開,就自動重啟路由器的功能。
主要代碼清單:
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
‘判斷網(wǎng)絡(luò)連接狀態(tài)
'打開串口
MSComm1.CommPort = chuankou_num
If MSComm1.PortOpen = False Then
main_form.MSComm1.PortOpen = True
main_form.MSComm1.RThreshold = 8 '一次接受的字節(jié)數(shù)
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) '吸合
'關(guān)閉串口
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
'向外發(fā)送
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
程序稍微改造一下,就可以實現(xiàn)關(guān)機時自動關(guān)閉外設(shè)電源,或者定時開啟外設(shè)電源,或者按需要是自動開啟或關(guān)閉外設(shè)電源,有了這個改造過的插座,再也不怕無線路由器死機了,可以暢快的連夜下載喜歡的高清電影啦。前面用到的繼電器板是最簡單的一路控制板,還可以使用4路、8路、16路,甚至還可以使用多塊板子級聯(lián),以控制更多路繼電器,如果加入溫度、濕度傳感器、壓力傳感器、熱量傳感器、光傳感器等等,配合自己開發(fā)的控制軟件,控制家電、燈光、水、暖、窗簾、門禁……,其實比爾蓋茨豪宅里的智能家居離我們也不算遙遠啊。