Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства
- Название:Изучаем Arduino: инструметы и методы технического волшебства
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2015
- Город:Санкт-Петербург
- ISBN:978-5-9775-3585-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства краткое содержание
Для радиолюбителей
Изучаем Arduino: инструметы и методы технического волшебства - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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 -
Все, что нужно сделать, - это добавить аналоговый датчик расстояния к существующей схеме. Если вы используете те же модули, как и я, не потребуется даже макетная плата. Просто подключите соответствующие контакты к земле, питанию и аналоговому входу A0. Монтажная схема приведена на рис. 13.22.

Рис. 13.22. Монтажная схема регистратора
Для того чтобы система работала стабильно, необходимо установить ИК-датчик расстояния так, чтобы луч датчика шел горизонтально вдоль всей двери. Тогда при проходе через дверь человек обязательно окажется в зоне действия датчика.
ИК-датчик расстояния и плату Arduino на время тестирования программы можно прикрепить к стене с помощью липкой ленты (рис. 13.23 ).
Для нашего регистратора необязательно читать переменные с карты памяти, поэтому можно удалить данную часть кода. В программу необходимо добавить проверку
- 297 -

Рис. 13.23. Крепление блоков регистратора возле входной двери показаний ИК-датчика расстояния и определение величины их изменения за время между опросами. Если изменение есть, можно предположить, что кто-то вошел или вышел из комнаты. Нужно выбрать порог изменения аналоговых показаний датчика для точного определения факта прохода через дверь. Я экспериментально определил, что для моей установки изменение значения аналогового сигнала более чем на 75 единиц является достаточным признаком для фиксации движения (у вас, возможно, будет по-другому). Чтобы надежно установить момент прохода, необходимо проверять датчик достаточно часто.
Я рекомендую записывать данные на SD-карту только в момент появления человека, а в остальное время обновлять журнал лишь с определенной периодичностью.
При этом будет обеспечен хороший баланс между объемом хранимой информации и точностью работы. Плата Arduino опрашивает датчик расстояния через 50 мс (и добавляет единицу к текущему столбцу каждый раз при обнаружении движения). Если движение не обнаруживается, записываем ноль в текущий столбец через 1 секунду (в отличие от 50 мс).
В листинге 13.7 приведена программа входного регистратора, работающая согласно описанному алгоритму.
Листинг 13.7. Программа входного регистратора - entrance_logger.ino
// Программа входного регистратора
#include
// Подключение библиотеки SD
#include
// Для работы с RTC
#include "RTClib.h" // Подключение библиотеки RTC
- 298 -
// Подключение устройств SPI и I 2C с контактами по умолчанию
// SD-карта SPI контакты
// RTC - стандартные I 2C контакты
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
if ( !SD.begin(CS_PIN))
{
Serial.println(F("Card Failure"));
return;
}
- 299 -
Serial.println(F("Card Ready"));
// Запись заголовка
File dataFile = SD.open("log.csv", FILE_WRITE);
if (dataFile)
{
dataFile.println(F("\nNew Log Started!"));
dataFile.println(F("Date,Time,Raw,Active"));
dataFile.close();
// Запись в последовательный порт для отладки
Serial.println(F("\nNew Log Started!"));
Serial.println(F("Date,Tirne,Raw,Active"));
}
else
{
Serial.println(F("Couldn't open log file"));
}
}
void loop()
{
// Получить значение даты и времени и перевести в строковые значения
DateTirne datetirne = RTC.now();
year = String(datetirne.year(), DEC);
rnonth = String(datetime.rnonth(), DEC);
day = String(datetirne.day(), DEC);
hour = String(datetirne.hour(), DEC);
rninute = String(datetime.rninute(), DEC);
second = String(datetime.second(), DEC);
// Собрать строку текущей даты и времени
date = year + "/" + rnonth + "/" + day;
time = hour + ":" + rninute + "·" + second;
// Собрать данные движения
raw = analogRead(IR_PIN);
// При изменении значения более чем на 75 между показаниями
Читать дальшеИнтервал:
Закладка: