Добрый день. Имеется скетч для открывания замка с помощью RFID-rc522 То есть подносишь таблетку к считывателю и серва открывает засов, при этом должен сработать еще и зуммер(на 5пине) если таблетка сработала. Вроде все нормально. Но у меня еще есть кусок провода при перерезании которого должен заорать зуммер(с 5 пина) Так вот, что нужно добавить в скетч, чтоб получилось задуманное? Я так понимаю, что один конец провода вставить к примеру в 4 пин, а второй конец в gnd, объявить его типа #define PD_PIN 4 и, что-то добавить в общем коде? Заранее спасибо всем отозвавшимся. Код (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; void setup() { Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(6); servo.write(0); // устанавливаем серву в закрытое сосотояние } void loop() { // Поиск новой метки 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: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние }
Получается при таком варианте, если кнопка нажата(провод не оборван) значит зуммер молчит, (иначе) то есть если на проводе обрыв, начинает орать зуммер. Правильно? Код (C++): int but = 4; int zum = 5; void setup() { // put your setup code here, to run once: pinMode(but, INPUT); pinMode(zum, OUTPUT); } void loop() { // put your main code here, to run repeatedly: if (digitalRead(but) == HIGH) { digitalWrite(zum, LOW); } else { digitalWrite(zum, HIGH); } }
да, правильно, если есть внешний подтягивающий резистор у кнопки. Если нету, надо писать pinMode(but, INPUT_PULLUP); Вот такой принцип и надо вставить в loop() ПЕРЕД проверкой карты (т.к. там код работы с картой кривой): Код (C++): void loop(){ // Проверка периметра if(digitalRead(but)== HIGH){ tone(5, 200, 500);// Делаем звуковой сигнал. Отмена сирены - поднесением карты } // Поиск новой метки if(! mfrc522.PICC_IsNewCardPresent()){ return; }
Tomasina большое спасибо за помощь. Зуммер в роли сирены работает как надо. А вот в роли индикатора, что ключ принят и замок открывается или закрывается, работает очень странно. Подносишь привязанную таблетку, зуммер начинает пищать не останавливаясь, при повторном поднесении таблетки к считывателю, ничего не происходит, зуммер продолжает реветь до тех пор, пока не перезагрузишь ардуину. При поднесении не привязанной карточки, естественно ничего не происходит. Так вот вопрос, с чем может быть связан этот косяк и может быть такое по причине не подключенной сервы? Её попросту пока нет в наличии. Думал может delay после "tone(5, 200, 500); // Делаем звуковой сигнал, Открытие" но это не помогло. Вот код с изменениями Код (C++): #include <Servo.h> #include <SPI.h> #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 10 #define RST_PIN 9 #define but 4 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате Servo servo; void setup() { Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(6); servo.write(0); // устанавливаем серву в закрытое сосотояние pinMode(but, INPUT_PULLUP); } void loop() { // Проверка периметра if(digitalRead(but)== HIGH){ tone(5, 200, 500);// Делаем звуковой сигнал. Отмена сирены - поднесением карты } // Поиск новой метки 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: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3052608851) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние }
это я к тому, что после прикладывания карты ваш контроллер тупо нифига не делает 3 сек и так по кругу
vvr а какие варианты могут быть по его работе? Что из полезного он может еще делать во время простоя? Просто тема с замками и вообще ардуиной для меня нова, так,ч что если можете, что-то посоветовать, я буду рад. Кстати по вопросу о "незамолкании" зуммера, этот косяк вылазит когда подключаешь активный зуммер, с пассивным же, все работает четко, но тихо((( Как можно решить эту проблему? Зуммеры вот такие, на 3 контакта с подложкой
Желательно избегать такого простоя. Используй функцию millis(). Используй простые конечные автоматы. Чтобы разобраться с этим понадобится время и терпение, но понимание этих приёмов сильно продвинет тебя в программировании. ...вот тебе для примера кусок кода с задержками с использованием millis(), попробуй сделать что-то подобное... Код (C++): switch (state) { case 0: if (digitalRead(DOOR_SENSOR) == 0) { //SOUND ON! <<<---- mp3_play(1); // Dog_sound_time = millis() + 20000; //кажд 20с перезапуск звука state = 1; } break; case 1: if (digitalRead(kost) == 0) { digitalWrite(DOOR, LOW); //открыть //SOUND ON! <<<---- mp3_play(2); //"Собака чавкает и затыкается..." Dog_sound_time = millis() + 5000; state = 2; } if (millis() >= Dog_sound_time) { mp3_play(1); //"Собака рычит" Dog_sound_time = millis() + 30000; } break; case 2: if (millis() >= Dog_sound_time) { mp3_stop(); state = 3; LOCK_time = millis() + 1000; } break; case 3: if (millis() >= LOCK_time) { digitalWrite(DOOR, HIGH); state = 3; } break; case 4: //The End// break; }
Все правильно, ведь код включения зуммера у тебя есть: Код (C++): tone(5, 500, 500); но ни в одной из трех ситуаций кода отключения зуммера нету: Код (C++): noTone(5); Вот он и орет дурниной, дабы прославить своего программиста
ну вопще странно, "tone(5, 500, 500);" - третий параметр duration - длительность сигнала в миллисекундах, если он указан, то генерация сигнала прекратится через указанное время, noTone(5); можно не вызывать. Тут мне кажется всё норм...
А что он должен делать конкретно в этой ситуации?Тут именно должна быть тупая задержка на 3 сек.В других ситуациях да millis().
конструкция Код (C++): if (uidDec == 3052608851) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние не рабочая
Кстати, кто-нить знает где и как посмотреть код этих стандартных дуиновских функций, чтобы понимать как они работают/должны работать? [сори за оффтоп.]
Arduino core https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/cores/arduino и библиотеки https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/libraries. Или на своем компьютере в папке %ProgramFiles%\Arduino\hardware\arduino\avr
спасибо! зы: приколол файл "binary.h"))) я так извращался когда на Keil4 писал для 1986ВЕ92(русский CortexM3)