Изучаем Arduino: инструметы и методы технического волшебства - [74]

Шрифт
Интервал

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

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

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

// RTC - стандартные I>2C контакты

const int CS_PIN =10;

const int SD_POW_PIN =8;

const int RTC_POW_PIN =A3;

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. Монтажная схема регистратора

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

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