valdemar
-
Публикации
8 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем valdemar
-
-
Спасибо, вечером засяду и буду пробовать. Где-то же собака зарыта....
-
Ребят, ну мысли есть какие - нибудь?
Может кто подскажет как осуществить поиск ключа на совпадение записанного в txt файле на флеш карте? -
@Kitsum Не у каждого на калитке будет замок, у нас общество огорожено, есть 2 официальных входа: 1ый просто калитка, 2ой калитка и автоматический шлагбаум. Сами замки будут установлены непосредственно на КПП. Задача 1 избежать проход посторонних, задача 2 создать неудобства неплательщикам взносов. Шлагбаум уже управляется телефонами, но в дальнейшем хочу тоже к нему прикрутить нрф, т.к. связь в нашем регионе бывает лагает.
Сеть покрыта плотно т.к. год назад растянул оптику и на ключевых местах висят айпикамеры, потиху докупаемся.
НУ КАК-ТО ТАК -
@Kitsum у меня в Садоводческом Обществе 1046 участков, у каждого участка минимум 2 ключа, причем дополнительно проводится проверка на факт задолженности при поднесении ключа. Епром не потянет такое количество ключей это факт, поэтому есть большое желание решить поставленную задачу..
-
@Kitsum , а если попробовать хранить данные ключей на микросд карте, которая на борту изернет шилда? а Изернет шилд использовать для добавления или удаления ключей?
-
Я описывал, но повторюсь :), появляется тоже самое что и при старте контроллера.
Проблему нашел( порт 3306 на сервере в брандмауэре был закрыт). Незнаю почему, но для апатча и скюэля были все порты открыты по умолчанию, но как только прописал открытие порта 3306 вручную, все заработало.
Проблема теперь в другом, отклик от момента подноса ключа к считывателю и открытием около 8ми секунд, это многовато для меня. Пробовал на другом компе с процем i7 и т.д. тоже самое. С чем может это быть связано?
-
Ребята, всем привет. Всем спасибо за развитие темы, полезная штука. Очень давно собирался собрать и вот дошли руки....Я не гений, но и не бот, в кое чем разбираюсь кое в чем нет, поэтому не судите строго. Проблемы с которыми столкнулся:
Код использовал исходный из основного поста, единственное что поменял (это статический айпи прикрутил на ардуину и добавил приветствие для отслеживания монитора как предлагал Kitsum. )
Из схемы что изменено:
- нет спикера, не поставил; (временно)
- вместо кнопки открытия подтянул к 2 пину через 10кОм +5в; (временно)
- вместо переключателя режима, подтянул к 6 пину землю. (временно)
В базе данных при создании таблицы поменял тип переменной uid с bigint на var (т.к. ключи все подобные 16B7FB08, а по другому не могу вставить в базу)
Проблема следующая на данный момент, в мониторе появляется:
Start
IP: 192.168.1.113iT4iT CLUB (C) 2015
https://it4it.clubНа всякий случай запустил пинг ардуины на компе, подношу ключ (любой), гаснет диод (который на 13ой ноге), потом очень тускло светится секунд 8, потом вообще тухнет опять секунд 8, и загорается вновь.
в мониторе появляется опять тоже самое. Пинг не пропадает.
ЧТО ЭТО МОЖЕТ БЫТЬ? Всем спасибо за помощь. С Праздником!!!Код который заливаю в ардуину
Скрытый текст// Необходимые библиотеки 16 B7 FB 08 #include <avr/wdt.h> #include <SPI.h> #include <MFRC522.h> #include <Bounce2.h> #include <Ethernet.h> #include <MySQL_Connection.h> #include <MySQL_Cursor.h> // Необходимые пины #define PIN_SS 9 // RFID #define PIN_RST 8 // RFID #define PIN_RELAY 7 // RELAY7 #define PIN_MODE 6 // MODE #define PIN_TONE 3 // TONE #define PIN_OPEN 2 // OPEN MFRC522 mfrc522(PIN_SS, PIN_RST); byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress server(192, 168, 1, 111); // IP адрес MySQL сервера char user[] = "root"; // MySQL username char password[] = ""; // MySQL password const char QUERY_S[] = "SELECT type FROM test.rc522 WHERE uid = %s;"; const char QUERY_I[] = "INSERT INTO test.rc522 (uid) VALUES ('%s');"; char query[128]; EthernetClient client; MySQL_Connection conn((Client *)&client); MySQL_Cursor cur = MySQL_Cursor(&conn); // String key, lastKey; String typeKey; char toQuery[12]; unsigned long lastKeyTimer = 0; // Переменные необходимые для режима программирования byte modeProgTime = 5; // Количество секунд удержания мастер ключа для входа\выхода в\из режим\а программирования bool mode = false; // НЕ МЕНЯТЬ! bool modeLock = false; // НЕ МЕНЯТЬ! byte modeClean = 0; // НЕ МЕНЯТЬ! unsigned long modeTimer = 0; // НЕ МЕНЯТЬ! // Управление замком unsigned long openTimer = 0; // Защита кнопок от дребезга Bounce key_open = Bounce(); /* Функция звукового оповещения. Принимает параметры: количество звуковых сигналов, частота в герцах, продолжительность звука, пауза в миллисекундах (не обязательно) */ void squeaker(byte count, unsigned int Hz, unsigned int duration, unsigned int sleep = 0) { for(int i=0; i<count; i++) { tone(PIN_TONE, Hz, duration); if(sleep > 0) delay(sleep); } } /* Функция читает EEPROM и составляет список активных ключей Первый байт в памяти содержит количество ключей UID ключа содержит 4 байта Общая память 1 + количество ключей * 4 Максимум можно записать 255 ключей */ void setup() { // Настраиваем сторожевой таймер wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Инициализация используемых пинов // Реле pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); // Кнопка открытия двери pinMode(PIN_OPEN,INPUT_PULLUP); key_open.attach(PIN_OPEN); key_open.interval(5); // Перемычка выбора режима работы (0 - автоматическое закрытие двери, 1 - закрытие двери по ключу) pinMode(PIN_MODE, INPUT); digitalWrite(PIN_MODE, HIGH); // Инициализация консоли Serial.begin(115200); while (!Serial); Serial.println(F("Start")); // Инициализация ридера SPI.begin(); mfrc522.PCD_Init(); // Ethernet.begin(mac); IPAddress ip(192, 168, 1, 113); IPAddress subnet(255, 255, 255, 0); IPAddress gateway(192, 168, 1, 1); IPAddress dns(192, 168, 1, 1); Ethernet.begin(mac, ip, dns, gateway, subnet); Serial.print(F("IP: ")); Serial.println(Ethernet.localIP()); Serial.println(); // Приглашаем в гости Serial.println(F("iT4iT CLUB (C) 2015\nhttps://it4it.club\n")); } void loop() { // Сбрасываем сторожевой таймер микроконтроллера wdt_reset(); if(openTimer > millis()+10000) openTimer = 0; if(lastKeyTimer > millis()+10000) lastKeyTimer = 0; // Изменение режима работы закрытия modeLock = !digitalRead(PIN_MODE); // Открытие двери с кнопки key_open.update(); if(!key_open.read() and openTimer == 0 and !mode) { if(modeLock or (!modeLock and digitalRead(PIN_RELAY))) { openTimer = millis()/1000; digitalWrite(PIN_RELAY, LOW); Serial.println(F("The door opened from the inside\n")); squeaker(5, 3200, 100, 300); } delay(2000); } // Автоматическое закрытие двери if(openTimer != 0) { if(millis()/1000 - openTimer > 5) { openTimer = 0; if(modeLock) { digitalWrite(PIN_RELAY, HIGH); Serial.println(F("* closed lock")); } else { if(!digitalRead(PIN_RELAY)) digitalWrite(PIN_RELAY, HIGH); } } } // Если ключ отсутствует или не читается, не выполняем дальнейший код if(!mfrc522.PICC_IsNewCardPresent()) { // Очистка таймера входа в режим программирования, в случае если ридер свободен if(modeTimer != 0) { if(++modeClean > 5) modeTimer = modeClean = 0; } // Таймер для контроля времени хранения последнего ключа в памяти if(lastKeyTimer != 0) { if((millis()-lastKeyTimer) > 100) { lastKey = ""; lastKeyTimer = 0; } } return; } if(!mfrc522.PICC_ReadCardSerial()) return; // Останавливаем режим очистки modeClean = 0; // Читаем ключ for(byte i=0; i<4; i++) key += mfrc522.uid.uidByte[i]; // Один ключ = Один запрос к MySQL серверу. Не флудим. if(key != lastKey) { if(!conn.connected()) { if(!conn.connect(server, 3306, user, password)) { squeaker(5, 1000, 200, 200); return; } } key.toCharArray(toQuery, key.length()+1); sprintf(query, QUERY_S, toQuery); cur.execute(query); column_names *cols = cur.get_columns(); row_values *row = NULL; Serial.println("KEY: " + key); if((row = cur.get_next_row()) != NULL) typeKey = String(row->values[0]); else typeKey = "0"; if(typeKey == F("1") or typeKey == F("2")) { if(!mode) { Serial.println(F("access allow")); // Доступ разрешен if(modeLock) { openTimer = millis()/1000; digitalWrite(PIN_RELAY, LOW); } else digitalWrite(PIN_RELAY, !digitalRead(PIN_RELAY)); squeaker(2, 2200, 200, 200); } else { if(typeKey != F("1")) { Serial.println(F("error: key elrady exists in eeprom")); squeaker(2, 500, 300); } } } else { if(!mode) { Serial.println(F("access dany")); squeaker(1, 500, 1000); } else { Serial.println(F("add key in MySQL")); sprintf(query, QUERY_I, toQuery); cur.execute(query); squeaker(2, 2200, 200, 200); } } lastKey = key; cur.close(); conn.close(); } else { if(typeKey == F("1")) { if(modeTimer == 0) modeTimer = millis()/1000; else { if(millis()/1000 - modeTimer > modeProgTime and modeTimer != 0) { modeTimer = openTimer = 0; if((mode = !mode) == true) { // Вход в режим программирования digitalWrite(PIN_RELAY, LOW); Serial.println(F("MASTER PROGRAMMING MODE ON")); squeaker(4, 1200, 200, 200); } else { // Выход из режима программирования digitalWrite(PIN_RELAY, HIGH); Serial.println(F("MASTER PROGRAMMING MODE OFF")); squeaker(4, 2200, 200, 200); } delay(2000); } } } } lastKeyTimer = millis(); key = ""; }
Замок с радиочастотной идентификацией
в Arduino
Опубликовано: · Жалоба на ответ
Все никак руки не дойдут до теста....
А кто подскажет... а если на меге построить СКУД, сколько она потянет ключей?