Глава 11. Arduino и 1-Wire
161
Здесь происходит постоянный поиск устройств на линии 1-Wire. Пока ключ не
поднесен к контактной площадке, в монитор последовательного порта выдается
сообщение: No more addresses.
При подключении ключа-таблетки к контактной площадке — ее
номер считывается
и выдается в последовательный порт (рис. 11.7). Только выведен этот номер наобо-
рот — как и положено по протоколу 1-Wire — начиная с младшего байта. Сравните
выдаваемый код с кодом, нанесенным на корпусе ключей.
11.5.2. Режимы
работы
В нашем устройстве предусмотрено два режима работы:
режим пользователя — дает пользователю возможность открыть замок, прило-
жив к считывающей площадке устройства ключ ibutton из списка допуска;
Рис. 11.8. Схема
подключения
162
Часть III. Практическое применение Arduino
режим администратора — позволяет удалять ключи из списка допуска и вносить
ключи в список допуска.
Для аппаратной реализации режима администратора применим две кнопки и жид-
кокристаллический дисплей WH1602. Для подключения
дисплея задействуем вы-
воды Arduino 4–7, 11, 12. Для подключения кнопок используем выводы 8 и 9. Элек-
трическая схема представлена на рис. 11.8.
Список ключей допуска будем хранить в памяти EEPROM. Карта распределения
памяти EEPROM в нашем скетче такова: вся память распределена на блоки по
8 байтов. В первом байте хранится количество ключей в системе, следующие 7 бай-
тов не используются. Далее каждые 8 байтов отводятся под 64-битный
уникальный
код каждого ключа. Байты 8–15 отводятся под ключ администратора. Следующие
байты — под коды ключей для доступа. Пустые байты заполнены значением
0xFF
.
11.5.3. Режим пользователя
В режиме пользователя осуществляется проверка ключа на наличие в списке раз-
решенных. Проверка подключения
ключа происходит в цикле
loop()
. При поднесе-
нии ключа к площадке сверяем его код с кодами разрешенных ключей из памяти
EEPROM. Функция
prov_key()
(листинг 11.2) возвращает
либо номер ключа в списке,
либо 0 при его отсутствии там. Сообщение о результате проверки выводится на
дисплей.
Листинг 11.2
// ************* проверка наличия ключа в EEPROM
int prov_key()
{
byte i1; byte i2;
int count11;
for( i1 = 1; i1 <= count; i1++)
{count11=0;
for( i2 = 0; i2 < 8; i2++) {
if(addr[i2]==EEPROM.read(i1*8+i2))
count11++;
}
if(count11==8)
return i1;
}
return 0;
}
11.5.4. Первоначальный ввод ключа в пустую базу
Процедура
setup()
проверяет память EEPROM для определения
количества ключей
в системе (листинг 11.3). Количество ключей выводится на дисплей.