我使用运动检测传感器创建了一个闹钟,这样您就不能只是按下贪睡按钮并重新入睡。
因为有时候早上起床很困难,所以我决定做一个闹钟,它真的能让你起床。这个想法是使用运动传感器,以便闹钟知道您在按下贪睡按钮后是否回到床上。如果是这种情况,警报将再次响起。否则,如果您起床时间足够长(例如 2 分钟),闹钟将不再响起。在此期间,您必须大约在传感器前面(几米内),您已经可以开始您的早晨例行程序。
构建
对于这个项目,我们需要一个时钟模块、一个运动传感器、一个蜂鸣器、一个小按钮和一个 Arduino。
连接:
蜂鸣器的负极-〉 GND
正蜂鸣器引脚-〉 D11
按钮引脚-〉 GND
另一个按钮引脚-〉 D9
运动传感器 VCC --〉 5V
运动传感器输出 --〉 D7
运动传感器 GND --〉 GND
时钟模块 GND --〉 GND
时钟模块 VCC --〉 5V
时钟模块 SDA --〉 SDA(Mega2560 的引脚 20)
时钟模块 SCL --〉 SCL(Mega2560 的引脚 21)
接线后:
代码
首先,您需要从本文下方下载时钟模块的库文件。如果您在将文件添加到库时遇到困难,可以按照代码部分中的说明进行操作。
现在您可以从软件部分上传代码。上传代码后,您必须注释掉该行:
clock.setDateTIme(__DATE__, __TIME__);
该行在设置函数中。
现在你应该直接重新上传代码。
如果不注释掉,每次重置板子时,时钟模块中的时间都会重置为上次上传的时间。
之后,您可以设置闹钟响起的时间。您可以设置一天中的小时和分钟:
//--------------------------------------
int set_hour = 6;
int set_minute = 55;
//--------------------------------------
现在闹钟每天都会在这个时候响起。也可以编辑代码,以便您可以在周末或其他日子有不同的时间。
现在如果你给闹钟供电,它会等到设定的时间。然后将执行alarm() 函数。起初,它会开始发出哔哔声,直到您按下贪睡按钮。之后,运动传感器会查看前面是否有人。您必须在给定时间段内处于传感器前面,并且您还必须移动一点,以便触发运动传感器。如果您在运动传感器的视野内保持足够长的时间,将会有一个短促的蜂鸣信号告诉您警报现在已在当天禁用,它将等到第二天早上。
但是,如果您在按下按钮后的时间内回到床上,警报将响起,整个过程将重新开始。所以这个闹钟可以确保你不只是关掉闹钟然后回到床上。希望在您站在传感器前之后,您已经足够清醒,不会再上床睡觉了。
在此行中,您可以调整必须在传感器前面的时间(以分钟为单位):
if(abs(dt.minute - minute) 〉= 1){ //set the TIme period where you must //be in
传感器调整
运动传感器需要进行一些调整才能正常工作。首先,我们必须将触发器选择跳线放置在正确的位置。它需要处于可重复触发模式!
现在您还必须调整时间延迟和灵敏度。对我来说,当我将灵敏度设置为最大值并且时间延迟略高于最小值时,它的效果最好。时间延迟决定了在最后一次检测到一个人之后多长时间输出为高电平。如果延迟太短,那么很难防止警报再次响起,因为传感器不会总是检测到您。另一方面,如果延迟时间过长,那么如果您再次上床睡觉,警报器将不会注意到。
焊接
经过一些测试,我们准备让这个闹钟更为紧凑。为此,我使用 Arduino Nano Every,但您也可以使用几乎任何其他 Arduino 板。
我们首先根据第二个原理图将所有东西焊接在一起(它与之前基本相同,只是没有面包板)。
在测试一切是否仍然正常之后,我们可以为闹钟构建一个案例。我决定用 3 毫米轻木制作外壳,因为它很容易使用。以下是构建案例过程的几张图片。我的箱子的尺寸是 55mm x 35mm x 40mm。
我为运动传感器凿了一个大洞,还有一个微型 USB 电缆的插槽和一个扬声器的开口。
完成后的闹钟:
闹钟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);
}