• I






      
           

Научно-популярный образовательный ресурс для юных и начинающих радиолюбителей - Popular science educational resource for young and novice hams

Основы электричества, учебные материалы и опыт профессионалов - Basics of electricity, educational materials and professional experience

КОНКУРС
language
 
Поиск junradio

Радиодетали
ОК
Сервисы

Stock Images
Покупка - продажа
Фото и изображений


 
Выгодный обмен
электронных валют

Друзья JR



JUNIOR RADIO

 

Создайте свою собственную систему
посещаемости RFID Raspberry Pi

 

 

В этом проекте системы посещаемости Raspberry Pi RFID мы покажем вам, как настроить и запрограммировать вашу собственную систему посещаемости, которая использует считыватель RFID RC522.

 


 

На протяжении этого проекта мы покажем вам, как собрать схему, которая использует как считыватель RFID RC522, так и ЖК-дисплей 16 × 2. Мы начнем с того, что покажем вам все шаги, необходимые для подключения этих схем к контактам GPIO Raspberry Pi . Мы также покажем вам, как проверить каждую цепь, чтобы она работала должным образом. Это помогает гарантировать, что все будет готово для использования в нашей системе посещаемости RFID. Во второй части руководства мы проведем вас через все шаги по настройке базы данных. Мы также будем писать сценарии Python, которые будут общаться с базой данных, чтобы отмечать посещаемость для отдельных RFID-карт. Наконец, мы предлагаем вам настроить простой скрипт PHP, который позволяет визуально видеть данные, созданные системой посещаемости RFID.

Подготовка Raspbian для вашей системы посещаемости RFID

1.Для начала мы сначала убедимся, что все в нашей установке Raspbian обновлено , выполнив следующие две команды на Raspberry Pi.

sudo apt-get update

sudo apt-get upgrade

2. Теперь мы установим все пакеты, на которые мы будем полагаться в следующих нескольких разделах. Начнем с установки build-essential , git , python3-dev , python3-pip и python3-smbus , выполнив команду ниже.

sudo apt-get install build-essential git python3-dev python3-pip python3-smbus

 Создание схемы ЖК-дисплея 16 × 2

1.Чтобы начать наше руководство, мы сначала начнем настройку ЖК-дисплея 16 × 2. Мы быстро проведем процесс настройки всего этого. В этом разделе учебника убедитесь, что у вас есть готовые к работе следующие материалы.

8 штук проводов от мужчины к мужчине

8 штук проводов от мужчины к женщине

ЖК-дисплей 16 × 2

Потенциометр 10 кОм

Макетная плата

2. Когда у вас есть все необходимые детали, вы можете приступить к сборке схемы, наблюдая за схемами и шагами ниже. Подключение ЖК-дисплея к Raspberry Pi - довольно простой процесс, если вы будете следовать нашему руководству. Мы включили физический пин-код для каждого соединения, которое вам нужно установить. Для начала давайте соединим наши различные компоненты с макетной платой.

5 В (физический контакт 2) на положительную шину макетной платы

Земля (физический контакт 6) на шину заземления макетной платы

Поместите 16 × 2 ЖК - дисплей в правой части макета

Поместите потенциометр в левую часть макета рядом с ЖК-дисплеем .

Подключите левый палец от потенциометра на первый рельс

Подключите правую шпильку от потенциометра к положительной шине

3. Теперь начните подключать ЖК-дисплей к Raspberry Pi.

Pin 1 из LCD (земля) для макетирования наземной железной дороги

Вывод 2 из LCD (VCC / 5V) , чтобы макет положительного рельса

Вывод 3 из LCD (V0) до среднего провода от потенциометра

Pin 4 из LCD (RS) в GPIO4 (Physical Pin 7)

Вывод 5 из LCD (RW) , чтобы макет наземной железной дороги

Вывод 6 из LCD (EN) , чтобы GPIO24 (Физический Штифт 18)

Pin 11 из LCD (D4) к GPIO23 (Physical Pin 16)

Pin 12 из LCD (D5) в GPIO17 (Physical Pin 11)

Pin 13 из LCD (D6) в GPIO18 (Physical Pin 12)

Pin 14 из LCD (D7) в GPIO22 (Physical Pin 15)

Pin 15 из LCD (LED +) на макетной плате положительный рельс

Pin 16 из ЖК (LED -) на макетной плате заземления рельс

 

Схема подключения ЖК-дисплея системы присутствия RFID

 

 

Тестирование ЖК-дисплея 16 × 2

1. Теперь, когда схема настроена, давайте продолжим и протестируем ее, чтобы убедиться, что все подключено правильно. Для начала клонируйте библиотеку Adafruit CharLCD, которую мы будем использовать для этого проекта. Если на вашей плате дисплея используется контроллер HD44780 , он будет работать без проблем. Чтобы клонировать библиотеку на Raspberry Pi, выполните на ней следующую команду.

git clone https://github.com/pimylifeup/Adafruit_Python_CharLCD.git

2.Теперь, когда библиотека клонирована на наш Raspberry Pi, нам нужно запустить сценарий установки. Этот сценарий установит библиотеку, чтобы любые сценарии Python могли ее использовать. Выполните следующие две команды, чтобы перейти во вновь клонированный каталог и запустить сценарий setup.py .

cd ./Adafruit_Python_CharLCD

sudo python3 setup.py install

3.После установки библиотеки на Raspberry Pi нам нужно продолжить и отредактировать файл примера. Нам нужно сделать это, чтобы протестировать схему, поскольку мы используем выводы, отличные от того, что используется в примере. Начните редактирование файла, выполнив следующую команду.

nano ~/Adafruit_Python_CharLCD/examples/char_lcd.py

4. В этом файле найдите # Raspberry Pi pin configurationраздел « :» и измените его так, чтобы значения соответствовали приведенным ниже.

# Raspberry Pi pin configuration:

lcd_rs        = 4

lcd_en        = 24

lcd_d4        = 23

lcd_d5        = 17

lcd_d6        = 18

lcd_d7        = 22

После внесения изменений сохраните файл, нажав CTRL + X, затем Y и затем ENTER .

5.Теперь, прежде чем мы продолжим и запустим наш новый модифицированный пример, нам нужно будет установить библиотеку GPIO Python Raspberry Pi . Чтобы установить необходимую библиотеку, выполните следующую команду.

sudo pip3 install RPi.GPIO

6. Чтобы проверить, что все работает, давайте запустим этот скрипт Python, выполнив команду ниже. Если все работает должным образом, вы должны увидеть текст, отображаемый на ЖК-дисплее.

python3 ~/Adafruit_Python_CharLCD/examples/char_lcd.py

 Создание схемы считывателя RFID RC522

1. Теперь, когда вы настроили ЖК-дисплей 16 × 2, мы перейдем к добавлению считывателя RFID в эту схему. Для этого раздела о подключении RFID RC522 к цепи вам потребуется следующее готовое оборудование.

1 шт. Мужской провод макетной платы

6 штук проводов от мужчины к женщине

RFID RC522 Чтение / Запись

Макетная плата

2. Как только у вас будет все необходимое для схемы RFID, мы сможем приступить к ее подключению, это будет немного сложнее, поскольку схема ЖК-дисплея уже настроена. Обратите внимание, что эта принципиальная схема предполагает, что вы выполнили действия, описанные в предыдущем разделе для ЖК-дисплея. Если вы не используете ЖК-дисплей, убедитесь, что вы подключили физический контакт 6 на Raspberry Pi к шине заземления на макетной плате.

Следуйте схемам и шагам ниже, чтобы подключить RFID-схему к Raspberry Pi.

SDA подключается к GPIO8 (физический контакт 24)

SCK подключается к GPIO11 (физический контакт 23)

MOSI подключается к GPIO10 (физический контакт 19)

MISO подключается к GPIO9 (физический контакт 21)

GND подключается к заземляющей шине макетной платы .

RST подключается к GPIO25 (физический контакт 22)

3,3 В подключается к 3v3 (физический контакт 1)

 

Электрические схемы системы посещаемости RFID RC522

 

 

Включение интерфейса SPI

1.Теперь, когда RFID подключен к нашему Raspberry Pi, нам нужно будет войти в инструмент raspi-config , чтобы включить интерфейс SPI. Этот интерфейс необходим для связи с модулем RC522. Для этого вам необходимо сначала запустить инструмент raspi-config, выполнив следующую команду.

sudo raspi-config

2. После выполнения команды вы увидите экран с различными параметрами, которые вы можете настроить. mПока нас интересует только активация интерфейса SPI.  На этом экране с помощью клавиш со стрелками спуститесь вниз, выберите « 5 параметров интерфейса » и нажмите ENTER .

3.На следующем экране вы захотите использовать клавиши со стрелками для выбора опции « P4 SPI », после выбора нажмите ENTER .

4.Теперь вам нужно будет подтвердить, хотите ли вы включить интерфейс SPI. Для этого вам нужно будет использовать клавиши со стрелками, чтобы выбрать « Да », а затем нажать ENTER, когда он будет выбран.

5. Интерфейс SPI теперь должен быть успешно включен, и теперь вы должны увидеть текст « Интерфейс SPI включен », появившийся на экране. Теперь, прежде чем интерфейс SPI будет полностью включен, нам нужно будет перезапустить Raspberry Pi. Мы можем добиться этого, вернувшись к терминалу, нажав ENTER, а затем ESC .

Введите следующую команду, чтобы перезапустить Raspberry Pi.

sudo reboot

6. После того, как Raspberry Pi завершит перезагрузку, вы можете проверить, включен ли интерфейс SPI, выполнив следующую команду. Эта команда получит список включенных модулей ядра и все, что содержит текст « spi », из этого списка .

lsmod | grep spi

Если вы видите текст « spi_bcm2835 » в командной строке, значит, вы готовы приступить к проверке правильности работы схемы. Как только это будет сделано, мы сможем настроить нашу систему посещаемости с использованием RFID.

 Тестирование RFID RC522

1. Теперь давайте установим библиотеку spidev на наш Raspberry Pi, используя следующую команду «pip». Мы полагаемся на библиотеку spidev для взаимодействия с интерфейсом считывателя RFID.

sudo pip3 install spidev

2.Теперь, когда мы установили библиотеку spidev на нашу Raspberry Pi, нам нужно перейти к загрузке библиотеки MFRC522 с помощью команды «pip». Эта библиотека - это то, что будет выполнять основную работу для нашей системы посещаемости RFID.

sudo pip3 install mfrc522

3. Теперь, когда у нас есть как библиотека MFRC522, так и библиотека spidev, установленная на нашем Raspberry Pi, давайте продолжим и создадим каталог для хранения нашего тестового скрипта.

mkdir ~/pi-rfid

4. Теперь нам нужно написать короткий сценарий, чтобы проверить, действительно ли наш RC522 может читать RFID-карты и что все подключено правильно. Во-первых, давайте откроем наш новый скрипт, выполнив следующую команду, это создаст файл с именем « read.py » в нашем недавно созданном каталоге.

nano ~/pi-rfid/read.py

5.Введите в этот файл следующие строки кода. 

#!/usr/bin/env python

 

import RPi.GPIO as GPIO

from mfrc522 import SimpleMFRC522

 

reader = SimpleMFRC522()

try:

        id, text = reader.read()

        print(id)

        print(text)

finally:

        GPIO.cleanup()

После этого сохраните файл, нажав CTRL + X, затем Y и ENTER .

6. Теперь проверьте RFID RC522, запустив следующий сценарий и нажав чип RFID на считывающем устройстве.

python3 ~/pi-rfid/read.py

 Полная схема системы посещаемости RFID Raspberry Pi

1.Теперь, когда обе схемы настроены, дважды проверьте, что все работает правильно. Протестируйте, запустив тестовые сценарии, которые мы быстро собрали в нескольких предыдущих разделах. Если у вас возникли проблемы, вы можете сравнить свою окончательную схему со схемами ниже. Эти диаграммы призваны дать вам представление о том, как должна выглядеть окончательная схема.

 

Схема системы посещаемости RFID

 

Используемые контакты GPIO системы посещаемости RFID

 

 

Подготовка базы данных системы посещаемости RFID

1.Теперь, прежде чем мы продолжим и запрограммируем нашу систему посещаемости RFID, мы должны сначала подготовить и настроить базу данных MYSQL. В этой базе данных мы будем отслеживать посещаемость каждой RFID-карты и то, кому принадлежит эта RFID-карта. Наша система контроля посещаемости RFID проведет вас через большинство основ, но дополнительное руководство научит вас, как настроить полезные инструменты, такие как PHPMyAdmin.

Начните с установки MYSQL на свой Raspberry Pi, выполнив следующую команду на своем Pi.

sudo apt-get install mysql-server -y

2. Затем нам нужно будет запустить сценарий « безопасной установки », который поставляется вместе с MYSQL. Этот сценарий проведет вас через некоторые процессы по повышению безопасности вашего сервера MYSQL. Запустите этот сценарий, выполнив следующую команду в терминале Raspberry Pi.

sudo mysql_secure_installation

При появлении запроса убедитесь, что вы установили новый пароль для корневого сервера MYSQL. Кроме того, вы должны отвечать « y » на большинство запросов, таких как отключение доступа root для входа на ваш сервер MYSQL.

3.Теперь давайте загрузимся в инструмент командной строки MYSQL, выполнив следующую команду. Вам будет предложено ввести пароль, который вы установили на предыдущем шаге. Поскольку MariaDB при установке использует UNIX_SOCKET в качестве метода аутентификации по умолчанию, нам необходимо войти в систему с помощью суперпользователя, сделайте это с помощью sudo .

sudo mysql -u root -p

4. Давайте начнем с создания базы данных, в которой мы будем хранить все данные, которые мы будем использовать для нашей системы посещаемости RFID. Мы будем называть эту базу данных « системой посещаемости ». Чтобы создать эту базу данных, выполните следующую команду.

CREATE DATABASE attendancesystem;

5.Создав нашу базу данных, давайте теперь создадим пользователя с именем « visitanceadmin ». Мы будем использовать этого пользователя в наших сценариях Python для чтения из нашей недавно созданной базы данных. Убедитесь, что вы установили пароль для этого уникального пароля, который трудно угадать. В нашем примере мы будем просто использовать « pimylifeup » в качестве пароля.

CREATE USER 'attendanceadmin'@'localhost' IDENTIFIED BY 'pimylifeup';

6. Теперь, когда мы создали нашего пользователя, нам нужно предоставить ему права доступа к нашей базе данных «системы посещаемости ». Мы можем сделать это, выполнив следующую команду. Эта команда предоставит нашему пользователю « tendanceadmin »полные права доступа к любой таблице в нашей базе данных.

GRANT ALL PRIVILEGES ON attendancesystem.* TO 'attendanceadmin'@'localhost';

7. Прежде чем мы создадим наши таблицы, нам нужно использовать команду « использовать », чтобы мы напрямую взаимодействовали с базой данных «системы посещаемости ». Начните взаимодействие с базой данных, выполнив следующую команду.

use attendancesystem;

8. Теперь, когда мы имеем дело непосредственно с базой данных, которую хотим использовать, мы можем приступить к созданию таблиц, в которых будут храниться все наши данные. Выполнение следующих двух команд создаст таблицы, на которые мы будем полагаться для хранения данных. Мы объясним поля в этих таблицах после того, как мы их создадим.

create table attendance(

   id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,

   user_id INT UNSIGNED NOT NULL,

   clock_in TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

   PRIMARY KEY ( id )

);

 

create table users(

   id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,

   rfid_uid VARCHAR(255) NOT NULL,

   name VARCHAR(255) NOT NULL,

   created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

   PRIMARY KEY ( id )

);

Вы можете выйти из инструмента MYSQL, введя exit; Теперь, когда мы создали таблицы, давайте посмотрим на данные, которые мы будем хранить, и на то, как мы будем использовать их в нашем скрипте.

Для таблицы посещаемости мы храним три части данных для каждого записанного RFID-метки.

id - это целое число , которое используется для отслеживания текущей строки и автоматически увеличивается.

user_id - это целое число , и мы используем его, чтобы связать посещаемость с пользователем в нашей таблице пользователей с таким же идентификатором .

clock_in - эта переменная хранит метку времени SQL . Эта временная метка используется для отслеживания того, когда пользователь вставляет свою карту RFID в считыватель RFID.

В таблице users мы храним четыре части данных для каждого добавляемого пользователя.

id - это целое число , которое используется для отслеживания текущего пользователя и увеличивается автоматически.

rfid_uid - эта переменная используется для хранения UID, который фиксируется, когда RFID-карта постукивает по считывателю RFID.

name - в этой переменной хранится имя человека, которому принадлежит RFID-карта.

created - мы используем эту переменную, чтобы отслеживать, когда был создан пользователь.

 Запись пользователя в системе посещаемости

1.Прежде чем мы приступим к написанию сценариев нашей системы посещаемости, нам нужно сначала установить Python « MYSQL Connector » с помощью pip. Установите библиотеку коннекторов, выполнив следующую команду на своем Pi.

sudo pip3 install mysql-connector-python

2. Теперь давайте создадим папку, в которой будет храниться все для этого проекта.

mkdir ~/attendancesystem

3.Пора начать писать наш первый скрипт Python для нашей системы посещаемости. Этот первый сценарий позволит вам создать пользователя на основе подключенной RFID-карты. При нажатии на карту RFID скрипт Python попросит вас ввести имя пользователя, чтобы зарегистрировать эту карту для человека. Начните писать первую часть нашей системы посещаемости, выполнив следующую команду.

nano ~/attendancesystem/save_user.py

4.В этот новый файл напишите следующие строки кода. Мы объясним, что делает каждый раздел кода, и почему мы используем этот код.

#!/usr/bin/env python

Мы добавляем эту строку, чтобы операционная система знала, что этот файл должен выполняться с использованием Python.

import time

Мы импортируем библиотеку времени, чтобы можно было перевести скрипт в спящий режим, чтобы все происходило не мгновенно.

import RPi.GPIO as GPIO

Нам нужна библиотека GPIO, чтобы мы могли запустить функцию очистки после завершения скрипта.

from mfrc522 import SimpleMFRC522

Библиотека SimpleMFRC522 используется для упрощения взаимодействия с нашим считывателем RFID.

import mysql.connector

Мы используем коннектор MySQL, чтобы иметь возможность разговаривать с ранее созданной базой данных.

import Adafruit_CharLCD as LCD

Наконец, мы загружаем библиотеку Adafruit для общения с ЖК-дисплеями. Эта библиотека значительно упрощает процесс взаимодействия с нашим дисплеем 16 × 2.

db = mysql.connector.connect(

  host="localhost",

  user="attendanceadmin",

  passwd="pimylifeup",

  database="attendancesystem"

)

В этом разделе кода мы создаем подключение к нашему серверу MYSQL. Для этой функции мы передаем всю информацию, необходимую для установления соединения, такую ​​как хост, пользователь, имя базы данных и пароль. Объект, созданный коннектором, сохраняется в переменной db, чтобы мы могли легко взаимодействовать с базой данных. При вводе этого кода убедитесь, что вы заменили пароль на тот, который вы установили ранее в этом руководстве для пользователя SQL « tendanceadmin ».

cursor = db.cursor()

Здесь мы создаем копию объекта курсора из нашего соединения с базой данных. Мы используем этот объект для взаимодействия с базой данных и выполнения SQL-запросов.

reader = SimpleMFRC522()

Теперь мы подготовим библиотеку SimpleMFRC522, создав ее экземпляр нашему объекту чтения. Эта библиотека позволит нам легко общаться с RC522 позже в сценарии для чтения ввода от считывателя.

lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);

Наша последняя строка настройки, эта строка подготавливает библиотеку CharLCD для работы с дисплеем 16 × 2. Для этой функции мы передаем все необходимые номера контактов, количество строк и многое другое.

try:

  while True:

    lcd.clear()

    lcd.message('Place Card to\nregister')

    id, text = reader.read()

Этот блок кода - начало нашей логики создания пользователя. Сначала мы полностью обернем нашу логику оператором try :. Мы объясним почему позже в этом руководстве. Мы также заключаем нашу логику в цикл while True. Этот цикл гарантирует, что приведенный ниже код будет работать бесконечно, чтобы конечный пользователь мог регистрировать несколько пользователей подряд. Затем мы очищаем ЖК-дисплей в каждом цикле, чтобы убедиться, что мы имеем дело с чистым отображением, прежде чем писать на экран «Поместите карту для регистрации». Этот текст предлагает пользователю поместить свою RFID-карту в считывающее устройство. Наконец, мы используем нашу библиотеку SimpleMFRC522 для чтения ввода от нашего читателя. Эта функция будет ждать, пока пользователь не установит свой считыватель RFID, прежде чем она вернет и идентификатор карты, и текст, хранящийся на ней.

    cursor.execute("SELECT id FROM users WHERE rfid_uid="+str(id))

    cursor.fetchone()

В этом разделе мы используем курсор для выполнения нашего первого бита SQL. В этом операторе SQL мы просто ищем в нашей таблице «пользователи», чтобы увидеть, есть ли в каких-либо строках UID RFID, совпадающий с идентификатором, который мы получили при чтении карты RFID. Чтобы получить данные, которые мы получили, мы используем другую функцию из объекта курсора, в частности функцию fetchone (). Эта функция будет извлекать одну строку из возвращенных результатов.

    if cursor.rowcount >= 1:

      lcd.clear()

      lcd.message("Overwrite\nexisting user?")

      overwrite = input("Overwite (Y/N)? ")

 

      if overwrite[0] == 'Y' or overwrite[0] == 'y':

        lcd.clear()

        lcd.message("Overwriting user.")

        time.sleep(1)

        sql_insert = "UPDATE users SET name = %s WHERE rfid_uid=%s"

      else:

        continue;

    else:

      sql_insert = "INSERT INTO users (name, rfid_uid) VALUES (%s, %s)"

В этом разделе мы начнем с проверки того, сколько строк было возвращено нашим последним вызовом SQL. Если вызов SQL возвращает какие-либо строки, нам нужно спросить пользователя, хотят ли они перезаписать уже существующего пользователя.

Внутри оператора if мы переходим к очистке ЖК-экрана и отображаем сообщение « Перезаписать существующего пользователя? »И предоставьте пользователю подсказку в командной строке, чтобы ответить либо Y, чтобы перезаписать, либо что-нибудь еще, чтобы отменить. После того, как функция ввода получила ввод, мы затем проверяем, равен ли первый символ возвращенных данных « Y » или « y ». Если первый символ соответствует тому, что мы ожидаем, мы снова очищаем ЖК-дисплей. Затем мы отображаем сообщение « Перезапись пользователя » на одну секунду. Наконец, мы создаем SQL-запрос, чтобы обновить существующую запись с новым именем, которое мы укажем на следующем шаге. Мы делаем этот процесс вместо того, чтобы удалять старую запись и повторно добавлять ее. Если пользователь отвечает на функцию ввода чем угодно, кроме « Y » и « y », мы затем переходим к началу цикла, используя « continue ». Если это не повторяющаяся запись, мы создаем другой запрос SQL, чтобы создать новую запись в нашей таблице « пользователи ». Эта новая запись будет содержать новое имя, которое мы укажем в следующем блоке кода, и идентификатор RFID, который мы получили, когда пользователь коснулся своей карты.

    lcd.clear()

    lcd.message('Enter new name')

    new_name = input("Name: ")

 

    cursor.execute(sql_insert, (new_name, id))

 

    db.commit()

 

    lcd.clear()

    lcd.message("User " + new_name + "\nSaved")

    time.sleep(2)

finally:

  GPIO.cleanup()

Наш последний сегмент кода довольно прост и завершает все. Начнем с того, что снова очистим ЖК-дисплей и предложим пользователю ввести новое имя. Тем временем на консоли должен появиться текст « Имя: », поскольку мы используем ввод для ожидания ввода пользователя. После того, как пользователь ввел имя в консоль и нажал клавишу ввода, мы переходим к использованию объекта курсора для выполнения запроса, который мы сформировали в предыдущем разделе кода. Мы также создаем кортеж, который передается в функцию выполнения. Этот кортеж содержит новое имя и идентификатор RFID-карты. Оба эти значения автоматически передаются в наши строки запроса при выполнении. Наконец, мы фиксируем изменения в базе данных, вызывая объект db с функцией .commit () . Если мы не вызовем эту функцию, наши запросы INSERT и UPDATE не будут выполняться. Мы завершаем нашу основную логику кода, снова очищая ЖК-дисплей и отображая сообщение, которое новый пользователь сохранил. Мы запускаем быстрый 2-секундный сон, чтобы дать пользователю достаточно времени, чтобы увидеть сообщение, прежде чем мы перезапустим цикл. Наконец, у нас есть оператор finally:, это другая часть оператора try : . Этот фрагмент кода гарантирует, что в любом случае мы запустим функцию GPIO.cleanup . Например, если мы нажмем CTRL + C во время работы скрипта, он все равно должен очистить статус GPIO.

6. Надеюсь, что на этом этапе вы закончите запись сценария в файл. Однако, если вы хотите проверить и убедиться, что все правильно, вы можете найти полную версию кода ниже. Когда вас все устраивает, сохраните файл, нажав CTRL + X, затем Y и, наконец, ENTER .

#!/usr/bin/env python

 

import time

import RPi.GPIO as GPIO

from mfrc522 import SimpleMFRC522

import mysql.connector

import Adafruit_CharLCD as LCD

 

db = mysql.connector.connect(

  host="localhost",

  user="attendanceadmin",

  passwd="pimylifeup",

  database="attendancesystem"

)

 

cursor = db.cursor()

reader = SimpleMFRC522()

lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);

 

try:

  while True:

    lcd.clear()

    lcd.message('Place Card to\nregister')

    id, text = reader.read()

    cursor.execute("SELECT id FROM users WHERE rfid_uid="+str(id))

    cursor.fetchone()

 

    if cursor.rowcount >= 1:

      lcd.clear()

      lcd.message("Overwrite\nexisting user?")

      overwrite = input("Overwite (Y/N)? ")

      if overwrite[0] == 'Y' or overwrite[0] == 'y':

        lcd.clear()

        lcd.message("Overwriting user.")

        time.sleep(1)

        sql_insert = "UPDATE users SET name = %s WHERE rfid_uid=%s"

      else:

        continue;

    else:

      sql_insert = "INSERT INTO users (name, rfid_uid) VALUES (%s, %s)"

    lcd.clear()

    lcd.message('Enter new name')

    new_name = input("Name: ")

 

    cursor.execute(sql_insert, (new_name, id))

 

    db.commit()

 

    lcd.clear()

    lcd.message("User " + new_name + "\nSaved")

    time.sleep(2)

finally:

  GPIO.cleanup()

7.Сохранив наш сценарий save_user, давайте продолжим и попробуем проверить, что все работает так, как должно, и нет ошибок при копировании кода. Запустите сценарий, выполнив следующую команду.

python3 ~/attendancesystem/save_user.py

8.Коснитесь своей RFID-карты и посмотрите, все ли работает так, как задумано, если не перепроверить код и проводку. Если вы видите « Пользователь сохранен », значит, все должно работать.

 Запись посещаемости

1.Теперь, когда мы написали сценарий save_user и убедились, что он работает правильно, перейдем к сценарию check_attendance . Этот сценарий будет работать в бесконечном цикле, проверяя любые ответвления от чипа RFID. Когда кто-то нажимает на свой RFID-чип, мы проверяем ID этого чипа в базе данных. Если он находит пользователя, мы устанавливаем приветственное сообщение и вставляем запись в нашу таблицу посещаемости, которая будет иметь текущую дату и время. Начнем процесс написания скрипта с помощью следующей команды.

nano ~/attendancesystem/check_attendance.py

2.Введите следующие строки кода. Мы будем объяснять каждый новый раздел кода по мере продвижения, вы будете знакомы с некоторыми из них, поскольку мы использовали его в сценарии сохранения пользователя в предыдущем разделе.

#!/usr/bin/env python

import time

import RPi.GPIO as GPIO

from mfrc522 import SimpleMFRC522

import mysql.connector

import Adafruit_CharLCD as LCD

 

db = mysql.connector.connect(

  host="localhost",

  user="attendanceadmin",

  passwd="pimylifeup",

  database="attendancesystem"

)

 

cursor = db.cursor()

reader = SimpleMFRC522()

 

lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);

 

try:

  while True:

Мы не будем вдаваться в подробности этого блока кода, поскольку все это повторно используется из нашего первого скрипта save_user.py, который мы написали в последнем разделе этого руководства по системе посещаемости Raspberry Pi RFID. Главное, что вам нужно запомнить, это заменить пароль вашей базы данных, указанный рядом с « passwd », поскольку по умолчанию это наш пример пароля « pimylifeup ».

    lcd.clear()

    lcd.message('Place Card to\nrecord attendance')

    id, text = reader.read()

В этом блоке кода мы очищаем ЖК-экран и отображаем сообщение, предлагающее пользователю разместить свою карточку для записи посещаемости. Затем мы ждем ответа от считывателя RFID.

    cursor.execute("SELECT id, name FROM users WHERE rfid_uid="+str(id))

    result = cursor.fetchone()

 

    lcd.clear()

Здесь мы выполняем нашу первую часть SQL. Этот оператор SQL извлекает как « id », так и « имя » из нашей таблицы « users », где пользователь имеет тот же идентификатор RFID, что и карта, которая была подключена к считывателю. Затем мы берем строку, возвращаемую запросом SQL, и сохраняем ее результат в нашей переменной « результат » для дальнейшего использования. Наконец, мы очищаем ЖК-экран, чтобы он был готов к печати нового сообщения в следующем разделе кода.

    cursor.execute("SELECT id, name FROM users WHERE rfid_uid="+str(id))

    result = cursor.fetchone()

 

    lcd.clear()

В этом разделе мы сначала проверяем, вернул ли последний запрос SQL какие-либо строки. Если он вернул 0, мы отображаем сообщение на дисплее 16 × 2, что « Пользователь не существует. ” Если у нас есть строка, мы переходим к отображению сообщения, приветствующего пользователя. Мы используем их имя, которое было извлечено из базы данных как result [1] . После этого мы делаем оператор SQL, чтобы вставить строку в нашу таблицу посещаемости. Нам нужно передать идентификатор пользователя, который мы получили из нашего предыдущего вызова SQL и сохранен в result [0] . Наконец, мы фиксируем изменения в базе данных.

    time.sleep(2)

finally:

  GPIO.cleanup()

Наш последний раздел кода прост. Мы переводим сценарий в спящий режим на две секунды, чтобы дать пользователю время прочитать сообщение, которое мы отображаем на дисплее 16 × 2, и удалить карту RFID. Оператор « finally: » гарантирует, что мы очистим GPIO после завершения сценария.

3. Как только вы закончите вводить весь код, вы можете сравнить его с полной версией, которая находится прямо ниже. Главное, на что следует обращать внимание при вводе всего кода, - чтобы все отступы были одинаковыми. Два пространства должны разделять каждый уровень. Убедившись, что все в порядке, сохраните файл, нажав CTRL + X, затем Y и, наконец, ENTER .

#!/usr/bin/env python

import time

import RPi.GPIO as GPIO

from mfrc522 import SimpleMFRC522

import mysql.connector

import Adafruit_CharLCD as LCD

 

db = mysql.connector.connect(

  host="localhost",

  user="attendanceadmin",

  passwd="pimylifeup",

  database="attendancesystem"

)

 

cursor = db.cursor()

reader = SimpleMFRC522()

 

lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);

 

try:

  while True:

    lcd.clear()

    lcd.message('Place Card to\nrecord attendance')

    id, text = reader.read()

 

    cursor.execute("Select id, name FROM users WHERE rfid_uid="+str(id))

    result = cursor.fetchone()

 

    lcd.clear()

 

    if cursor.rowcount >= 1:

      lcd.message("Welcome " + result[1])

      cursor.execute("INSERT INTO attendance (user_id) VALUES (%s)", (result[0],) )

      db.commit()

    else:

      lcd.message("User does not exist.")

    time.sleep(2)

finally:

  GPIO.cleanup()

4. Сохранив наш скрипт, давайте продолжим и быстро пробежимся по нему, чтобы убедиться, что все работает так, как должно быть. Запустите сценарий, введя следующую команду, и следуйте подсказкам, отображаемым на дисплее 16 × 2.

python3 ~/attendancesystem/check_attendance.py

Если вы столкнетесь с какими-либо ошибками, убедитесь, что вы дважды проверили, что весь код введен правильно.

 Проверка базы данных

1. Теперь, когда мы написали и протестировали как наш сценарий сохранения пользователя, так и сценарий проверки посещаемости, давайте посмотрим на нашу базу данных, чтобы увидеть новые записи. Запустите инструмент командной строки MYSQL, выполнив следующую команду. Вам будет предложено ввести пароль, который вы ввели для пользователя root, прежде чем продолжить. Мы используем sudo для этой команды, поскольку MariaDB по умолчанию использует UNIX_SOCKET для аутентификации.

sudo mysql -u root -p

2.После того, как вы подключились к командной строке MYSQL, нам нужно использовать команду « использовать ». Нам нужно использовать эту команду, чтобы мы могли взаимодействовать с нашей базой данных «системы посещаемости ». Выполните следующую команду, чтобы взаимодействовать с базой данных «системы посещаемости ».

use attendancesystem;

3. Теперь, когда мы напрямую взаимодействуем с нашей базой данных «системы посещаемости», давайте начнем с проверки всех пользователей, которые были созданы нашим скриптом. Мы можем сделать это, запустив простой SQL-вызов SELECT, который указывает нашу таблицу « пользователей ». Звездочка ( * ), используемая в запросе ниже, означает, что мы хотим получить все столбцы. Введите следующую команду, чтобы захватить всех пользователей, доступных в таблице « пользователи ».

SELECT * FROM users;

Из этой команды вы должны увидеть что-то вроде того, что показано ниже.

+--+------------------+---------+------------------------+

| id | rfid_uid       | name    | created                |

+--+------------------+---------+------------------------+

|  1 | 160747764001   | Emmet   | 2019-01-31 11:28:04    |

+--+------------------+---------+------------------------+

4.Теперь, когда мы проверили таблицу « пользователей », давайте посмотрим на нашу таблицу « посещаемости ». Как и в предыдущем запросе, мы просто выбираем все столбцы из таблицы « посещаемость ». Введите следующую команду, чтобы получить все данные.

SELECT * FROM attendance;

В этой команде вы должны увидеть что-то вроде того, что показано ниже в командной строке. Вы можете сослаться на «user_id» обратно на «id» таблицы «users», чтобы увидеть, какой пользователь синхронизировался.

+----+---------+---------------------+

| id | user_id | clock_in            |

+----+---------+---------------------+

|  6 |       1 | 2019-02-01 03:23:30 |

|  7 |       1 | 2019-02-01 03:35:36 |

|  8 |       1 | 2019-02-01 03:36:51 |

+----+---------+---------------------+

Вы можете выйти из инструмента MYSQL, введя exit;

 Создание веб-интерфейса

1.Прежде чем вы начнете этот раздел, мы требуем, чтобы вы на




Необходимо добавить материалы...
Результат опроса Результаты Все опросы нашего сайта Архив опросов
Всего голосовало: 373



          

Радио для всех© 2024