This repository has been archived by the owner on Feb 26, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcentral-car-lock-bluetooth.ino
137 lines (116 loc) · 5.25 KB
/
central-car-lock-bluetooth.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//*****************************************************************************
// File Name: central-car-lock-bluetooth.ino
// Author: Pavlo Novitskyi
// Project: Development of a car central lock based on the Bluetooth technology
// Compiler: Arduino IDE Ver 1.8.12 with ESP32 plugin
// Target: ESP32 Dev Module
//*****************************************************************************
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
class CarLockSystemCallbacks: public BLECharacteristicCallbacks {
private:
const int ON = LOW;
const int OFF = HIGH;
/*
Адреси виходів, що будуть контролювати процес роботи
*/
const int PERMISSION_RELAY = 25;
const int POLARITY_CHANGE_RELAY_1 = 26;
const int POLARITY_CHANGE_RELAY_2 = 27;
/*
Затримка, яка знадобиться для паузи між змінами положень реле
*/
const int SWITCHING_DELAY = 200;
/*
Конфігураційні ідентифікатори для функціонування Bluetooth
*/
const std::string BLUETOOTH_DEVICE_NAME = "Car Lock";
const std::string BLUETOOTH_SERVICE_UUID = "641862ac-9bdc-43d1-a2ba-2dca6d9ac892";
const std::string BLUETOOTH_CHARACTERISTIC_UUID = "e220ff7f-5d58-4dc6-929b-367de4026d32";
/*
Дані-тригери, на які відгукнеться контролер, щоб закрити чи
відкрити замок, якщо отримує ці символи за Bluetooth з'єднанням
*/
const std::string TURN_ON_TRIGGER = "ON";
const std::string TURN_OFF_TRIGGER = "OFF";
/*
Оголошуємо виходи за якими будуть з'єднані три реле, двоє з яких
відповідають за зміну полярності на замковому приводі, а третє
реагує на подання струму та пропускає його далі, щоб дозволити
зреагувати цим двом реле на цю зміну і змінити свій стан
*/
public: void initRelayPins() {
pinMode(PERMISSION_RELAY, OUTPUT);
pinMode(POLARITY_CHANGE_RELAY_1, OUTPUT);
pinMode(POLARITY_CHANGE_RELAY_2, OUTPUT);
}
private: void permissionRelayOff() {
digitalWrite(PERMISSION_RELAY, OFF);
delay(SWITCHING_DELAY);
}
private: void permissionRelayOn() {
delay(SWITCHING_DELAY);
digitalWrite(PERMISSION_RELAY, ON);
}
/*
Оголошуємо команди, що буде виконувати зміну полярності на релейних
пристроях та закривати чи відкривати замковий механізм відповідно
*/
public: void carLockChangeState() {
/*
Змінюємо полярність реле та відкриваємо чи закриваємо замок
*/
permissionRelayOn();
digitalWrite(POLARITY_CHANGE_RELAY_1, ON);
digitalWrite(POLARITY_CHANGE_RELAY_2, ON);
delay(SWITCHING_DELAY);
digitalWrite(POLARITY_CHANGE_RELAY_1, OFF);
digitalWrite(POLARITY_CHANGE_RELAY_2, OFF);
permissionRelayOff();
}
/*
Оголошення Bluetooth Low Enegry (BLE) Server
*/
public: void initBluetoothServer() {
BLEDevice::init(BLUETOOTH_DEVICE_NAME);
BLEServer *carLockBleServer = BLEDevice::createServer();
BLEService *carLockBleService = carLockBleServer -> createService(BLUETOOTH_SERVICE_UUID);
BLECharacteristic *carLockBleChar = carLockBleService -> createCharacteristic(
BLUETOOTH_CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
carLockBleChar -> setCallbacks(new CarLockSystemCallbacks());
carLockBleChar -> setValue("0");
carLockBleService -> start();
BLEAdvertising *carLockBleAd = carLockBleServer -> getAdvertising();
carLockBleAd -> start();
}
private: void onWrite(BLECharacteristic *carLockBleChar) {
std::string value = carLockBleChar -> getValue();
/*
Для роботи замка перевіряємо дані отримані з підключеного
Bluetooth пристрою. Якщо вони відповідають прописаним
умовам, буде виконуватись відкриття чи закриття замка
*/
if (value == TURN_OFF_TRIGGER) {
carLockChangeState();
}
if (value == TURN_ON_TRIGGER) {
carLockChangeState();
}
}
};
void loop() {}
void setup() {
CarLockSystemCallbacks carLockSystem;
/*
виконати команди на визначення керуючих виводів,
зачинення/відкриття дверей на початку роботи
системи та ініціалізація Bluetooth LE Server
*/
carLockSystem.initRelayPins();
carLockSystem.initBluetoothServer();
carLockSystem.carLockChangeState();
}