Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Умные будильники с датчиком движения: гарантированное пробуждение

Компоненты и материалы

Arduino Nano Every ×1
Модуль часов реального времени DS3231 ×1
PIR-датчик движения HC-SR501 ×1
Пьезо-зумер (5 В) ×1

Программное обеспечение

О проекте

Встать с кровати может быть настоящим вызовом. Этот будильник с датчиком движения заставляет вас оставаться бодрствующим, фиксируя активность после нажатия «Спящий режим». Если вы ляжете обратно — будильник сработает снова, заставляя проснуться на заданный период.

Сборка

Соберите следующие компоненты:

Умные будильники с датчиком движения: гарантированное пробуждение
Компоненты на макетной плате перед сборкой

Подключение:

Умные будильники с датчиком движения: гарантированное пробуждение
Проводка на макетной плате

Код

Скачайте библиотеку 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);
}

Настройка датчика

Умные будильники с датчиком движения: гарантированное пробуждение
Установка перемычки в режим повторного срабатывания
Умные будильники с датчиком движения: гарантированное пробуждение
Регуляторы задержки (Delay) и чувствительности (Sensitivity)

Переведите HC-SR501 в режим повторного срабатывания (repeatable trigger) перемычкой.

Умные будильники с датчиком движения: гарантированное пробуждение
Максимальная чувствительность, минимальная задержка — оптимально для обнаружения возвращения в кровать

Тонко настройте задержку и чувствительность. Максимальная чувствительность с минимальной задержкой работает лучше всего: датчик достаточно долго остаётся активным, чтобы вас засечь, но не так долго, чтобы игнорировать возврат в кровать.

Компактная сборка

После тестирования на макетке припаяйте компоненты прямо к Arduino Nano Every для создания карманного будильника.

Умные будильники с датчиком движения: гарантированное пробуждение
Компактная плата с припаянными компонентами

Корпус из 3-мм бальзы (55×35×40 мм) с большим окном для PIR, разъёмом для micro-USB и отверстием для зумера.

Умные будильники с датчиком движения: гарантированное пробуждение
Корпус: отверстие для PIR-датчика
Умные будильники с датчиком движения: гарантированное пробуждение
Слот для micro-USB кабеля
Умные будильники с датчиком движения: гарантированное пробуждение
Отверстие для зумера
Умные будильники с датчиком движения: гарантированное пробуждение
Готовый будильник в корпусе

Итоговый продукт:

Умные будильники с датчиком движения: гарантированное пробуждение
Умные будильники с датчиком движения: гарантированное пробуждение
Умные будильники с датчиком движения: гарантированное пробуждение

Код

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 с отрицательной на макетке.

Умные будильники с датчиком движения: гарантированное пробуждение Умные будильники с датчиком движения: гарантированное пробуждение

Производственный процесс

  1. Революционная каршеринг-инициатива NEVS в Троллхеттане: новая эра мобильности
  2. Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код
  3. Начните путь в Индустрию 4.0: освойте IO-Link на ПЛК с обучением SICK
  4. Ключевые факторы успешной и безопасной штамповки
  5. Критические факторы, влияющие на производительность плоского шлифования
  6. ЦНЦ-токарные станки: ваш универсальный инструмент точной обработки
  7. Незаменимые горизонтально-шлифовальные центры для высокоточного производства
  8. Выбор идеального короткого бароавтомата для вашего токарного станка
  9. Главные преимущества расточных станков для точной обработки
  10. Влияние прямых водяных насосов на системы циркуляции