Arduino:Примеры/Регистратор прохода через дверь
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
![]() |
Черновик |
Содержание
Регистратор прохода через дверь
Данный пример демонстрирует создание регистратора прохода через дверь с использованием платы Arduino Uno, любой платы расширения(шилд), работающей с SD-картами или MicroSD-картами(Cooking HAcks Micro SD shiled, Arduino Wireless SD shiled, Arduino Ethernet SD shiled, Arduino Wi-Fi SD shield, Adafruit data logging shield, SparkFun MicroSD shield), любой платы расширения(шилд) RTC и ИК-датчика расстояния Sharp GP2Y0A41SK0F.
Необходимые компоненты
- Плата Arduino Uno, 1 шт.;
- Любая плата расширения(шилд), работающая с SD-картами или MicroSD-картами(Cooking HAcks Micro SD shiled, Arduino Wireless SD shiled, Arduino Ethernet SD shiled, Arduino Wi-Fi SD shield, Adafruit data logging shield, SparkFun MicroSD shield), 1 шт.;
- Любая плата расширения(шилд) RTC, 1 шт.;
- ИК-датчик расстояния Sharp GP2Y0A41SK0F, 1 шт.;
- Макетная плата;
- Провода перемычки;
Монтажная схема
Соедините выбранную вами плату расширения работающую с SD-картами или MicroSD-картами, плату расширения часов реального времени, ИК-датчик расстояния Sharp GP2Y0A41SK0F и плату Arduino Uno.
Для примеры мы взяли Arduino Ethernet SD shiled + Arduino Uno + Плата расширения RTC + ИК-датчик расстояния Sharp GP2Y0A41SK0F.
Код
1 #include <SD.h> // Подключаем библиотеку SD для работы с платой расширения, оснащенной SD-слотом
2 #include <Wire.h> // Подключаем библиотеку Wire для работы с I2C устройствами, в данном случае с платой расширения RTC
3 #include "RTClib.h" // Подключаем библиотеку RTClib
4
5 /*
6 Используемые по умолчанию контакты для библиотеки SD.
7 Если вы используете Arduino Ethernet SD shiled или любую
8 другую плату расширения использующую эти контакты,
9 то ничего менять не надо
10 MOSI = 11 контакт
11 MISO = 12 контакт
12 SCLK = 13 контакт
13 */
14
15 #define CS_PIN 10 // Контакт выбора
16 // Примечание: если вы используете Arduino Ethernet SD shiled
17 // необходимо изменить номер контакта на 4.
18 // Если ваша плата расширения использует другой контакт
19 // вам необходимо его изменить на правильный.
20
21 #define IR_PIN 0 // Датчик расстояния подключен к 0-му аналоговому входу
22
23 RTC_DS1307 RTC; // Объявляем RTC объект
24
25 String year, month, day, hour, minute, second, time, date; // Объявляем строковые переменный для хранения даты и времени
26
27 int raw = 0; // Текущее значение датчика расстояния
28 int raw_prev = 0; // Предыдущее значение датчика расстояния
29 boolean active = false; // Переменная для хранения значения активности датчика расстояния
30 int update_time = 0; // Счетчик для обновления
31
32 void setup()
33 {
34 Serial.begin(9600); // Инициализация последовательного соединения на скорости 9600 бод
35 Serial.println(F("Initializing Card")); // Распечатываем в мониторе последовательного порта "Initializing Card"("Инициализация карты")
36 pinMode(CS_PIN, OUTPUT); // Определяем CS(контакт выбора) контакт как выход
37
38 Wire.begin(); // Инициализация шины I2C
39 RTC.begin(); // Инициализация библиотеки RTC
40
41 // Если микросхема RTC не запущена, то записываем данные часов компьютера при компиляции в RTC
42 if (! RTC.isrunning())
43 {
44 Serial.println(F("RTC is NOT running!")); // Распечатываем в мониторе последовательного порта "RTC is NOT running!"("Микросхема RTC не запущена!")
45 RTC.adjust(DateTime(__DATE__, __TIME__));
46 }
47
48 // Инициализация SD-карты
49 if (!SD.begin(CS_PIN))
50 {
51 Serial.println(F("Card Failure")); // Распечатываем в мониторе последовательного порта "Card Failure"("Сбой подключения к SD-карте")
52 return; // Останавливаем выполнение программы
53 }
54 Serial.println(F("Card Ready")); // Распечатываем в мониторе последовательного порта "Card Ready"("Карта готова к работе")
55
56 // Открываем файл и создаем заголовки
57 File dataFile = SD.open("log.csv", FILE_WRITE);
58 if (dataFile)
59 {
60 dataFile.println(F("\nNew Log Started!"));
61 dataFile.println(F("Date,Time,Phrase"));
62 dataFile.close(); // Внимание! Данные не будут записаны, пока вы не закроете соединение!
63
64 // Распечатываем в мониторе последовательного порта те же данные для отладки
65 Serial.println(F("\nNew Log Started!")); // Распечатываем в мониторе последовательного порта "\nNew Log Started!"("Новый лог начат")
66 Serial.println(F("Date,Time,Phrase")); // Распечатываем в мониторе последовательного порта "Date,Time,Phrase"
67 }
68 else
69 {
70 Serial.println(F("Couldn't open log file")); // Распечатываем в мониторе последовательного порта "Couldn't open log file"("Не удалось открыть файл журнала")
71 }
72
73 }
74
75 void loop()
76 {
77 // Получаем текущую дату и время и сохраняем в строковых переменных
78 DateTime datetime = RTC.now();
79 year = String(datetime.year(), DEC);
80 month = String(datetime.month(), DEC);
81 day = String(datetime.day(), DEC);
82 hour = String(datetime.hour(), DEC);
83 minute = String(datetime.minute(), DEC);
84 second = String(datetime.second(), DEC);
85
86 // Объединяем строки для получения полной даты и времени
87 date = year + "/" + month + "/" + day;
88 time = hour + ":" + minute + ":" + second;
89
90 raw = analogRead(IR_PIN); // Счиитываем данные с датчика расстояния
91
92 // Если разница между текущим и предыдущим значением расстояния больше 75, то фиксируем проход через дверь
93 if (abs(raw -raw_prev) > 75)
94 active = true;
95 else
96 active = false;
97 raw_prev = raw;
98
99 // Открываем файл и записываем в него данные если есть факт прохода через дверь или значение счетчика равно 20
100 if (active || update_time == 20)
101 {
102 File dataFile = SD.open("log.csv", FILE_WRITE);
103 if (dataFile)
104 {
105 dataFile.print(date);
106 dataFile.print(F(","));
107 dataFile.print(time);
108 dataFile.print(F(","));
109 dataFile.print(raw);
110 dataFile.print(F(","));
111 dataFile.println(active);
112 dataFile.close(); // Внимание! Данные не будут записаны, пока вы не закроете соединение!
113
114 // Распечатываем в мониторе последовательного порта те же данные для отладки
115 Serial.print(date);
116 Serial.print(F(","));
117 Serial.print(time);
118 Serial.print(F(","));
119 Serial.print(raw);
120 Serial.print(F(","));
121 Serial.println(active);
122 }
123 else
124 {
125 Serial.println(F("Couldn't open log file")); // Распечатываем в мониторе последовательного порта "Couldn't open log file"("Не удалось открыть файл журнала")
126 }
127 update_time = 0; // Обнуляем счетчик
128 }
129 delay(50); // Задержка 50 мс.
130 update_time++; // Инструментируем счетчик
131 }
См.также
Внешние ссылки