Код (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> #include <Servo.h> #define SS_PIN 10 #define RST_PIN 9 #define RED_LED 4 #define GREEN_LED 5 Servo servo; размыкается. 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}, {5,219,213,209,218,} // тут вы что то накосячили, я убрал число 10 и остаток кодов. проверьте список };// 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); servo.attach(6); servo.write(0); } 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); } } void allow() { Serial.println("Access accept!"); //доступ получен servo.write(90); 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(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(5000); servo.write(0); digitalWrite(RED_LED, HIGH); tone(8, 550, 450); delay(500); tone(8, 550, 450); digitalWrite(RED_LED, HIGH); delay(300); digitalWrite(RED_LED, LOW); } void denied() { Serial.println("Access denied!"); //доступ закрыт digitalWrite(RED_LED, HIGH); tone(8, 550, 250); delay(300); digitalWrite(RED_LED, LOW); delay(300); digitalWrite(RED_LED, HIGH); tone(8, 550, 250); delay(300); digitalWrite(RED_LED, LOW); delay(300); digitalWrite(RED_LED, HIGH); tone(8, 550, 250); delay(300); digitalWrite(RED_LED, LOW); delay(300); digitalWrite(RED_LED, HIGH); tone(8, 550, 250); delay(300); digitalWrite(RED_LED, LOW); delay(300); } Расскажу в кратце, хочу сделать rfid замок, все работает. Но я бы хотел, чтобы когда дверь захлопывается только тогда сервопривод двигал шпингалет. Я сам пробовал делать прогу, но ничего не получилось. Сервопривод самопроизвольно двигается не знаю что делать. P.S. Нужен концевик. За рабочую программу могу дать 100 рублей.
В каком смысле. Скорость движения сервы зависит только от самой сервы и все. Вот только закрывать сервой замок надо тогда, когда закрыта дверь. Иначе толку в замке на двери не будет не будет. Спойлер: Мой древнючий код Код (C++): /* //#1 светодиод -> 8 (Led_pin) 0 горит/ 1 нет GND -> GND серва -> 5 (servo_pin) геркон -> A3 (gercon_pin) 0 дверь закрыта / 1 нет //#2 кнопка1 -> A1 (btm1_pin) 0 нажата/ 1 нет GND -> GND кнопка2 -> A2 (btm2_pin) 0 нажата/ 1 нет GND -> GND //#3 Arduino Uno RFID_RC522 RST -> 9 (RST_pin) SDA(SS)-> 10 (SDA_pin) MOSI -> 11 (MOSI_pin) MISO -> 12 (MISO_pin) SCK -> 13 (SCK_pin) 3,3В -> 3,3В GND -> GND Card UID: E6 38 FE 13 брелок Card UID: 5A 5D 39 D5 пластик */ //#1 const int Led_pin = 8 ; // нога светодиода uint8_t Led ; const int interval = 2000 ; // интервал после нажатия клавиши 2 сек #include <Servo.h> Servo myservo; const int servo_pin = 5 ; // нога серво const int servo_OFF = 0; // серва закрыта const int servo_ON = 90; // серва открыта const int gercon_pin = A3 ; // нога геркона uint8_t gercon ; //#2 const int btm1_pin = A1 ; // нога кнопки const int btm2_pin = A2 ; // нога кнопки //#3 uint32_t Card; uint32_t Card1 = 0xE638FE13; uint32_t Card2 = 0x5A5D39D5; //byte uidCard1[4] = {0xE6, 0x38, 0xFE, 0x13}; //byte uidCard2[4] = {0x5A, 0x5D, 0x39, 0xD5}; #include <SPI.h> #include <MFRC522.h> const int SDA_pin = 10; const int RST_pin = 9; MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class void setup() { //#1 pinMode(Led_pin, OUTPUT); digitalWrite(Led_pin, Led = 0); myservo.attach(servo_pin); pinMode(gercon_pin, INPUT_PULLUP); //#2 pinMode(btm1_pin, INPUT_PULLUP); pinMode(btm2_pin, INPUT_PULLUP); //#3 SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 static uint32_t past_1 = 0 ; gercon = digitalRead(gercon_pin); // опрос состояния двери if (!gercon && !Led && (MILLIS - past_1 >= interval)) { // убеждаемся что дверь закрыта и подошло время закрывать на замок digitalWrite(Led_pin, Led = 1); myservo.write(servo_OFF); // закрываем } //#2 if (!digitalRead(btm1_pin)) { // первая открывающая кнопка digitalWrite(Led_pin, Led = 0); past_1 = millis(); myservo.write(servo_ON); } if (!digitalRead(btm2_pin)) { // вторая открывающая кнопка digitalWrite(Led_pin, Led = 0); past_1 = millis(); myservo.write(servo_ON); } //#3 static uint32_t past_3 = 0 ; if (MILLIS - past_3 >= 1000) { past_3 = MILLIS ; if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) { Card = ((rfid.uid.uidByte[0] * 0x100 + rfid.uid.uidByte[1]) * 0x100 + rfid.uid.uidByte[2]) * 0x100 + rfid.uid.uidByte[3]; // if (rfid.uid.uidByte[0] == uidCard1[0] || // rfid.uid.uidByte[1] == uidCard1[1] || // rfid.uid.uidByte[2] == uidCard1[2] || // rfid.uid.uidByte[3] == uidCard1[3] ) { if (Card == Card1) { digitalWrite(Led_pin, Led = 0); past_1 = millis(); myservo.write(servo_ON); } if (Card == Card2) { // if (rfid.uid.uidByte[0] == uidCard2[0] || // rfid.uid.uidByte[1] == uidCard2[1] || // rfid.uid.uidByte[2] == uidCard2[2] || // rfid.uid.uidByte[3] == uidCard2[3] ) { digitalWrite(Led_pin, Led = 0); past_1 = millis(); myservo.write(servo_ON); } } } }
Спойлер: Вот еще один вариант программы Код (C++): /* светодиод -> 8 (Led_pin) 0 горит/ 1 нет GND -> GND серва -> 5 геркон -> 3 0 дверь закрыта / 1 нет кнопка -> 2 0 нажата/ 1 нет GND -> GND RFID_RC522 RST -> 9 (RST_pin) SDA(SS)-> 10 (SDA_pin) MOSI -> 11 (MOSI_pin) MISO -> 12 (MISO_pin) SCK -> 13 (SCK_pin) 3,3В -> 3,3В GND -> GND */ unsigned long mill;//переменная millis() //-------Cl_Lock--------------------------------------- // класс Cl_Lock дверной замок - серво,геркон в дверях,светодиод индикация #include <Servo.h> const int servo_OFF = 0; // серва закрыта const int servo_ON = 90; // серва открыта class Cl_Lock { const byte servoPin; const byte gerconPin; const byte ledPin; unsigned long time, past; Servo myservo; bool doorOpen;// 1 дверь открыта public: /*конструктор Cl_Lock описание создать объект ввод _servoPin: нога на серве _gerconPin: нога на герконе вывод нет */ Cl_Lock(byte _servoPin, byte _gerconPin, byte _ledPin, unsigned long _time) : servoPin(_servoPin), gerconPin(_gerconPin), ledPin(_ledPin), time(_time) {} /*функция setup описание иницилизация ввод нет вывод нет */ void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, 0); myservo.attach(servoPin); pinMode(gerconPin, INPUT_PULLUP); if (!digitalRead(gerconPin))myservo.write(servo_OFF); doorOpen = 1; } /*функция loop описание для нормальной работы вставить в тело loop() ввод нет вывод нет */ void loop() { if (doorOpen && mill - past >= time && !digitalRead(gerconPin)) { // убеждаемся что дверь закрыта и подошло время закрывать на замок doorOpen = 0; digitalWrite(ledPin, 1); myservo.write(servo_OFF); // закрываем } } /*функция open описание открыть дверь ввод нет вывод нет */ void open() { doorOpen = 1; past = mill; digitalWrite(ledPin, 0); myservo.write(servo_ON); } }; //---------Cl_Btn------------------------------------------------- // класс кнопка class Cl_Btn { const byte pin; void (*Do)(); bool btn, oldBtn = 1; bool bounce = 0; unsigned long past; public: /*конструктор Cl_Btn описание создать объект ввод _pin: нога кнопки _Do: обработчик кнопки вывод нет */ Cl_Btn(byte _pin, void (_Do)()): pin(_pin), Do(_Do) {} /*функция setup описание иницилизация ввод нет вывод нет */ void setup() { pinMode(pin, INPUT); btn = digitalRead(pin); } /*функция loop описание для нормальной работы вставить в тело loop() ввод нет вывод нет */ void loop() { bool newBtn = digitalRead(pin); if (bounce && newBtn != btn) { bounce = 1; } if (!bounce && mill - past >= 10) { past = mill; bounce = 0; oldBtn = btn; btn = newBtn; if (!btn && oldBtn) (*Do)(); } } }; //---------Cl_MFRC522------------------------------------------------- // класс MFRC522 кнопка на RFID #include <SPI.h> #include <MFRC522.h> struct sCard { struct sCard *next; unsigned long Card; }; class Cl_MFRC522 { MFRC522 rfid; void (*Do)(); // обработчик кнопки unsigned long past; struct sCard *start = NULL; public: /*конструктор Cl_Btn описание создать объект ввод sdaPin: нога SDA rstPin: нога RST _Do: обработчик кнопки RFID вывод нет */ Cl_MFRC522(byte sdaPin, byte rstPin, void (_Do)()) : rfid(sdaPin, rstPin), Do(_Do) {} /*функция setup описание иницилизация ввод нет вывод нет */ void setup() { SPI.begin(); rfid.PCD_Init(); } /*функция loop описание для нормальной работы вставить в тело loop() ввод нет вывод нет */ void loop() { if (mill - past >= 1000) { past = mill; if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) { uint32_t Card = ((rfid.uid.uidByte[0] * 0x100 + rfid.uid.uidByte[1]) * 0x100 + rfid.uid.uidByte[2]) * 0x100 + rfid.uid.uidByte[3]; Serial.println(Card); for (struct sCard *ii = start; ii != NULL; ii = ii->next) { if (Card == ii->Card) (*Do)(); } } } } /*функция AddCard описание добавить новую карту ввод _Card:код новой карты вывод нет */ void AddCard(uint32_t _Card) { struct sCard *newCard = new struct sCard; newCard->next = start; newCard->Card = _Card; start = newCard; } }; //-----Компоновка----------------------------------------- const unsigned time_3s = 3000; Cl_Lock Lock(/*пин на серво*/5,/*пин на герконе*/3,/*пин индик*/8,/*врямя*/time_3s); void Do_Btn() { Lock.open(); } Cl_Btn Btn(/*пин*/2,/*обработчик*/Do_Btn); Cl_MFRC522 MFRC522(/*пин SDA*/10,/*пин RST*/9,/*обработчик*/Do_Btn); //-----main()----------------------------------------- void setup() { Serial.begin(9600); Lock.setup(); Btn.setup(); MFRC522.setup(); MFRC522.AddCard(4294966803);// добавить карту 4294966803 MFRC522.AddCard(14805) ;// добавить карту 14805 } void loop() { mill = millis(); Lock.loop(); Btn.loop(); MFRC522.loop(); } /*Скетч использует 7062 байт (21%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 298 байт (14%) динамической памяти, оставляя 1750 байт для локальных переменных. Максимум: 2048 байт. */ Код карточки вписывайте тот что программа кидает в Serial