Умные будильники с датчиком движения: гарантированное пробуждение
Компоненты и материалы
| Arduino Nano Every | ×1 |
| Модуль часов реального времени DS3231 | ×1 |
| PIR-датчик движения HC-SR501 | ×1 |
| Пьезо-зумер (5 В) | ×1 |
Программное обеспечение
- Arduino IDE
О проекте
Встать с кровати может быть настоящим вызовом. Этот будильник с датчиком движения заставляет вас оставаться бодрствующим, фиксируя активность после нажатия «Спящий режим». Если вы ляжете обратно — будильник сработает снова, заставляя проснуться на заданный период.
Сборка
Соберите следующие компоненты:
- Модуль RTC DS3231
- PIR-датчик HC-SR501
- Зумер (любой 5-вольтовый пьезо)
- Тактильная кнопка
- Arduino Nano Every (или совместимая плата)
Подключение:
- Зумер «-» → GND
- Зумер «+» → D11
- Кнопка GND → GND
- Кнопка сигнал → D9
- HC-SR501 VCC → 5V
- HC-SR501 OUT → D7
- HC-SR501 GND → GND
- DS3231 GND → GND
- DS3231 VCC → 5V
- DS3231 SDA → SDA (A4 на Nano)
- DS3231 SCL → SCL (A5 на Nano)
Код
Скачайте библиотеку DS3231 (ZIP) из раздела Code и добавьте в Arduino IDE: Sketch → Include Library → Add .ZIP Library.
Загрузите следующий скетч. После первой загрузки закомментируйте строку установки даты и времени, чтобы RTC сохранял корректное время при сбросах.
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
int button = 9;
int pirPin = 7; // Вход HC-SR501
int pirValue;
//--------------------------------------
int set_hour = 7;
int set_minute = 0;
//--------------------------------------
void setup() {
clock.begin();
pinMode(button, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
// clock.setDateTime(__DATE__, __TIME__); // закомментировать после первой загрузки
pinMode(pirPin, INPUT);
}
void alarm(int minute){
bool button_pressed = false;
bool awake = false;
bool movement = false;
while(!button_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(abs(dt.minute - minute) >= 1){
// заданный период, в течение которого нужно быть перед датчиком
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);
}
Настройка датчика
Переведите HC-SR501 в режим повторного срабатывания (repeatable trigger) перемычкой.
Тонко настройте задержку и чувствительность. Максимальная чувствительность с минимальной задержкой работает лучше всего: датчик достаточно долго остаётся активным, чтобы вас засечь, но не так долго, чтобы игнорировать возврат в кровать.
Компактная сборка
После тестирования на макетке припаяйте компоненты прямо к Arduino Nano Every для создания карманного будильника.
Корпус из 3-мм бальзы (55×35×40 мм) с большим окном для PIR, разъёмом для micro-USB и отверстием для зумера.
Итоговый продукт:
Код
- Arduino-скетч будильника
- Библиотека DS3231 (ZIP)
Arduino-скетч будильника
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
int button = 9;
int pirPin = 7; // Вход для HC-SR501
int pirValue; // Место для хранения прочитанного значения PIR
//--------------------------------------
int set_hour = 7;
int set_minute = 0;
//--------------------------------------
void setup() {
clock.begin();
pinMode(button, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
// clock.setDateTime(__DATE__, __TIME__); // !!ПОСЛЕ ПЕРВОЙ ЗАГРУЗКИ ЗАКОММЕНТИРУЙТЕ ЭТУ СТРОКУ. ИНАЧЕ ВРЕМЯ БУДЕТ НЕВЕРНЫМ!!
pinMode(pirPin, INPUT);
}
void alarm(int minute){
bool button_pressed = false;
bool awake = false;
bool movement = false;
while(!button_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(abs(dt.minute - minute) >= 1){
// период, в течение которого вы должны быть перед датчиком
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);
}
Библиотека часов (DS3231)
ZIP-файл библиотеки DS3231. Скачайте и добавьте через Arduino → Sketch → Include Library → Add .ZIP Library.
Предпросмотр недоступен (только скачивание).
Схемы
Соедините 5V Arduino с положительной шиной и GND с отрицательной на макетке.
Производственный процесс
- Революционная каршеринг-инициатива NEVS в Троллхеттане: новая эра мобильности
- Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код
- Начните путь в Индустрию 4.0: освойте IO-Link на ПЛК с обучением SICK
- Ключевые факторы успешной и безопасной штамповки
- Критические факторы, влияющие на производительность плоского шлифования
- ЦНЦ-токарные станки: ваш универсальный инструмент точной обработки
- Незаменимые горизонтально-шлифовальные центры для высокоточного производства
- Выбор идеального короткого бароавтомата для вашего токарного станка
- Главные преимущества расточных станков для точной обработки
- Влияние прямых водяных насосов на системы циркуляции