Доброго всем времени суток! Собрал RFID замок с герконом и сервоприводом, все работает шикарно. Осталось добавить кнопку но не получается. Как сделать что-бы при нажатии на кнопку проходил цикл действий такой же как после совпадения uid? Код (C++): #include <Servo.h> #include <SPI.h> #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для хранения номера метки в десятичном формате Servo servo; int Door_Sensor_Pin = 6; // контакт для датчика int Door_Sensor_State = 0; // Состояние геркона const int CardsID_Max=2; //Максимальное количество доступных карт в массиве CardsID unsigned long CardsID[CardsID_Max]; // Массив для IDшников карт void setup() { Serial.begin(9600); Serial.println("\n-----------------------------------------------------------------------------------------\nSetup complete!"); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(5); servo.write(0); // устанавливаем серву в закрытое состояние pinMode(Door_Sensor_Pin, INPUT_PULLUP); // установить Door_Sensor_Pin как вход for(int i=0; i<CardsID_Max; i++) CardsID[i]=0; CardsID[0]=3587036261; CardsID[1]=79447765 ; } void loop() { //delay(1000); //Проверка геркона //Serial.println("\nGerkon check."); Door_Sensor_State = digitalRead(Door_Sensor_Pin); if ( Door_Sensor_State == LOW) // читать Door_Sensor_Pin { //Serial.println("Gerkon closed"); servo.write(0); // устанавливаем серву в закрытое состояние //tone(3, 100, 100); Serial.println("SERVO: close"); // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID:3587036261"); Serial.println(uidDec); // Выводим UID метки в консоль. for(int i=0; i<CardsID_Max; i++) { if(CardsID[i] == uidDec) { tone(3, 100, 500); // Делаем звуковой сигнал, Открытие servo.write(180); // Поворачивавшем серву на угол 180 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.) Serial.println("SERVO move 90"); break; } }; } else { Serial.println("Gerkon: open"); } Serial.println("Waiting 3 sec...\n"); delay(3000); //Время на открытие двери после того как карта принята }
Непонятно зачем скетч написан через строку. И логика у него немного запутанная. Но если просто добавить проверку кнопки параллельно метке, то примерно так: Код (C++): #include <Servo.h> #include <SPI.h> #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 10 #define RST_PIN 9 #define BUTTON 11 // сюда пин кнопки притянутой к +5 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для хранения номера метки в десятичном формате Servo servo; int Door_Sensor_Pin = 6; // контакт для датчика int Door_Sensor_State = 0; // Состояние геркона const int CardsID_Max = 2; //Максимальное количество доступных карт в массиве CardsID unsigned long CardsID[CardsID_Max]; // Массив для IDшников карт void setup() { Serial.begin(9600); Serial.println("\n-----------------------------------------------------------------------------------------\nSetup complete!"); pinMode(BUTTON, INPUT); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(5); servo.write(0); // устанавливаем серву в закрытое состояние pinMode(Door_Sensor_Pin, INPUT_PULLUP); // установить Door_Sensor_Pin как вход for (int i = 0; i < CardsID_Max; i++) CardsID[i] = 0; CardsID[0] = 3587036261; CardsID[1] = 79447765 ; } void loop() { //delay(1000); //Проверка геркона //Serial.println("\nGerkon check."); Door_Sensor_State = digitalRead(Door_Sensor_Pin); if ( Door_Sensor_State == LOW) // читать Door_Sensor_Pin { //Serial.println("Gerkon closed"); servo.write(0); // устанавливаем серву в закрытое состояние //tone(3, 100, 100); Serial.println("SERVO: close"); // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID:3587036261"); Serial.println(uidDec); // Выводим UID метки в консоль. for (int i = 0; i < CardsID_Max; i++) { if (CardsID[i] == uidDec) { tone(3, 100, 500); // Делаем звуковой сигнал, Открытие servo.write(180); // Поворачивавшем серву на угол 180 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.) Serial.println("SERVO move 90"); break; } }; if (!digitalRead(BUTTON)) { // нажата нопка делаем тоже самое что при совпадении метки tone(3, 100, 500); // Делаем звуковой сигнал, Открытие servo.write(180); // Поворачивавшем серву на угол 180 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.) Serial.println("SERVO move 90"); } } else { Serial.println("Gerkon: open"); } Serial.println("Waiting 3 sec...\n"); delay(3000); //Время на открытие двери после того как карта принята }
Непонятно зачем скетч написан через строку. И логика у него немного запутанная. Но если просто добавить проверку кнопки параллельно метке, то примерно так: Не работает) подключил кнопку к 7 пину через резистр к 5v и на землю. Подключал отдельно кнопку с диодом, все работает. Куда копать не пойму
тоже собрал систему доступа на RFID. всё работало отлично. решил добавить, чтоб и с радио брелка открыть можно было. RFID и Радиокнопка, в месте не работают. Кнопка и NFC, а по отдельности, если зарэмить, пол кода, вполне даже быстро. Вот если за ремить с 37 по 56 строки , Радио брелок начинает работать, открывает замок. А если оставить как есть, то только, карты доступа, Радио доступ отказывается работать. и после После 56 строки ничего не работает. Ардвинка на код не ругается. подскажите как заставить их работать, чтоб и карта доступа работала и радио брелок. конечно не синхронно. а на выбор. карта доступа, и удалённо с радио брелка. кнопка. Что не так с этим кодом. возможно что тут конфликт библиотек ?? Код (C++): #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal_I2C.h> #include <RCSwitch.h> LiquidCrystal_I2C lcd(0x27,16,2); // SDA - A4; SCL - A5 RCSwitch mySwitch = RCSwitch(); #define SS_PIN 10 #define RST_PIN 9 #define ted 5 // замок с мотором #5 #define tet 6 // замок с мотором int but =0; word Rkod=0; MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; void setup() { // ********************************************************** Serial.begin(9600); // Initialize serial communications with the PC. Serial.println("Prilozhite kartu ."); // lcd.init(); // Активировать дисплей // lcd.backlight(); // подсветка дисплея // lcd.print(" Zamok Nevidimka"); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. pinMode(ted , OUTPUT); pinMode(tet , OUTPUT); mySwitch.enableReceive(0); } void loop() { // ************************************************* if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec*256+uidDecTemp; } // ------------------------------------------------------------------ if (uidDec == 20460007958) { digitalWrite(ted, HIGH); Serial.println(" Hi Liza"); } // ------------------------------------------------------------------------------------ // void cikl1 () { // while(1){ // Serial.println(" Ne Rabotaet "); // ------------------ if (mySwitch.available()) { Rkod= mySwitch.getReceivedValue(); Serial.print(Rkod); Serial.println(); if ( Rkod == 528 ) { digitalWrite(ted, HIGH); delay(100); digitalWrite(ted, LOW); // lcd.setCursor(0, 1); // lcd.print("OTKRITO po Radio");} } mySwitch.resetAvailable(); // сброс радио кода } }
@Крапивин, а если так Код (C++): #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal_I2C.h> #include <RCSwitch.h> LiquidCrystal_I2C lcd(0x27,16,2); // SDA - A4; SCL - A5 RCSwitch mySwitch = RCSwitch(); #define SS_PIN 10 #define RST_PIN 9 #define ted 5 // замок с мотором #5 #define tet 6 // замок с мотором int but =0; word Rkod=0; MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; void setup() { // ********************************************************** Serial.begin(9600); // Initialize serial communications with the PC. Serial.println("Prilozhite kartu ."); // lcd.init(); // Активировать дисплей // lcd.backlight(); // подсветка дисплея // lcd.print(" Zamok Nevidimka"); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. pinMode(ted , OUTPUT); pinMode(tet , OUTPUT); mySwitch.enableReceive(0); } void loop() { // ************************************************* if ( mfrc522.PICC_ReadCardSerial()) { uidDec = 0; for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec*256+uidDecTemp; } if (uidDec == 20460007958) { digitalWrite(ted, HIGH); Serial.println(" Hi Liza"); } } // ------------------------------------------------------------------------------------ // void cikl1 () { // while(1){ // Serial.println(" Ne Rabotaet "); // ------------------ if (mySwitch.available()) { Rkod= mySwitch.getReceivedValue(); Serial.print(Rkod); Serial.println(); if ( Rkod == 528 ) { digitalWrite(ted, HIGH); delay(100); digitalWrite(ted, LOW); // lcd.setCursor(0, 1); // lcd.print("OTKRITO po Radio");} } mySwitch.resetAvailable(); // сброс радио кода } }
ZAZ-965 Спасибо огромное всё заработало. искал ошибку уже неделю . по разному пробовал . и через switch (cmd) разбивал.
Нажатие кнопки соответствует низкому уровню? В момент нажатия условие выполняются: Код (C++): if ( Door_Sensor_State == LOW) Нажатие не совпадает с паузой 3 с? При нажатии кнопки надпись выводится: Код (C++): Serial.println("SERVO move 90");
скетч залил который скинул "ostrov". Не как не реагирует на нажатие кнопки. Кнопка нужна что бы открыть замок изнутри.
А код проверки нажатия ожидает низкий уровень. Попробуйте убрать восклицательный знак из проверки: Код (C++): if (digitalRead(BUTTON)) { // нажата нопка делаем тоже самое что при совпадении метки . . . }
Чисто для проверки. Можете в функции loop() закомментировать код относящийся к RFID, т. е. оставить только кнопку. Код (C++): void loop() { Door_Sensor_State = digitalRead(Door_Sensor_Pin); if ( Door_Sensor_State == LOW) // читать Door_Sensor_Pin { //Serial.println("Gerkon closed"); servo.write(0); // устанавливаем серву в закрытое состояние //tone(3, 100, 100); Serial.println("SERVO: close"); /* // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID:3587036261"); Serial.println(uidDec); // Выводим UID метки в консоль. for (int i = 0; i < CardsID_Max; i++) { if (CardsID[i] == uidDec) { tone(3, 100, 500); // Делаем звуковой сигнал, Открытие servo.write(180); // Поворачивавшем серву на угол 180 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.) Serial.println("SERVO move 90"); break; } }; */ if (digitalRead(BUTTON)) { // нажата нопка делаем тоже самое что при совпадении метки tone(3, 100, 500); // Делаем звуковой сигнал, Открытие servo.write(180); // Поворачивавшем серву на угол 180 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.) Serial.println("SERVO move 90"); } } else { Serial.println("Gerkon: open"); } Serial.println("Waiting 3 sec...\n"); delay(3000); //Время на открытие двери после того как карта принята }
Немного по логике работы. В начале loop() проверяется датчик двери. Если дверь закрыта, то идет проверка карты и кнопки. После проверки стоит задержка 3 секунды, судя по комментария, время на открытие двери. Но при этом не проверяется - открывается дверь или нет. Иными словами, задержка будет происходить всегда, в конце функции loop(). Пробовали, при закрытой двери, нажать и удерживать нажатой кнопку дольше 3 секунд?
Кажется я догадался: Код (C++): // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Все дело в "return;". Если условие не выполняется, то происходит принудительный выход из функции и до проверки кнопки просто не добирается. Для проверки, вставьте код кнопки перед кодом метки.
При нажатии на кнопку серво работает до тех пор, пока ее не отпустишь и сразу же возвращается обратно. А должна при нажатии один раз открыть на 180градусов и при замыкании геркона через 3 секунды повернуть обратно
добавил в кнопку паузу и все работает отлично. Всем огромное спасибо Код (C++): if (!digitalRead(BUTTON)) { // нажата нопка делаем тоже самое что при совпадении метки tone(3, 100, 500); // Делаем звуковой сигнал, Открытие servo.write(180); // Поворачивавшем серву на угол 180 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.) Serial.println("SERVO move 90"); delay(3000); }