Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИПЛОМ ЗАХАРЧУК / 04_ПЗ_ДП1.docx
Скачиваний:
153
Добавлен:
16.02.2016
Размер:
1.17 Mб
Скачать

3.3 Опис роботи програмного забезпечення

#include <SPI.h> // стандартна в Arduino IDE бібліотека для роботи з SPI шиною.

#include <Servo.h> // стандартна в Arduino IDE бібліотека для управління сервомоторчиком

#include <MFRC522.h> // Хедер з однойменим класом для управління радіочастотною ідентифікацією.

// номери пінів управління радіочастотною ідентифікацією.

#define SS_PIN 10

#define RST_PIN 9

const int RGB_LED_PINUMBERS[] = { 5, 6, 7 }; // номери пінів-виходів для RGB-світлодіода

const int SERVO_PINUMBER = 3; // номери пінів управління сервомоторчиком

const int BUZZER_PINUMBER = 4; // номери пінів управління бузером

const int BUTTON_PINUMBER = 2; // номер входа, подключенний до кнопкі

const int NEW_CARD_CHECK_DELAY = 500; // затримка між перевірками піднесеній карти в мілісекундах

const int OPEN_CLOSE_DELAY = 3000; // затримка між відкриттям і закриттям

const byte tehUID[4] = { 0x33, 0xFF, 0x6B, 0x9A }; // tehUID карти, на яку реагуємо позитивно

bool buttonState = 0; // змінна для зберігання стану кнопки

enum States { // Стан контролера:

wait, check, open, close

}; States state; // поточний стан

bool rightCard; // Для запам'ятовування в циклі перевірки вірності карти, вірна вона

bool white; // Стан світлодіода (чи горить), поки перебуваємо в стані очікування карти

int pos = 0; // Положення ротора сервомотора (градуси)

Servo myservo; // Примірник Servo для управління сервомотором

MFRC522 mfrc522(SS_PIN, RST_PIN); // Примірник MFRC522 для управління РЧІ-рідером.

void setup() {

Serial.begin(9600); // Почати спілкування з компом по послідовному порту

SPI.begin(); // Ініціалізація SPI-шини.

mfrc522.PCD_Init(); // Ініціалізація РЧІ-читалки

myservo.attach(SERVO_PINUMBER); // Ініціалізація керуючого сервоприводом об'єкта із зазначеним піном для роботи

Serial.println("Scan PICC to see UID and type..."); // розмовляємо з портом, так.

white = false; // До початку роботи світлодіод не горить

state = wait; // Робота починається з стану очікування

// активуємо на вихід піни для RGB-лампочки:

pinMode(RGB_LED_PINUMBERS[0], OUTPUT); // red

pinMode(RGB_LED_PINUMBERS[1], OUTPUT); // green

pinMode(RGB_LED_PINUMBERS[2], OUTPUT); // blue

pinMode(BUZZER_PINUMBER, OUTPUT); // активуємо на вихід пін для гудка

pinMode(BUTTON_PINUMBER, INPUT); // активуємо пін на вхід, чекаємо кнопку}

void loop() {

switch (state){

case wait:

Waiting();

return;

case check:

Checking();

return;

case open:

Opening();

return;

case close:

Closing();

return;

}

}

void Waiting(){

delay(NEW_CARD_CHECK_DELAY);

/// мигаем белым:

if (!white){

digitalWrite(RGB_LED_PINUMBERS[0], HIGH); // запалюємо червоний

digitalWrite(RGB_LED_PINUMBERS[1], HIGH); // запалюємо зелений

digitalWrite(RGB_LED_PINUMBERS[2], HIGH); // запалюємо синій

white = true;

}

else{

digitalWrite(RGB_LED_PINUMBERS[0], LOW); // гасимо красний

digitalWrite(RGB_LED_PINUMBERS[1], LOW); // гасимо зелений

digitalWrite(RGB_LED_PINUMBERS[2], LOW); // гасимо синій

white = false;

}

// перевіряємо наявність нової карти:

if (mfrc522.PICC_IsNewCardPresent())

state = check;

// зчитуємо значення з входу кнопки

buttonState = digitalRead(BUTTON_PINUMBER);

// перевіряємо чи натиснута кнопка

// якщо натиснута, то buttonState будет HIGH:

if (buttonState == HIGH) {

state = open;

}

}

void Checking(){

// Жовтий:

digitalWrite(RGB_LED_PINUMBERS[0], HIGH); // запалюємо червоний

digitalWrite(RGB_LED_PINUMBERS[1], HIGH); // запалюємо зелений

digitalWrite(RGB_LED_PINUMBERS[2], LOW); // гасимо синій

// Прочитуємо UID однією з піднесеної карток

if (!mfrc522.PICC_ReadCardSerial()) {

return;

}

delay(500);

rightCard = true; // Забуваємо про попередню перевірку

// перевіряємо лічений UID:

for (byte i = 0; i < 4; i++) {

if (tehUID[i] != mfrc522.uid.uidByte[i])

rightCard = false;

}

if (rightCard)

state = open; // Відкриваємося, якщо та сама

else{

Serial.println("Unknown CARD.");

digitalWrite(5, HIGH); // запалюємо світлодіод

digitalWrite(6, LOW); // гасимо світлодіод

digitalWrite(7, LOW); // гасимо світлодіод

digitalWrite(4, HIGH);

//buzz(4, 7000, 2000); // buzz the buzzer on pin 4 at 2500Hz for 500 milliseconds

delay(2000); // wait a bit between buzzes

digitalWrite(4, LOW);

state = wait; // Чекаємо іншу, якщо ні

}

}

void Opening(){

Serial.println("OPEN");

digitalWrite(RGB_LED_PINUMBERS[0], LOW);

digitalWrite(RGB_LED_PINUMBERS[1], HIGH); // Зеленим

digitalWrite(RGB_LED_PINUMBERS[2], LOW);

delay(500); // імітуємо активну діяльність. Зчитування відбувається набагато швидше. Ця затримка створена для краси презентації.

ServoOpen();

state = close;

}

void Closing(){

delay(OPEN_CLOSE_DELAY);

digitalWrite(RGB_LED_PINUMBERS[1], LOW);

ServoClose();

state = wait;

}

// Дві процидурку повороту ротора серви на 180:

void ServoOpen(){

for (pos = 0; pos <= 180; pos += 1){ // Крутимо з нульового положення на протилежне по одному градусу

myservo.write(pos); // Говоримо серве рухатися на градус далі

delay(15); // 15мс чекаємо завершення повороту

}

}

void ServoClose(){

for (pos = 180; pos >= 0; pos -= 1){

myservo.write(pos);

delay(15);

}

}