const int RTC_GND_PIN =А2.;
// Скорость опроса по умолчанию 5 секунд
int refresh rate = 5000;
// Создание объекта RTC
RTC_DS1307 RTC;
// Переменные для даты и времени
String year, month, day, hour, minute, second, time, date;
void setup()
{
Serial.begin(9600);
Serial.println(F("Initializing Card"));
// Настроить контакты CS и питания как выходы
pinMode(CS_PIN, OUTPUT);
- 293 -
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-карты
if ( !SD.begin(CS_PIN))
{
Serial.println(F("Card Failure"));
return;
}
Serial.println(F("Card Ready"));
// Чтение конфигурационного файла (speed. txt)
File commandFile = SD.open("speed.txt");
if (commandFile)
{
Serial.println ( F ( "Reading Command File") );
while(commandFile.available())
{
refresh_rate = commandFile.parseInt();
}
Serial.print(F("Refresh Rate = "));
Serial.print(refresh_rate);
Serial.println(F("ms"));
commandFile.close();
}
else
{
Serial.println(F("Could not read command file."));
return;
}
// Запись заголовка
File dataFile = SD.open("log.csv", FILE_WRITE);
if (dataFile)
{
dataFile.println ( F ( "\nNew Log Started ! ") );
- 294 -
dataFile.println(F("Date,Time,Phrase"));
dataFile.close();
// Запись в последовательный порт
Serial.println(F("\nNew Log Started!"));
Serial.println(F("Date,Time,Phrase"));
}
else
{
Serial.println(F("Couldn't open log file"));
}
}
void loop()
{
// Получить значение даты и времени и перевести в строковые значения
DateTime datetime = RTC.now();
year = String(datetime.year(), DEC);
month = String(datetime.month(), DEC);
day = String(datetime.day(), DEC);
hour = String(datetime.hour(), DEC);
minute = String(datetime.minute(), DEC);
second = String(datetime.second(), DEC);
// Собрать строку текущей даты и времени
date = year + "/" + month + "/" + day;
time = hour + ":" + minute + ":" + second;
String dataString = "Hello There!";
// Открыть файл и записать значения
File dataFile = SD. open ( "log. csv", FILE_WRITE);
if (dataFile)
{
dataFile.print(date);
dataFile.print (F(", "));
dataFile.print(time);
dataFile.print(F(","));
dataFile.println(dataString);
dataFile.close();
// Вывод в последовательный порт для отладки
Serial.print(date);
Serial.print(F(","));
Serial.print(time);
Serial.print(F(","));
Serial.println(dataString);
}
else
{
Serial.println(F("Couldn't open log file"));
}
delay(refresh_rate);
}
- 295 -
Библиотека RTC импортируется в код строкой #include "RTClib.h" и создается объект RTC_DS1307 RTC. RTC является I 2C-устройством, поэтому необходимо подключение библиотеки Wire, с которой мы знакомы из главы 8. В секции setup() функция RTC.isrunning() проверяет, запущена ли микросхема RTC. Если нет, то в микросхему записываются данные с часов компьютера, полученные при компиляции. После установки времени оно не сбрасывается, пока микросхема RTC подключена к батарее. В функции setup() в лог-файл записывается заголовок столбца, чтобы отслеживать моменты перезагрузки системы регистрации.
Во время цикла loop() инициализируем объект DataTime текущими значениями даты и времени из RTC. Из объекта DateTime извлекаем значения года, месяца, дня, часа, минуты, секунды, конвертируем их в строки и объединяем строки в общую строку для представления даты и времени. Эти данные записываются в лог-файл и выводятся в последовательный порт.
Через некоторое время извлечем карту памяти и прочитаем лог-файл на компьютере в программе просмотра электронных таблиц. Таблица должна выглядеть так, как на рис. 13.21.
Рис. 13.21. Содержимое лог-файла в программе просмотра электронных таблиц
13.4. Регистратор прохода через дверь
Теперь можно приступить к созданию входного регистратора для вашей комнаты.
Отслеживать моменты прохода людей через дверь будем с помощью датчика расстояния. Регистратор будет фиксировать эти события и записывать в лог-файл на SD-карту для последующего просмотра на компьютере.
- 296 -
13.4.1. Схема регистратора
Все, что нужно сделать, - это добавить аналоговый датчик расстояния к существующей схеме. Если вы используете те же модули, как и я, не потребуется даже макетная плата. Просто подключите соответствующие контакты к земле, питанию и аналоговому входу A0. Монтажная схема приведена на рис. 13.22.
Рис. 13.22. Монтажная схема регистратора
Для того чтобы система работала стабильно, необходимо установить ИК-датчик расстояния так, чтобы луч датчика шел горизонтально вдоль всей двери. Тогда при проходе через дверь человек обязательно окажется в зоне действия датчика.
Читать дальше