Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Регистратор прохода через дверь

Материал из Онлайн справочника
Перейти к: навигация, поиск

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


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

Данный пример демонстрирует создание регистратора прохода через дверь с использованием платы 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.

Необходимые компоненты

Монтажная схема

Соедините выбранную вами плату расширения работающую с SD-картами или MicroSD-картами, плату расширения часов реального времени, ИК-датчик расстояния Sharp GP2Y0A41SK0F и плату Arduino Uno.

Для примеры мы взяли Arduino Ethernet SD shiled + Arduino Uno + Плата расширения RTC + ИК-датчик расстояния Sharp GP2Y0A41SK0F.

Arduino uno ethernet shield rtc ir sensor 1.png

Код

  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. }

См.также

Внешние ссылки