rfid+relay+servo

sir90
Offline
Зарегистрирован: 02.01.2016

Народ, прошу помощи в изменение скетча 

 #include <SPI.h>
 #include <MFRC522.h>
 #define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
 #define SS_PIN 10
 #define RST_PIN 9
 #define DD 4 // Pin D4 --> выход на реле
 #define ZZ 5 // Pin D4 --> выход на активный зуммер
 #define REL DD // REL - открывает дверь
 MFRC522 mfrc522(SS_PIN, RST_PIN); // MFRC522
 MFRC522::MIFARE_Key key;
 
 // готовим массив карт с флагами доступа 0-нет доступа, 1-есть доступ (спец пропуска)
 struct Cards { 
 String id;
 int flag;
 };
 struct Cards cards[8] ={{"2044319078",1},{"0000000000",1},{"0000000000",1},{"0000000000",1},{"0000000000",0},{"0000000000",0},{"0000000000",0},{"0000000000",0}};
boolean work=false;
unsigned int CUR_TIME;
unsigned int ALL_TIME;
 
void setup(void)
{
 
 while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
 SPI.begin(); // Init SPI bus
 mfrc522.PCD_Init(); // Init MFRC522 card
 
 pinMode(4,OUTPUT);
 digitalWrite(4,HIGH);
 pinMode(5,OUTPUT);
 digitalWrite(5,LOW);
 Serial.begin(115200);
 Serial.print("setup begin\r\n");
}
void loop(void)
{
 ALL_TIME=(millis()/1000);
 if ((ALL_TIME - CUR_TIME)>=5){
 work=true;
 work=false;
 CUR_TIME=ALL_TIME;
 } 
 if (work==false){
 work=true;
 //------------------------РАБОТАЕМ СО СЧИТЫВАТЕЛЕМ КАРТ----------------------------
 // Look for new cards, and select one if present
 if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
 delay(50);
 work=false;
 return;
 }
 
 String UID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
 // mfrc522.PICC_HaltA();
 
 Serial.print(F("Card UID: "));
 Serial.print(UID);
 Serial.println();
 
 //----------------------------------открытие дверей по пропускам--------------------------------
 if (UID!=""){
 for (int i = 0; i <= 7; i++) {
 if (cards[i].id==UID && cards[i].flag==1) {
 DoorOpen(UID);
 work=false;
 return;
 }
 }
 
 }
 }
 work=false;
} //это конец LOOPа
//------------------------выуживаем UID из карты как числовое значение----------------------------
 
String dump_byte_array(byte *buffer, byte bufferSize) {
 // String s;
 unsigned long uiddec = 0;
// unsigned long temp;
 char uid[8];
 for (byte m = (bufferSize > 4 ? (bufferSize - 4) : 0); m < bufferSize; m++) { //берем только последние 4 байта и переводим в десятичную систему
 unsigned long p = 1;
 for(int k = 0; k < bufferSize-m-1; k++) {
 p = p*256;
 }
 uiddec += p*buffer[m];
 // s = s + (buffer[m] < 0x10 ? "0" : "");
 // s = s + String(buffer[m], HEX);
 }
// s.toCharArray(uid, 8); 
 return String(uiddec);
}
 
//-----------открытие двери
void DoorOpen(String uid){
 Serial.print(F("DOOR-OPEN!"));
 Serial.println();
 digitalWrite( REL, LOW );
 for (int i = 0; i <= 6; i++) {
 digitalWrite( ZZ, HIGH ); delay(250);digitalWrite( ZZ, LOW );delay(250);
 digitalWrite( ZZ, HIGH ); delay(250);digitalWrite( ZZ, LOW );delay(250);
 }
 digitalWrite( REL, HIGH );
}

так как в ардуинке не очень селен, нужно реализовать данную схему rfid-relay-servo

 

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

 

ахотелось бы в таком состоянии: при чтение ключа сперва включаеться релешка, если ключ опознан как верныый приходит в дейсвие серво мотор и открывает дверь при повторном поднесении происходит аналагично но серво мотор закрывает дверь

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

sir90 пишет:
a хотелось бы в таком состоянии: при чтение ключа сперва включаеться релешка, если ключ опознан как верныый приходит в дейсвие серво мотор и открывает дверь при повторном поднесении происходит аналагично но серво мотор закрывает дверь

Ну вы загнули. У существующих серво нет такой силы, что бы закрыть(открыть) дверь. Максимум открыть, закрыть замок. Опять же закрывать замок надо, когда дверь закрыта.  Или у вас кукольный дом.