КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Контроль доступа при помощи iocontrol.ru и Raspberry Pi

Контроль доступа при помощи iocontrol.ru

Общие сведения

В этом проекте мы сделаем пример, на основе которого можно собрать домашнюю систему контроля доступа при помощи сервиса iocontrol

Видео

Нам понадобится

Создание и настройка панели на iocontrol.ru

  1. Создаём или входим в учётную запись на сайте iocontrol
  2. нажимаем "Создать панель". Придумываем название панели, например "myNewPanel" (название панели должно быть уникальным на сайте. Если панель с таким именем уже есть, сайт уведомит об этом). Нажимаем Создать.
  3. Создаём переменную текстового типа и назовем её key.
  4. Создаём переменную целочисленного типа и назовем её lock.
  5. Настраиваем вид переменной как кнопки(Нажимаем на пиктограмму шестерёнки в правом верхнем углу карточки переменной и в открывшейся странице выбираем вид "Кнопка".

Подключение

Установим Ethernet Shield на Arduino UNO/Piranha UNO

Установим Trema Sheild на Ethernet Sheild через проставки

Подключим модули и замок

Код

Скетч Arduino

// Подключаем библиотеки
#include <iocontrol.h>
#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>
#include <iarduino_I2C_Matrix_8x8.h>

// Определяем выводы
#define LOCK_PIN 6
#define ZUM_PIN 5
#define RX 8
#define TX 9

// Определяем длительность работы замка (миллисекунды)
#define DURATION 5000

// Орпеделяем длину RFID ключа
#define KEY_SIZE 14

// Название панели на сайте iocontrol.ru
const char* myPanelName = "НАЗВАНИЕ_ВАШЕЙ_ПАНЕЛИ";
// Ключ доступа к панели
const char* key = "КЛЮЧ_ВАШЕЙ_ПАНЕЛИ";
int status;

// Название переменных на сайте iocontrol.ru
//const char* VarName_key_hi = "key_hi"; // Раскомментировать для проверки ключа полностью
const char* VarName_key_lo = "key";
const char* VarName_lock = "lock";

// определяем программный последовательный порт RFID-модуля
SoftwareSerial RfidReader(RX, TX);

// Создаём объект клиента класса EthernetClient
EthernetClient client;

// Создаём объект iocontrol, передавая в конструктор название панели и клиента
iocontrol mypanel(myPanelName, key, client);

// MAC адреса Ethernet шилда. Должен быть уникальным в сети
byte mac[] = {
    0xDE, 0xED, 0xDE, 0xAD, 0xFA, 0xCA
};

// Создаём экземпляр класса матрицы
iarduino_I2C_Matrix_8x8 disp;

// Картинка для матрицы - доступ разрешён
uint8_t granted[] {
    0b00000000,
    0b00000011,
    0b00000011,
    0b11000110,
    0b11000110,
    0b01101100,
    0b00111100,
    0b00011000
};

uint8_t denied[] {
    0b00000000,
    0b11000011,
    0b01100110,
    0b00111100,
    0b00011000,
    0b00111100,
    0b01100110,
    0b11000011
};

byte buffer[KEY_SIZE]{0};

unsigned long timer;

// назначаем переменную для счетчика
int count = 0;

void setup()
{
    // инициируем последовательный порт
    Serial.begin(9600);
    // инициируем передачу данных с модулем RFID
    RfidReader.begin(9600);
    Ethernet.init(10);

    // Инициируем Ethernet Shield с использованием DHCP
    Ethernet.begin(mac);

    // Вызываем функцию первого запроса к сервису
    status = mypanel.begin();
    Serial.println((String)"Status mypanel.begin = " + status);

    // Инициируем I2C матрицу 8x8
    disp.begin();
    disp.clrScr();

}

void loop()
{
    // Обновляем переменные в памяти контроллера
    status = mypanel.readUpdate();

    // записываем значение переменной-переключателя "lock".
    bool io_lock = mypanel.readBool(VarName_lock);

    // Если переменные были обновлены...
    if (status == OK) {

        // выводим текст в последовательный порт,
        Serial.println("------- Read OK -------");

        // Если переключатель включён...
        if (io_lock) {
            // выводим изображение на матрицу,
            disp.drawImage(granted);
            // открываем замок,
            open();
            // очищаем экран матрицы,
            disp.clrScr();
            // устанавливаем переключатель в положение "выключено".
            mypanel.write(VarName_lock, false);
            while(mypanel.writeUpdate());
        }

        Serial.println((String)"io_lock = "+io_lock);
    }

    // если в последовательном порту есть данные, то
    if (RfidReader.available()) {

        // считаем байты
        count++;
        // записываем их в массив
        buffer[count % KEY_SIZE] = RfidReader.read();

        // если количество байтов кратно размеру ключа
        if (!(count % KEY_SIZE)) {
            // Оповещаем пользователя сигналом
            buzz();

            // Строка для преобразования полученного ключа
            char str[KEY_SIZE + 1] = "";

            // Вызываем функцию преобразования байтов в строку
            array_to_hex_string(buffer, KEY_SIZE, str);

            String s = str;

            // Если необходимо проверять ключ полностью - раскомментируйте
            // следующие две строки, и создайте переменную на сайте с названием
            // "key_hi" для хранения старшей подстроки
            //String key_hi = s.substring(0, s.length() / 2);
            //mypanel.write(VarName_key_hi, key_hi);

            // Записываем младшую подстроку в переменнную
            String key_lo = s.substring(s.length() / 2, s.length());

            mypanel.write(VarName_key_lo, key_lo);

            // Отправляем переменные из контроллера в сервис
            status = mypanel.writeUpdate();
            // Если статус равен константе OK...
            if (status == OK) {
                // Если доступ не разрешён...
                if (!io_lock)
                    // Выводим картинку на матрицу
                    disp.drawImage(denied);
                    timer = millis();
                // Выводим текст в последовательный порт
                Serial.println("------- Write OK -------");
            }
        }
    }
    if (millis() - timer > DURATION) {
        disp.clrScr();
    }
}

// Функция преобразования массива байт в строку
void array_to_hex_string(byte array[], unsigned int len, char buf[])
{
    for (unsigned int i = 0; i < len; i++)
    {
        byte nib1 = (array[i] >> 4) & 0x0F;
        byte nib2 = (array[i] >> 0) & 0x0F;
        buf[i*2+0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
        buf[i*2+1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
    }
    buf[len*2] = '\0';
}

// Функция открывания замка
void open()
{
    pinMode(LOCK_PIN, OUTPUT);
    digitalWrite(LOCK_PIN, HIGH);
    pinMode(ZUM_PIN, OUTPUT);
    digitalWrite(ZUM_PIN, HIGH);
    delay(DURATION);
    pinMode(ZUM_PIN, INPUT);
    pinMode(LOCK_PIN, INPUT);
}

// Функция включения зуммера
void buzz()
{
    pinMode(ZUM_PIN, OUTPUT);
    digitalWrite(ZUM_PIN, HIGH);
    delay(300);
    pinMode(ZUM_PIN, INPUT);
}

Копирование ключа

После запуска скетча, поднесите ключ к считывателю. Его идентификатор появится в карточке переменной key в Вашей панели на сайте iocontrol (если ключ виден не полностью, зайдите в настройки карточки и измените её размер). Скопируйте этот идентификатор в следующий сценарий для Python

Сценарий Python

Для подключения библиотеки `pyiocontrol` необходимо сначала её установить. Сделать это можно в менеджере модулей в Thonny Python IDE (тогда библиотека установится локально для этого IDE), в виртуальной среде командой `pip3 install pyiocontrol` или в терминале Raspberry (тогда библиотека будет системной) командой:
sudo pip3 install pyiocontrol

Подробнее про установку библиотеки можно узнать по ссылке

#!/usr/bin/python3
import pyiocontrol
from time import sleep

p = pyiocontrol.Panel("НАЗВАНИЕ_ВАШЕЙ_ПАНЕЛИ", "КЛЮЧ_ПАНЕЛИ")

while True:
    if p.key == "ИДЕНТИФИКАТОР_RFID_МЕТКИ":
        p.lock = True
        p.key = '0'
    sleep(.5)

Ссылки




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями