Спасибо за ответ, но на данном этапе для меня главной задачей стоит создание такого скетча, при помощи которого я бы смог сразу открыть доступ всем 10 карточкам. P.S. Недавно у меня появился Ручной 125 КГц EM4100 RFID Копир Писатель Дубликатор (https://ru.aliexpress.com/item/Hand...32718350113.html?spm=2114.13010608.0.0.WBOM4d) при помощи которого я хотел копировать id одного ключа на другие карточки. Но увы частоты дубликатора и rfid модуля не совпадают, а именно у дубликатора 125 КГц, а у rfid 13,56 МГц соответственно. В результате чего модуль(13,56МГц) не видит скопированные на новые брелки ключи (125КГЦ). Кто-нибудь может подсказать как подвести под одну черту обе эти значения, чтобы этот дубликатор мог бы копировать ключ от одного главного брелка и соответственно этот новый ключ на новом брелке мог читать модуль rfid.
Точно уже и не помню, но мне кажется это было на форуме arduino.ru как я найду страницу дам тебе знать
Код (C++): // mcureen 3 /* MOSI: Pin 11 / ICSP-4 * MISO: Pin 12 / ICSP-1 * SCK: Pin 13 / ISCP-3 * SS: Pin 10 * RST: Pin 9 */ #include <SPI.h> #include <RFID.h> #define SS_PIN 10 #define RST_PIN 9 #define RED_LED 6 #define GREEN_LED 5 RFID rfid(SS_PIN, RST_PIN); const unsigned char master[][5]={ {227,197,145,117,194}, {90,63,99,3,5}, {90,132,142,3,83}, {250,229,196,3,216}, {10,101,141,4,230}, {250,191,109,3,43}, {10,88,184,4,238}, {250,243,195,3,201}, {74,151,2,4,219}, {74,150,202,4,18}, {74,12,148,4,214}, {69,156,215,101,107} };// allowed card const int master_size = sizeof(master)/sizeof(master[0]); bool compare_nums( const unsigned char a[5], const unsigned char b[5] ) { for(char i = 5; 0 <= --i; ) { if( a[i] != b[i] ) return false; } return true; } bool check_num( const unsigned char a[5] ){ for( int i = master_size; 0 <= --i; ){ if(compare_nums(a, master[i])) return true; } return false; } void indication(int led); void allow(); void denied(); void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); } void loop() { if (rfid.isCard()) { if (rfid.readCardSerial()) { /* Reading card */ Serial.println(" "); Serial.println("Card found"); Serial.println("Cardnumber:"); for (char i = 0; i < 5; i++) { Serial.print(rfid.serNum[i]); Serial.print(" "); } Serial.println(); //verification if(check_num(rfid.serNum)) { allow(); } else { denied(); } } } else { digitalWrite(GREEN_LED, HIGH); // rfid.halt(); } } void allow() { Serial.println("Access accept!"); //доступ получен digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH); delay(200); digitalWrite(GREEN_LED, LOW); tone(8, 2500, 200); delay(200); digitalWrite(GREEN_LED, HIGH); delay(200); digitalWrite(GREEN_LED, LOW); tone(8, 2500, 200); delay(200); digitalWrite(RED_LED, LOW); } void denied() { Serial.println("Access denied!"); //доступ закрыт digitalWrite(RED_LED, HIGH); tone(8, 100, 200); delay(300); digitalWrite(RED_LED, LOW); delay(300); digitalWrite(RED_LED, HIGH); tone(8, 100, 200); delay(300); digitalWrite(RED_LED, LOW); delay(300); } и вот коды которые я хотел бы записать карта 1 227,197,145,117,194 карта 2 90,63,99,3,5 карта 3 90,132,142,3,83 карта 4 250,229,196,3,216 карта 5 10,101,141,4,230 карта 6 250,191,109,3,43 карта 7 10,88,184,4,238 карта 8 250,243,195,3,201 карта 9 74,151,2,4,219 карта 10 74,150,202,4,18 карта 11 74,12,148,4,214 брелок 69,156,215,101,107
Спасибо. Сейчас посмотрю Большое спасибо. Наконец-то нашелся добрый человек который решил мою проблему, мучавшую меня несколько дней!
Добавил 2 потерянных кода. // mcureen 3 В общем тестируйте, и жмите "Мне нравится". Есть карточки, которые ненадо пускать? На них проверьте, что действительно не пускает.
Проверил, блокирует Есть у меня электрический замок буду управлять им с помощью реле. Мне нужно написать в сетапе pinMode(Relay1, OUTPUT) или #define relay1?
И то и другое. Соблюдая регистр! Но макросы обычно заглавными буквами пишут. Это не обязательно, но так принято. Обычно Код (C++): #define RELAY1 5 // Часто модуль реле имеет неожиданную логику. На LOW - замыкается, на HIGH размыкается. // Укажите уровни пина для открытого и закрытого состояния. #define RCLOSE HIGH #define ROPEN LOW пишут в начала скетча, чтобы проще было, например, менять номера пинов. В данном случае 5, но не знаю какой у вас пин. А digitalWrite и pinMode в setup() нужно сунуть, чтобы реле сразу закрыло замок. Код (C++): void setup() { Serial.begin(9600); ... digitalWrite(RELAY1, RCLOSE); // Изначально закрыто pinMode(RELAY1, OUTPUT); }
Очень важный момент. При отключении питания замок должен открыться или закрыться? Естественно, после включения замок должен быть закрыт.
Спасибо. Должен закрыться. Если реле активируется замок открывается следовательно если нет питания закрывается. Такой принцип работы
С RELAY1 так получается. Не уверен, что 0.8 сек (длительность зеленой цветомузыки) достаточно, чтобы открыть дверь. И другие карточки пока замок открыт и играет зеленая цветомузыка не читаются. Из allow убрал двойное отключение красного. Он и так выключен. В loop добавил отключение зеленого, когда модуль занят чтением карты. Ну чтобы было симметрично состоянию, когда карты нет. Когда красная цветомузыка, то наверное и не важно, что карточки не читаются.
Код (C++): // mcureen 4 /* MOSI: Pin 11 / ICSP-4 * MISO: Pin 12 / ICSP-1 * SCK: Pin 13 / ISCP-3 * SS: Pin 10 * RST: Pin 9 */ #include <SPI.h> #include <RFID.h> #define SS_PIN 10 #define RST_PIN 9 #define RED_LED 6 #define GREEN_LED 5 #define RELAY1 7 // Часто модуль реле имеет неожиданную логику. На LOW - замыкается, на HIGH размыкается. // Укажите уровни пина RELAY1 для открытого и закрытого состояния. #define RCLOSE HIGH #define ROPEN LOW RFID rfid(SS_PIN, RST_PIN); const unsigned char master[][5] PROGMEM = { {227,197,145,117,194}, {90,63,99,3,5}, {90,132,142,3,83}, {250,229,196,3,216}, {10,101,141,4,230}, {250,191,109,3,43}, {10,88,184,4,238}, {250,243,195,3,201}, {74,151,2,4,219}, {74,150,202,4,18}, {74,12,148,4,214}, {69,156,215,101,107} };// allowed card const int master_size = sizeof(master)/sizeof(master[0]); bool compare_nums( const unsigned char a[5], const unsigned char b[5] ) { for(char i = 5; 0 <= --i; ) { if( a[i] != b[i] ) return false; } return true; } bool check_num( const unsigned char a[5] ){ for( int i = master_size; 0 <= --i; ){ if(compare_nums(a, master[i])) return true; } return false; } void indication(int led); void allow(); void denied(); void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); digitalWrite(RELAY1, RCLOSE); // Изначально закрыто pinMode(RELAY1, OUTPUT); } void loop() { if (rfid.isCard()) { digitalWrite(GREEN_LED, LOW); if (rfid.readCardSerial()) { /* Reading card */ Serial.println(" "); Serial.println("Card found"); Serial.println("Cardnumber:"); for (char i = 0; i < 5; i++) { Serial.print(rfid.serNum[i]); Serial.print(" "); } Serial.println(); //verification if(check_num(rfid.serNum)) { allow(); } else { denied(); } } } else { digitalWrite(GREEN_LED, HIGH); // rfid.halt(); } } void allow() { Serial.println("Access accept!"); //доступ получен digitalWrite(RELAY1, ROPEN); digitalWrite(GREEN_LED, HIGH); delay(200); digitalWrite(GREEN_LED, LOW); tone(8, 2500, 200); delay(200); digitalWrite(GREEN_LED, HIGH); delay(200); digitalWrite(GREEN_LED, LOW); tone(8, 2500, 200); delay(200); digitalWrite(RELAY1, RCLOSE); } void denied() { Serial.println("Access denied!"); //доступ закрыт digitalWrite(RED_LED, HIGH); tone(8, 100, 200); delay(300); digitalWrite(RED_LED, LOW); delay(300); digitalWrite(RED_LED, HIGH); tone(8, 100, 200); delay(300); digitalWrite(RED_LED, LOW); delay(300); }