本項目是一個使用120VAC指示燈和光敏電阻創建的基于光隔離的簡單廉價交流電壓傳感器。
最近我承接了一個項目,我需要一種方法來檢測我家的電源何時關閉,并且我需要檢測泵何時在運行。雖然說市面上有可以購買的傳感器,但我認為構建一個會很有趣。
為了避免其他項目變得過于復雜,我決定在一個單獨的項目中分享構建這個簡單設備的細節。
設備概述
我正在構建的設備相當簡單,只需要一些便宜的組件。最昂貴的組件是105-125VAC指示燈,通常用作您家中電器的電源指示燈。
該設備的概念是使用光敏電阻來檢測來自指示燈的光。使用簡單的分壓器電路和來自樹莓派的3.3v電源,當輸入端子上的電壓為0時,設備將輸出高信號,當端子上的電壓為120VAC時,設備將輸出低信號。
除了低成本之外,這種設計的一大優勢是交流電路與您的物聯網設備完全隔離。這可以保護您的RaspberryPi和其他電路組件免受電涌的影響。
設備操作
電路設計基于分壓器電路,該電路由兩個串聯在電源和地之間的電阻器(或任何更高和更低的電壓電位)組成。電壓是從兩個電阻器之間的點和兩個電壓電位點中的較低點(在這種情況下為接地)測量的。通常,在分壓器電路中,兩個電阻器都是固定的。在該電路中,當光的強度發生變化時,其中一個電阻會改變其值,從而允許設備根據光源改變輸出電壓。
該設備旨在用作兩態設備,這意味著我只想檢測交流輸入電路是打開還是關閉。電路的輸出需要通過GPIO引腳檢測為高電平或低電平。為此必須仔細選擇固定電阻的值。
電路的關鍵是確定上圖中R1的正確電阻。光敏電阻的電阻隨光量而變化。完全黑暗時,電阻為90K至100KΩ。在完全明亮的光源下,它會降至約200Ω。
計算R1的正確電阻值取決于可用的光量。光源可能不夠亮,無法將電阻降至最低測量值。考慮到這一點,我使用琥珀色指示燈測量了電阻值。我通過將光源放在黑色熱縮管內進行此測量,光敏電阻壓在光線上,然后在燈亮時用伏特/歐姆表測量電阻。黑管是必要的,以模擬設備完全構建時的條件
實驗產生了941Ω的測量值。使用分壓器的標準公式(如下圖所示)并針對0.75v的低電壓,我確定R1needrf的值為3.2KΩ。
在電路設計中,為了獲得3.2KΩ,我決定使用標準的1KΩ和標準的2.2KΩ串聯電阻(1KΩ和2.2KΩ都是您工具箱中最有可能擁有的標準尺寸)。
負載效應:當RaspberryPi等設備連接在Vout和接地之間時,該設備稱為負載。此負載具有有效的輸入阻抗,會改變電路的行為,這可能需要更改設計以抵消這種影響。為了幫助理解這種效應,可以將負載視為在電路圖上的Vout和接地之間添加的新電阻。在這個設備中,當與樹莓派一起使用時,負載效應可以忽略不計,因為輸出電流是穩定的,它只是分壓器輸入電流的一小部分。出于這個原因,我能夠將其設計為被動電路以保持低成本。如果執行此功能的設備包含調節器電路以允許輸出負載變化,則它們的成本可能會高得多。
設備構造
構建這個設備需要一個烙鐵和一個將組件焊接在一起的好地方。沒有使用PCB板,我只是將這些部件連接在一起,然后將它們收縮包裝以進行保護。確保您有一個良好的表面來放置組件。
修剪兩個電阻的兩端,光敏電阻引出約1.5厘米
電阻器將串聯焊接到光敏電阻器引線之一(見下圖),與引線重疊至少1厘米。布置光敏電阻和第一個電阻。
首先將第一個電阻器焊接到光敏電阻器引線上。將烙鐵壓在引線上,然后將兩條引線焊接在一起,確保焊料沿著重疊部分的長度延伸
以與第一個相同的方式布置第二個電阻
接下來以相同的方式將第二個電阻焊接到第一個電阻上(兩個電阻的順序無關緊要)
從紅色引線的末端剝去約1厘米,并將其焊接到第二個電阻器的末端。該引線將連接到RaspberryPi上的3.3v電源
從黃色引線的末端剝去約1厘米,并將其焊接到第一個電阻連接到的光敏電阻上的引線。此引線將連接到RaspberryPi上的GPIO端口
從黑色引線末端剝去約1厘米,并將其焊接到第二個電阻器的末端。該引線將連接到RaspberryPi上的地
將3/32“熱縮管滑過黑線一直到光敏電阻,將其推到電阻上。加熱管使其鎖定到位(我使用黑色作為這條帶)
將3/16”熱縮管滑過紅線和黃線一直到光敏電阻,將其推到電阻上。加熱管使其鎖定到位(我用黑色作為這條帶)
將1/4“熱縮管滑過所有三根電線,并將其他管子的末端重疊約0.5厘米。加熱管子,使其鎖定到位(我用藍色作為這條帶)
將指示燈滑入硬塑料管中,使電線端與管端齊平
將光敏電阻組件滑入硬塑料管的另一端,直到它靠在指示燈上
將3/8”熱縮管滑到硬塑料管上,直到它位于管子的中心。大約3/4“應懸掛在兩端。加熱管子,直到它鎖定到位(在加熱管子時,可能需要用一只手將光敏電阻組件固定到位)。注意:前面步驟中的管子顏色無關緊要,但我建議在此步驟中使用黑色,以確保沒有光線從設備中逸出
修剪紅線、黑線和黃線,使它們都均勻
為什么要混合使用公制和英制單位?在整篇文章中,我有意混合使用公制和英制單位。我使用大尺寸的英制單位。此外,當我購買材料并以英制單位表示時,我會指定這些單位的尺寸。在處理較小的尺寸時,我通常用公制表示。我希望這不會給某些人造成太多的困惑。
設備測試
連接設備
現在設備已經完成,是時候運行測試了。我首先找到了一條我之前從一個故障的便攜式空調裝置上剪下來的電源線(我保存了電源線,因為它有一個內置的斷路器)。任何舊的兩線延長線都可以使用。延長線的白色和黑色電線應使用接線螺母連接到指示燈的電線。我的電源線有第三根綠色地線,我剛剛用另一個線螺母蓋住了它。確保連接牢固,移動設備時不要松動。還要確保裸露的電線沒有裸線。
免責聲明:如果您不清楚操作步驟,使用高壓交流電流可能會非常危險。如果您對如何執行此操作感到不舒服或不確定,請咨詢專家。您正在嘗試這些測試,風險自負!
連接延長線后,我將延長線插入帶有開關的電源板,以便輕松測試設備的操作。
接下來,我將設備的紅線連接到RaspberryPi的+3.3V引腳,將黑線連接到接地引腳,并將黃線連接到Pi上的一個GPIO端口(我在源代碼中使用GPIO5)。
運行軟件
使用的源代碼可在GitHub中找到(請參閱下面的鏈接)。
該應用程序是一個簡單的視圖,將GPIO引腳的狀態顯示為“高”或“低”。連接后,關閉電源板將導致顯示屏顯示“高”。打開電源,狀態將變為“Low”。
主窗體的XAMl如下所示。
主視圖背后的代碼如下所示。
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Windows.Devices.Gpio;
using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace VacSensor
{
public sealed partial class MainPage : Page, INotifyPropertyChanged
{
private GpioPin _pin = null;
private CoreDispatcher _dispatcher = null;
public MainPage()
{
this.InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged = null;
private void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private string _gpioState = "Unknown";
public string GpioState
{
get
{
return _gpioState;
}
set
{
this._gpioState = value;
this.OnPropertyChanged();
}
}
private async Task UpdateUI()
{
if (_dispatcher != null)
{
await _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
GpioPinValue value = _pin.Read();
this.GpioState = value == GpioPinValue.High ? "High" : "Low";
});
}
}
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
_dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
GpioController gpio = GpioController.GetDefault();
if (gpio != null)
{
_pin = gpio.OpenPin(5);
_pin.SetDriveMode(GpioPinDriveMode.Input);
_pin.ValueChanged += Pin_ValueChanged;
}
await UpdateUI();
base.OnNavigatedTo(e);
}
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
if (_pin != null)
{
_pin.Dispose();
_pin = null;
}
_dispatcher = null;
base.OnNavigatingFrom(e);
}
private async void Pin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
{
await UpdateUI();
}
}
}
要測試該單元,請將代碼部署到 Raspberry Pi 并使用 F5 啟動它。應用程序運行后,在電源板上打開和關閉電源,每次顯示都會改變。
-
指示燈
+關注
關注
3文章
415瀏覽量
28276 -
光敏電阻
+關注
關注
4文章
293瀏覽量
48972 -
電壓傳感器
+關注
關注
1文章
106瀏覽量
18281
發布評論請先 登錄
相關推薦
評論