我使用運(yùn)動(dòng)檢測(cè)傳感器創(chuàng)建了一個(gè)鬧鐘,這樣您就不能只是按下貪睡按鈕并重新入睡。
因?yàn)橛袝r(shí)候早上起床很困難,所以我決定做一個(gè)鬧鐘,它真的能讓你起床。這個(gè)想法是使用運(yùn)動(dòng)傳感器,以便鬧鐘知道您在按下貪睡按鈕后是否回到床上。如果是這種情況,警報(bào)將再次響起。否則,如果您起床時(shí)間足夠長(例如 2 分鐘),鬧鐘將不再響起。在此期間,您必須大約在傳感器前面(幾米內(nèi)),您已經(jīng)可以開始您的早晨例行程序。
構(gòu)建
對(duì)于這個(gè)項(xiàng)目,我們需要一個(gè)時(shí)鐘模塊、一個(gè)運(yùn)動(dòng)傳感器、一個(gè)蜂鳴器、一個(gè)小按鈕和一個(gè) Arduino。
連接:
蜂鳴器的負(fù)極-〉 GND
正蜂鳴器引腳-〉 D11
按鈕引腳-〉 GND
另一個(gè)按鈕引腳-〉 D9
運(yùn)動(dòng)傳感器 VCC --〉 5V
運(yùn)動(dòng)傳感器輸出 --〉 D7
運(yùn)動(dòng)傳感器 GND --〉 GND
時(shí)鐘模塊 GND --〉 GND
時(shí)鐘模塊 VCC --〉 5V
時(shí)鐘模塊 SDA --〉 SDA(Mega2560 的引腳 20)
時(shí)鐘模塊 SCL --〉 SCL(Mega2560 的引腳 21)
接線后:
代碼
首先,您需要從本文下方下載時(shí)鐘模塊的庫文件。如果您在將文件添加到庫時(shí)遇到困難,可以按照代碼部分中的說明進(jìn)行操作。
現(xiàn)在您可以從軟件部分上傳代碼。上傳代碼后,您必須注釋掉該行:
clock.setDateTime(__DATE__, __TIME__);
該行在設(shè)置函數(shù)中。
現(xiàn)在你應(yīng)該直接重新上傳代碼。
如果不注釋掉,每次重置板子時(shí),時(shí)鐘模塊中的時(shí)間都會(huì)重置為上次上傳的時(shí)間。
之后,您可以設(shè)置鬧鐘響起的時(shí)間。您可以設(shè)置一天中的小時(shí)和分鐘:
//--------------------------------------
int set_hour = 6;
int set_minute = 55;
//--------------------------------------
現(xiàn)在鬧鐘每天都會(huì)在這個(gè)時(shí)候響起。也可以編輯代碼,以便您可以在周末或其他日子有不同的時(shí)間。
現(xiàn)在如果你給鬧鐘供電,它會(huì)等到設(shè)定的時(shí)間。然后將執(zhí)行alarm() 函數(shù)。起初,它會(huì)開始發(fā)出嗶嗶聲,直到您按下貪睡按鈕。之后,運(yùn)動(dòng)傳感器會(huì)查看前面是否有人。您必須在給定時(shí)間段內(nèi)處于傳感器前面,并且您還必須移動(dòng)一點(diǎn),以便觸發(fā)運(yùn)動(dòng)傳感器。如果您在運(yùn)動(dòng)傳感器的視野內(nèi)保持足夠長的時(shí)間,將會(huì)有一個(gè)短促的蜂鳴信號(hào)告訴您警報(bào)現(xiàn)在已在當(dāng)天禁用,它將等到第二天早上。
但是,如果您在按下按鈕后的時(shí)間內(nèi)回到床上,警報(bào)將響起,整個(gè)過程將重新開始。所以這個(gè)鬧鐘可以確保你不只是關(guān)掉鬧鐘然后回到床上。希望在您站在傳感器前之后,您已經(jīng)足夠清醒,不會(huì)再上床睡覺了。
在此行中,您可以調(diào)整必須在傳感器前面的時(shí)間(以分鐘為單位):
if(abs(dt.minute - minute) 〉= 1){ //set the time period where you must //be in
傳感器調(diào)整
運(yùn)動(dòng)傳感器需要進(jìn)行一些調(diào)整才能正常工作。首先,我們必須將觸發(fā)器選擇跳線放置在正確的位置。它需要處于可重復(fù)觸發(fā)模式!
現(xiàn)在您還必須調(diào)整時(shí)間延遲和靈敏度。對(duì)我來說,當(dāng)我將靈敏度設(shè)置為最大值并且時(shí)間延遲略高于最小值時(shí),它的效果最好。時(shí)間延遲決定了在最后一次檢測(cè)到一個(gè)人之后多長時(shí)間輸出為高電平。如果延遲太短,那么很難防止警報(bào)再次響起,因?yàn)閭鞲衅鞑粫?huì)總是檢測(cè)到您。另一方面,如果延遲時(shí)間過長,那么如果您再次上床睡覺,警報(bào)器將不會(huì)注意到。
焊接
經(jīng)過一些測(cè)試,我們準(zhǔn)備讓這個(gè)鬧鐘更為緊湊。為此,我使用 Arduino Nano Every,但您也可以使用幾乎任何其他 Arduino 板。
我們首先根據(jù)第二個(gè)原理圖將所有東西焊接在一起(它與之前基本相同,只是沒有面包板)。
在測(cè)試一切是否仍然正常之后,我們可以為鬧鐘構(gòu)建一個(gè)案例。我決定用 3 毫米輕木制作外殼,因?yàn)樗苋菀资褂谩R韵率菢?gòu)建案例過程的幾張圖片。我的箱子的尺寸是 55mm x 35mm x 40mm。
我為運(yùn)動(dòng)傳感器鑿了一個(gè)大洞,還有一個(gè)微型 USB 電纜的插槽和一個(gè)揚(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);
}
評(píng)論