我使用運動檢測傳感器創(chuàng)建了一個鬧鐘,這樣您就不能只是按下貪睡按鈕并重新入睡。
因為有時候早上起床很困難,所以我決定做一個鬧鐘,它真的能讓你起床。這個想法是使用運動傳感器,以便鬧鐘知道您在按下貪睡按鈕后是否回到床上。如果是這種情況,警報將再次響起。否則,如果您起床時間足夠長(例如 2 分鐘),鬧鐘將不再響起。在此期間,您必須大約在傳感器前面(幾米內(nèi)),您已經(jīng)可以開始您的早晨例行程序。
構(gòu)建
對于這個項目,我們需要一個時鐘模塊、一個運動傳感器、一個蜂鳴器、一個小按鈕和一個 Arduino。
連接:
蜂鳴器的負(fù)極-〉 GND
正蜂鳴器引腳-〉 D11
按鈕引腳-〉 GND
另一個按鈕引腳-〉 D9
運動傳感器 VCC --〉 5V
運動傳感器輸出 --〉 D7
運動傳感器 GND --〉 GND
時鐘模塊 GND --〉 GND
時鐘模塊 VCC --〉 5V
時鐘模塊 SDA --〉 SDA(Mega2560 的引腳 20)
時鐘模塊 SCL --〉 SCL(Mega2560 的引腳 21)
接線后:
代碼
首先,您需要從本文下方下載時鐘模塊的庫文件。如果您在將文件添加到庫時遇到困難,可以按照代碼部分中的說明進(jìn)行操作。
現(xiàn)在您可以從軟件部分上傳代碼。上傳代碼后,您必須注釋掉該行:
clock.setDateTime(__DATE__, __TIME__);
該行在設(shè)置函數(shù)中。
現(xiàn)在你應(yīng)該直接重新上傳代碼。
如果不注釋掉,每次重置板子時,時鐘模塊中的時間都會重置為上次上傳的時間。
之后,您可以設(shè)置鬧鐘響起的時間。您可以設(shè)置一天中的小時和分鐘:
//--------------------------------------
int set_hour = 6;
int set_minute = 55;
//--------------------------------------
現(xiàn)在鬧鐘每天都會在這個時候響起。也可以編輯代碼,以便您可以在周末或其他日子有不同的時間。
現(xiàn)在如果你給鬧鐘供電,它會等到設(shè)定的時間。然后將執(zhí)行alarm() 函數(shù)。起初,它會開始發(fā)出嗶嗶聲,直到您按下貪睡按鈕。之后,運動傳感器會查看前面是否有人。您必須在給定時間段內(nèi)處于傳感器前面,并且您還必須移動一點,以便觸發(fā)運動傳感器。如果您在運動傳感器的視野內(nèi)保持足夠長的時間,將會有一個短促的蜂鳴信號告訴您警報現(xiàn)在已在當(dāng)天禁用,它將等到第二天早上。
但是,如果您在按下按鈕后的時間內(nèi)回到床上,警報將響起,整個過程將重新開始。所以這個鬧鐘可以確保你不只是關(guān)掉鬧鐘然后回到床上。希望在您站在傳感器前之后,您已經(jīng)足夠清醒,不會再上床睡覺了。
在此行中,您可以調(diào)整必須在傳感器前面的時間(以分鐘為單位):
if(abs(dt.minute - minute) 〉= 1){ //set the time period where you must //be in
傳感器調(diào)整
運動傳感器需要進(jìn)行一些調(diào)整才能正常工作。首先,我們必須將觸發(fā)器選擇跳線放置在正確的位置。它需要處于可重復(fù)觸發(fā)模式!
現(xiàn)在您還必須調(diào)整時間延遲和靈敏度。對我來說,當(dāng)我將靈敏度設(shè)置為最大值并且時間延遲略高于最小值時,它的效果最好。時間延遲決定了在最后一次檢測到一個人之后多長時間輸出為高電平。如果延遲太短,那么很難防止警報再次響起,因為傳感器不會總是檢測到您。另一方面,如果延遲時間過長,那么如果您再次上床睡覺,警報器將不會注意到。
焊接
經(jīng)過一些測試,我們準(zhǔn)備讓這個鬧鐘更為緊湊。為此,我使用 Arduino Nano Every,但您也可以使用幾乎任何其他 Arduino 板。
我們首先根據(jù)第二個原理圖將所有東西焊接在一起(它與之前基本相同,只是沒有面包板)。
在測試一切是否仍然正常之后,我們可以為鬧鐘構(gòu)建一個案例。我決定用 3 毫米輕木制作外殼,因為它很容易使用。以下是構(gòu)建案例過程的幾張圖片。我的箱子的尺寸是 55mm x 35mm x 40mm。
我為運動傳感器鑿了一個大洞,還有一個微型 USB 電纜的插槽和一個揚(yáng)聲器的開口。
完成后的鬧鐘:
鬧鐘Arduino代碼:
#include
#include
DS3231 clock;
RTCDateTime dt;
int button = 9;
int pirPin = 7; // Input for HC-S501
int pirValue; // Place to store read PIR Value
//--------------------------------------
int set_hour = 7;
int set_minute = 0;
//--------------------------------------
void setup() {
? clock.begin();
? pinMode(button, INPUT_PULLUP);
? pinMode(LED_BUILTIN, OUTPUT);
? //clock.setDateTime(__DATE__, __TIME__); // !!AFTER THE FIRST UPLOAD YOU HAVE TO COMMENT OUT THIS LINE. OTHERWISE YOU WILL GET A WRONG TIME!!
? pinMode(pirPin, INPUT);
}
void alarm(int minute){
? bool button_pressed = false;
? bool awake = false;
? bool movement = false;
??
? while(!button_pressed){ ? ? //the alarm is on as long the button isn't pressed
? ? for(int i = 0; i < 4; i++){
? ? ? tone(11, 523, 100);
? ? ? delay(100);
? ? ? tone(11, 784, 50);
? ? ? for(int i = 0; i < 20; i++){
? ? ? ? if(digitalRead(button) == LOW){
? ? ? ? button_pressed = true;
? ? ? ? awake = true;
? ? ? ? dt = clock.getDateTime();
? ? ? ? minute = dt.minute;
? ? ? ? }
? ? ? ? delay(65);
? ? ? }
? ? }
? }
? dt = clock.getDateTime();
? minute = dt.minute;
? while(awake){
? ? movement = false;
? ? dt = clock.getDateTime();
? ? for(int i = 0; i < 30; i++){
? ? ? if(digitalRead(pirPin)){movement = true;}
? ? }
? ? digitalWrite(LED_BUILTIN, movement);
? ? if(!pirValue){
? ? ? delay(5000);
? ? ? for(int i = 0; i < 40; i++){
? ? ? ? if(digitalRead(pirPin)){movement = true;}
? ? ? }
? ? ? if(!movement){
? ? ? ? alarm(minute); //if no motion is detected for too long the alarm resets
? ? ? }
? ? }
? ? if(abs(dt.minute - minute) >= 1){ //set the time period where you must be in front of the sensor
? ? ? tone(11, 698, 50);
? ? ? delay(100);
? ? ? tone(11, 698, 50);
? ? ? digitalWrite(LED_BUILTIN, 0);
? ? ? awake = false;
? ? }
? ? delay(100);
? }
}
?
void loop() { ?
? dt = clock.getDateTime();
? if(set_minute == dt.minute && set_hour == dt.hour){
? ? alarm(set_minute);
? }
? delay(10000);
}
評論
查看更多