Выбрать главу

Во время цикла loop() инициализируем объект DataTime текущими значениями даты и времени из RTC. Из объекта DateTime извлекаем значения года, месяца, дня, часа, минуты, секунды, конвертируем их в строки и объединяем строки в общую строку для представления даты и времени. Эти данные записываются в лог-файл и выводятся в последовательный порт.

Через некоторое время извлечем карту памяти и прочитаем лог-файл на компьютере в программе просмотра электронных таблиц. Таблица должна выглядеть так, как на рис. 13.21.

Рис. 13.21. Содержимое лог-файла в программе просмотра электронных таблиц

13.4. Регистратор прохода через дверь

Теперь можно приступить к созданию входного регистратора для вашей комнаты.

Отслеживать моменты прохода людей через дверь будем с помощью датчика расстояния. Регистратор будет фиксировать эти события и записывать в лог-файл на SD-карту для последующего просмотра на компьютере.

- 296 -

13.4.1. Схема регистратора

Все, что нужно сделать, - это добавить аналоговый датчик расстояния к существующей схеме. Если вы используете те же модули, как и я, не потребуется даже макетная плата. Просто подключите соответствующие контакты к земле, питанию и аналоговому входу A0. Монтажная схема приведена на рис. 13.22.

Рис. 13.22. Монтажная схема регистратора

Для того чтобы система работала стабильно, необходимо установить ИК-датчик расстояния так, чтобы луч датчика шел горизонтально вдоль всей двери. Тогда при проходе через дверь человек обязательно окажется в зоне действия датчика.

ИК-датчик расстояния и плату Arduino на время тестирования программы можно прикрепить к стене с помощью липкой ленты (рис. 13.23 ).

13.4.2. Программа для регистратора

Для нашего регистратора необязательно читать переменные с карты памяти, поэтому можно удалить данную часть кода. В программу необходимо добавить проверку

- 297 -

Рис. 13.23. Крепление блоков регистратора возле входной двери показаний ИК-датчика расстояния и определение величины их изменения за время между опросами. Если изменение есть, можно предположить, что кто-то вошел или вышел из комнаты. Нужно выбрать порог изменения аналоговых показаний датчика для точного определения факта прохода через дверь. Я экспериментально определил, что для моей установки изменение значения аналогового сигнала более чем на 75 единиц является достаточным признаком для фиксации движения (у вас, возможно, будет по-другому). Чтобы надежно установить момент прохода, необходимо проверять датчик достаточно часто.

Я рекомендую записывать данные на SD-карту только в момент появления человека, а в остальное время обновлять журнал лишь с определенной периодичностью.

При этом будет обеспечен хороший баланс между объемом хранимой информации и точностью работы. Плата Arduino опрашивает датчик расстояния через 50 мс (и добавляет единицу к текущему столбцу каждый раз при обнаружении движения). Если движение не обнаруживается, записываем ноль в текущий столбец через 1 секунду (в отличие от 50 мс).

В листинге 13.7 приведена программа входного регистратора, работающая согласно описанному алгоритму.

Листинг 13.7. Программа входного регистратора - entrance_logger.ino

// Программа входного регистратора

#include <SD.h>

// Подключение библиотеки SD

#include <Wire.h>

// Для работы с RTC

#include "RTClib.h" // Подключение библиотеки RTC

- 298 -

// Подключение устройств SPI и I2C с контактами по умолчанию

// SD-карта SPI контакты

// RTC - стандартные I2C контакты

const int CS PIN=10;

// SS для переходника SD

const int SD_POW_PIN =8;

// Питание Для SD

const int RTC_POW_PIN =A3; // Питание для платы RTC

const int RTC_GND_PIN =А2.; // Земля для платы RTC

const int IR_PIN=0; // ИК-датчик расстояния к аналоговому входу A0

// Создать объект RTC

RTC_DS1307 RTC;

// Инициализация переменных для даты/времени

String year, month, day, hour, minute, second, time, date;

// Инициализация переменных для ИК-датчика расстояния

int raw = 0;

int raw_prev = 0;

boolean active = false;

int update_time = 0;

void setup()

{

Serial.begin(9600);

Serial.println(F("Initializing Card"));

// Настроить контакты CS и питания как выходы

pinMode(CS_PIN, OUTPUT);

pinMode(SD_POW_PIN, OUTPUT);

pinMode(RTC_POW_PIN, OUTPUT);

pinMode(RTC_GND_PIN, OUTPUT);

// Установка питания карты и RTC

digitalWrite(SD_POW_PIN, HIGH);

digitalWrite(RTC_POW_PIN, HIGH);

digitalWrite(RTC_GND_PIN, LOW);

// Инициализация Wire и RTC

Wire.begin();

RTC.begin();

// Если RTC не запущены, загрузить дату/время с компьютера

if ( ! RTC. isrunning())

{

Serial.println(F("RTC is NOT running!"));

RTC.adjust(DateTime(__DATE__, __TIME__));

}

// Инициализация карты SD