檢測運(yùn)動,然后以高音調(diào)的警報聲和閃爍的燈光嚇跑入侵者。聽起來有趣嗎?當(dāng)然可以。這是今天的Arduino項目的目標(biāo),適合初學(xué)者。在進(jìn)行過程中,我們將完全從頭開始進(jìn)行測試,以便您可以希望了解所有過程,而不僅僅是安裝我已經(jīng)完成的工作。
免責(zé)聲明:這實(shí)際上不會保護(hù)您的房屋。
可能會給您妹妹一個令人討厭的沖擊。
您需要:
Arduino
超聲波“ ping”傳感器,我使用的是HC-SR04,PIR會更好,但價格昂貴。可以將ping傳感器秘密地放置在門口中,并且仍然可以執(zhí)行相同的基本工作,并且只需$ 5
壓電蜂鳴器
LED條形燈,其接線與我們以前使用的相同在這個項目中。
在連接該項目時,不要每次都刪除所有內(nèi)容-繼續(xù)在最后一個塊上進(jìn)行構(gòu)建。到“編碼警報系統(tǒng)”部分時,您應(yīng)該已經(jīng)將所有零碎的東西連接起來,看起來像這樣:
閃爍的燈光
使用該項目的接線圖連接您的LED燈帶;不要更改引腳,因?yàn)槲覀冃枰狿WM輸出。使用此代碼快速測試您的接線。如果一切順利,您應(yīng)該具有以下條件:
距離傳感器
在SR04模塊上,您會找到4個引腳。 VCC 和 GND 分別連接至+ 5V電源軌和地。 TRIG 是用于發(fā)送聲納信號的引腳,將其置于引腳6上; ECHO 用于回讀信號(并由此計算距離)-將其放在7上。
事情非常簡單,我們可以使用一個名為NewPing的庫。下載并放置在Arduino的 Library 文件夾中,然后重新啟動IDE,然后繼續(xù)。使用此代碼進(jìn)行測試;打開串行監(jiān)視器,并確保速度設(shè)置為115200波特。運(yùn)氣好的話,您應(yīng)該會看到一些距離測量值以很高的速度發(fā)送回給您。您可能會發(fā)現(xiàn)1或2厘米的差異,但這很好。嘗試將手放在傳感器的前面,上下移動以觀察變化的讀數(shù)。
代碼應(yīng)該很容易理解。開始時有一些相關(guān)引腳的聲明,包括最大距離-這可能取決于您使用的確切傳感器,但是只要您能夠準(zhǔn)確獲得小于1米的讀數(shù),就可以了。
在此測試應(yīng)用程序的循環(huán)中,我們使用 ping()函數(shù)發(fā)出聲納ping,以毫秒為單位取回該值花費(fèi)了多長時間的值返回。為此,我們使用以 US_ROUNDTRIP_CM 常量構(gòu)建的NewPing庫,該庫定義移動一厘米需要多少微秒。兩次ping之間還存在50毫秒的延遲,以避免傳感器過載。
壓電式警報
壓電晶體傳感器是一種簡單且便宜的蜂鳴器,我們可以使用PWM引腳3發(fā)出不同的音調(diào)。將一根導(dǎo)線連接到引腳3,將一根導(dǎo)線連接到接地導(dǎo)軌–沒關(guān)系。
使用此代碼進(jìn)行測試。
殺死相當(dāng)討厭且響亮的警報的唯一方法是拔插頭。該代碼解釋起來有些復(fù)雜,但是它涉及使用正弦波來產(chǎn)生獨(dú)特的聲音。調(diào)整數(shù)字以使用不同的音調(diào)。
編碼警報系統(tǒng)
現(xiàn)在我們已經(jīng)擁有了拼圖的所有內(nèi)容,讓我們將它們組合在一起。
繼續(xù)制作一個新的草圖,稱為警報。首先將到目前為止在測試示例中使用的所有變量和引腳定義進(jìn)行組合。
#include
// Select which PWM-capable pins are to be used.
#define RED_PIN 10
#define GREEN_PIN 11
#define BLUE_PIN 9
#define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters)。
#define ALARM 3
float sinVal;
int toneVal;
首先編寫基本的 setup()功能–我們現(xiàn)在只處理燈光。我在主循環(huán)開始前添加了5秒的延遲,以便在需要時給我們一些時間。
void setup(){
//set pinModes for RGB strip
pinMode(RED_PIN,OUTPUT);
pinMode(BLUE_PIN,OUTPUT);
pinMode(GREEN_PIN,OUTPUT);
//reset lights
analogWrite(RED_PIN,0);
analogWrite(BLUE_PIN,0);
analogWrite(RED_PIN,0);
delay(5000);
}
讓我們使用一個幫助函數(shù)
//helper function enabling us to send a colour in one command
void color (unsigned char red, unsigned char green, unsigned char blue) // the color generating function
{
analogWrite(RED_PIN, red);
analogWrite(BLUE_PIN, blue);
analogWrite(GREEN_PIN, green);
}
最后,我們的循環(huán)現(xiàn)在將由紅色和黃色之間的簡單彩色閃光組成(或者,無論您希望發(fā)出什么警報,只需更改RGB值即可。
void loop(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yellow
delay(100);
}
上傳并測試以確保您處在正確的軌道上。
現(xiàn)在,讓我們集成距離傳感器,以便僅在有物體進(jìn)入(例如50厘米)(剛好小于門框的寬度)時才觸發(fā)那些燈。我們已經(jīng)定義了正確的引腳并導(dǎo)入了庫,因此在您的 setup()函數(shù)之前,添加以下行以對其進(jìn)行實(shí)例化:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
在此之下,添加一個變量以存儲是否觸發(fā)警報,當(dāng)然默認(rèn)為false。
boolean triggered = false;
在 setup()函數(shù),以便我們可以監(jiān)視串行輸出和調(diào)試。
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
接下來,讓我們將當(dāng)前循環(huán)重命名為 alarm() –如果警報已觸發(fā),將調(diào)用此名稱。
void alarm(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yelow
delay(100);
}
現(xiàn)在創(chuàng)建一個新的 loop()函數(shù),一個
void loop(){
if(triggered == true){
alarm();
}
else{
delay(50);// Wait 50ms between pings (about 20 pings/sec)。 29ms should be the shortest delay between pings.
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS)。
unsigned int distance = uS / US_ROUNDTRIP_CM;
Serial.println(distance);
if(distance 《 100){
triggered = true;
}
}
}
在其中,我們獲取一個新的ping命令,讀取結(jié)果,并在出現(xiàn)警報的情況下觸發(fā)警報。 p》
首先檢查是否已觸發(fā)警報,如果已觸發(fā),則關(guān)閉警報功能(此時僅閃爍指示燈)。
如果未觸發(fā)但是,仍要從傳感器獲取當(dāng)前讀數(shù)。
如果傳感器的讀數(shù)小于100厘米,則說明光束已被填充(顯然,如果觸發(fā)時間過早,請調(diào)整此值)。
在添加煩人的壓電蜂鳴器之前,請立即試用。
工作嗎?大。現(xiàn)在讓我們重新添加蜂鳴器。將 pinMode 添加到 setup()例程中。
pinMode(ALARM, OUTPUT);
然后將壓電蜂鳴器循環(huán)添加到alarm()函數(shù):
for (int x=0; x《180; x++) {
// convert degrees to radians then obtain sin value
sinVal = (sin(x*(3.1412/180)));
// generate a frequency from the sin value
toneVal = 2000+(int(sinVal*1000));
tone(ALARM, toneVal);
}
如果此時嘗試進(jìn)行編譯,則會遇到錯誤-我故意將其保留,以便您可以看到一些常見的錯誤問題。在這種情況下,NewPing庫和標(biāo)準(zhǔn)音調(diào)庫都使用相同的中斷-它們基本上是沖突的,因此您無法做很多修復(fù)。哦,親愛的。
不過不用擔(dān)心。這是一個常見問題,已經(jīng)有人解決了,請下載此NewTone并將其添加到Arduino Libraries文件夾中。調(diào)整程序的開頭以包括以下內(nèi)容:
#include
,并調(diào)整以下行:
tone(ALARM, toneVal);
至
NewTone(ALARM, toneVal);
。
就是這樣。將警報設(shè)置在臥室的門口,以防下一個不幸的竊賊。
或者是一只狗,看起來好像完全沒被警報嚇到。
遇到麻煩了代碼?這是完整的應(yīng)用程序。如果您遇到隨機(jī)錯誤,請嘗試將其粘貼在下面,我會幫忙看看。
責(zé)任編輯:wv
-
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187604
發(fā)布評論請先 登錄
相關(guān)推薦
評論