В настоящее время различные виды охранных систем широко распространены по всему миру и цифровые кодовые замки являются важной частью этих систем. Ранее на нашем сайте мы уже рассматривали простой кодовый замок на Arduino, в этой же статье мы рассмотрим аналогичный замок, но с TFT ЖК дисплеем (TFT LCD) и управляемый со смартфона. Управление этим замком будет осуществляться с помощью технологии Bluetooth и мобильного телефона с операционной системой Android. Дальность действия технологии Bluetooth составляет около 10 метров. Для управления замком пользователь должен будет ввести заранее определенный пароль на своем мобильном телефоне (смартфоне), если пароль вверен, то на TFT ЖК дисплее высветится надпись “CORRECT PASSWORD”, а если пароль неправильный – то высветится надпись “WRONG PASSWORD”.
То есть этот замок вы сможете открывать дистанционно со своего смартфона даже когда вы еще не дошли до двери – это будет экономить ваше время и избавит от необходимости ношения с собой металлических ключей.
Необходимые компоненты
- Плата Arduino Mega (купить на AliExpress) (Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158).
- TFT LCD Shield диагональю 2.4 дюйма с контроллером SPFD5408 (купить на AliExpress) (Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158).
- Bluetooth модуль HC05 (купить на AliExpress) (Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158).
- Буззер (звонок) (купить на AliExpress) (Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158).
- USB кабель.
- Мобильный телефон (смартфон) с операционной системой Android.
- Приложение для Bluetooth (Bluetooth terminal App).
- Макетная плата.
- Соединительные провода.
Работа схемы
Схема устройства представлена на следующем рисунке.
Как видим, она достаточно проста – достаточно только подсоединить Bluetooth модуль HC05 и одеть сверху на плату Arduino шилд (расширение) TFT ЖК дисплея (TFT LCD Shield). Этот шилд достаточно легко монтируется – достаточно только проследить чтобы контакты GND и Vcc шилда и платы Arduino совпадали. Также вы должны установить библиотеку для работы с данным TFT ЖК дисплеем, более подробно все эти процессы описаны в статье про подключение TFT ЖК дисплея к плате Arduino.
Bluetooth модуль HC05 запитывается от контакта Vcc Arduino, его земля подключена к контакту GND Arduino. Контакты TX и RX модуля HC05 соединены с контактами RX1 и TX1 платы Arduino. Один контакт буззера (звонка) подключен к контакту GND Arduino, а другой – к контакту 22 Arduino.
Настройка Bluetooth Terminal App (приложения для Bluetooth)
Для осуществления возможности управления нашим кодовым замком при помощи смартфона нам необходимо установить и настроить приложение для Android под названием Bluetooth Terminal. Приложение Bluetooth Terminal App совместимо с Arduino. Вам необходимо выполнить следующие действия:
- Скачать из Google Play Store приложение Bluetooth Terminal App и установить его на свой смартфон.
- Подать питание на собранную схему цифрового кодового замка.
- Открыть приложение и выбрать там опцию ‘connect securely’ (соединиться в безопасном режиме).
- В списке устройств для подключения вы найдете модуль HC05.
- Задайте пароль 1234 (потом можете поменять) для соединения с вашим мобильным телефоном на Android.
Описание работы устройства
В нашем устройстве мы использовали три основных компонента: Bluetooth модуль HC05, плату Arduino Mega и TFT LCD Shield диагональю 2.4 дюйма.
Пароль в этой системе вводится на смартфоне под управлением Android и с помощью приложения Bluetooth Terminal App передается на Arduino с помощью технологии Bluetooth. Плата Arduino принимает эти данные с помощью Bluetooth модуля HC05, обрабатывает их и отображает на SPFD5408 TFT LCD. Arduino сравнивает введенный пользователем пароль с заранее определенным паролем (1234) и выдает соответствующее сообщение на экран ЖК дисплея. Если пароли совпадают, то на экран ЖК дисплея выдается сообщение “CORRECT PASSWORD”, а если не совпадают – то сообщение “WRONG PASSWORD”. Также когда введенный пароль неправильный, звучит сигнал буззера, имитирующий сигнал тревоги. Более подробно все эти процессы можно посмотреть в видео, приведенном в конце статьи.
Структурная схема работы устройства представлена на следующем рисунке.
Пароль 1234, используемый нами по умолчанию, вы можете изменить по своему усмотрению, но для этого необходимо будет внести небольшие изменения в приведенный ниже код программы.
Исходный код программы
Для написания программы для нашего проекта кодового замка нам понадобится ряд библиотек. Большую часть этих библиотек можно скачать в виде rar архива по ссылке – https://github.com/JoaoLopesF/SPFD5408. После перехода по этой ссылке в открывшемся окне нажмите ‘Clone or download’, а потом ‘Download ZIP’ файл. Скачанный архив добавьте в Arduino library folder (папку с библиотеками для Arduino на вашем компьютере). Эта (скачанная) библиотека будет нужна для корректного функционирования используемого нами TFT ЖК дисплея.
#include <SPFD5408_Adafruit_GFX.h> // Core graphics library – библиотека графического ядра
#include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
#include <SPFD5408_TouchScreen.h>
Инициализация ЖК дисплея и последовательного порта для связи с Bluetooth модулем выполняется в функции void setup(). Контакт 22 Arduino подключен к буззеру, а другой контакт буззера подключен к земле Arduino Mega. Bluetooth модуль к последовательному порту 1 (Serial1 port) Arduino Mega и запитывается от 5V Arduino Mega. Функция fillScreen() используется для очистки экрана ЖК дисплея.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial1.begin(9600);
tft.reset();
tft.begin(0x9341);
tft.setRotation(0);
tft.fillScreen(WHITE);
tft.setCursor (40, 50);
tft.setTextSize (2);
tft.setTextColor(BLACK);
tft.println("E N T E R* P A S S W O R D ");
delay(5000);
tft.fillScreen(WHITE);
pinMode(22,OUTPUT);
}
В функции void loop() команда setTextSize(4) устанавливает размер текста, а setTextColor(colorName) – устанавливает цвет текста. arr[] – это массив, в котором мы будем хранить заранее определенный пароль длиной 4 символа, а Input[] – массив, в котором мы будем хранить пароль, полученный с вашего смартфона.
void loop() {
tft.setTextSize (4);
tft.setTextColor(CYAN);
// put your main code here, to run repeatedly:
if (Serial1.available() > 0)
{
flag = 1;
char c = Serial1.read();
if (flag == 1)
{
input[i] = c;
.... .....
..... ......
В дальнейшем вы можете изменить значение пароля в массиве arr[] с ‘1234’ на то, которое вам будет нужно. Также можно изменить длину пароля, изменяя размер (длину) массивов arr[] и input[].
char arr[4] = {'1', '2', '3', '4'};
char input[4];
Но помните, что если измените размеров этих массивов, то тогда в функции void loop() необходимо будет изменить и условие для сравнения значений этих массивов.
if (arr[0] == input[0] && arr[1] == input[1] && arr[2] == input[2] && arr[3] == input[3])
Также рассматриваемый нами замок можно усовершенствовать с помощью электромагнита, который будет держать дверь закрытой до тех пор пока не будет введен правильный пароль.
Далее приведен полный текст программы.
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 |
#include <SPFD5408_Adafruit_GFX.h> // Core graphics library #include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library #include <SPFD5408_TouchScreen.h> // *** SPFD5408 change -- End #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif #define YP A1 // must be an analog pin, use "An" notation! #define XM A2 // must be an analog pin, use "An" notation! #define YM 7 // can be a digital pin #define XP 6 // can be a digital pin // Original values (оригинальные значения) //#define TS_MINX 150 //#define TS_MINY 120 //#define TS_MAXX 920 //#define TS_MAXY 940 // Calibrate values (откалиброванные значения) #define TS_MINX 125 #define TS_MINY 85 #define TS_MAXX 965 #define TS_MAXY 905 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); // параметр 300 в этой функции – это примерное значение сопротивления между контактами X+ и X-, используйте мультиметр для точного измерения этого сопротивления для используемого вами ЖК дисплея и подставьте измеренное значение сопротивления в эту функцию – это позволит повысить точность работы дисплея #define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 // optional #define LCD_RESET A4 // назначим удобные имена некоторым 16-битным значениям цвета #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF char arr[4] = {'1', '2', '3', '4'}; char input[4]; char messageflagarr[4]; char result = '0', flag = 0, passwordflag = 0; int x = 40, i = 0; Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial1.begin(9600); tft.reset(); tft.begin(0x9341); tft.setRotation(0); tft.fillScreen(WHITE); tft.setCursor (40, 50); tft.setTextSize (2); tft.setTextColor(BLACK); tft.println("E N T E R* P A S S W O R D "); delay(5000); tft.fillScreen(WHITE); pinMode(22,OUTPUT); } void loop() { tft.setTextSize (4); tft.setTextColor(CYAN); // put your main code here, to run repeatedly: if (Serial1.available() > 0) { flag = 1; char c = Serial1.read(); if (flag == 1) { input[i] = c; i++; tft.println(c); delay(2000); if (i == 4) { passwordflag = 1; } flag = 0; } if (passwordflag == 1) { if (arr[0] == input[0] && arr[1] == input[1] && arr[2] == input[2] && arr[3] == input[3]) { tft.setCursor (40, 50); tft.setTextSize (2); tft.setTextColor(BLACK); tft.println("CORRECT PASSWORD"); delay(6000); tft.fillScreen(WHITE); i=0; } else { tft.setCursor (40, 50); tft.setTextSize (2); tft.setTextColor(BLACK); tft.println("WRONG PASSWORD"); digitalWrite(22,HIGH); delay(500); digitalWrite(22,LOW); delay(500); digitalWrite(22,HIGH); delay(500); digitalWrite(22,LOW); delay(500); digitalWrite(22,HIGH); delay(500); digitalWrite(22,LOW); delay(500); digitalWrite(22,HIGH); delay(500); digitalWrite(22,LOW); tft.fillScreen(WHITE); digitalWrite(22,LOW); i=0; } passwordflag=0; } } } |