открытие замка сервомотором при последовательном приложении FRID меток.
- Войдите на сайт для отправки комментариев
Втр, 30/05/2017 - 16:04
Приветствую, я начал заниматься ардуино совсем недавно, решил сделать программу, которая открывает замок (поворачивает сервомотор) при последовательном правильном приложении к сенсору меток. получился вот такой код:
#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 counter = 0; // добавляем счётчик 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 метки в консоль. delay(1000); if (uidDec == 3491476559) // Сравниваем Uid метки, если он равен заданому то увеличиваем счётчик на 1, если нет, то сбрасываем { if (counter == 0) { counter++; Serial.println( counter); } else { counter =0; Serial.println("couner reset1"); } } if (uidDec == 4210874628) // Сравниваем Uid метки, если он равен заданому то увеличиваем счётчик на 1, если нет, то сбрасываем { if (counter == 1) { counter++; Serial.println( counter); } else { counter =0; Serial.println("couner reset2"); } } if (counter == 2) // если счётчик равен заданному значению работает мотор { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие servo.write(0); // механизм запирается. counter = 0; // сбрасываем счётчик Serial.println("couner reset3"); } }
ещё я хочу добавить таймер, который будет включаться после первого приложения метки и сбрасывать счётчик если в течении 5 секунд не приложить вторую метку, но не смог понять как это сделать.
Очень прошу вашей помощи в этом вопросе
решил сделать программу... получился вот такой код:
Давайте уточним, Вы решили найти готовый код и нашли его вот в этой теме. И не спорьте, пожалуйста. Человек, сам написавший этот код не может не понимать как сделать задержку.
ещё я хочу добавить ... но не смог понять как это сделать.
Просто подумайте и сделайте.
Для начала сделайте отдельно (самостоятельной программой) отработку задержки, а потом попробуйте вставить её в этот код. Если будет работать неправильно, публикуйте что получилось, обсудим.
Очень прошу вашей помощи в этом вопросе
Помощь обязательно будет, если Вы попытаетесь сделать самостотельно и у Вас не получится.
Тем же, кто скачал чужой код и просит, чтобы его модифицировали, помогают не здесь, а в другом разделе форума.
я взял код из той темы, и модифицировал его под свои нужды
отработка завдержки используя millis или библиотеку SmartDelay получается но в первом случае счётчик начинает отчёт от начала программы и срабатывает в любом случае через определенный период, что мне не подходит, во втором случае период отчёта начинается от срабатывания первой метки и постоянно повторяется, если не попасть в этот промежуток то мотор не поворачивается
Просто продумайте логику работы задержки, выпишите её на бумаге и внимательно запрограммируйте.
дело в том, что я не очень хорошо представляю как это должно быть реализовано, знаю только что должно получится, так как не имею достаточных знаний в вопросе, поэтому я и хочу попросить помощи, подскажите каим методом это можно сделать а я прочитаю про него и попробую вставить в код
Легко. Вот только и не для всех йорурты полезны. Создаешь класс - Серво-замок с двумя методами ON1() и ON2(). Если их вызывать последовательно и заданое время - то замок естественно откроится. А еще создаешь класс анализатора frid меток с двумя обработчиками: 1 - опозналась метка 1 , а 2 - разумеется вторая. Собираешь в общую кучу и готово. Вот только скетч приведеный выше надо очень сильно переписать.
спасибо, но основной вопрос, какой метод использовать чтобы после приложения первой метки начался отчет и счётчик сбросился если не приложить вторую
А пусть сам замок решает когда ему надо открывать замок а когда нет. Но если между методами ON1 и ОN2 то ему точно открвать не надо.
И вот вам схема программы.
благодарю, буду разбираться
А это на серве и 3 кнопках
я не очень хорошо представляю как это должно быть реализовано, знаю только что должно получится,
Беда в том, что Вы и этого не знаете. В смысле не знаете с нужным уровнем детализации.
Я вот предложил Вам сесть и расписать что должно получиться, Вы этот совет проигнорировали. дело Ваше. Если бы Вы ему последовали, расписали бы и показали бы мне, я бы указал что не так распиано, Вы бы поправили. В итоге, Вы бы и сами не заметили как из этой словесной росписи получилась бы программа. Но Вы, видимо посчитали. что я пошутил насчёт "сесть и расписать" - дело Ваше.
Помните у "Наутилуса" Андрей домогался к Христу - "научи по воде ходить", а тот ему - "повиси на кресте и приходи", а Андрей - "типа, хрен с ним с крестом, ты по воде ходить научи". Так и у нас с Вами. Делать то, что нужно для того, чтобы научиться Вы не хотите, и жалуетесь, что не получается.
логика работы программы видится мне следующим образом:
ожидание метки-> метка1-> запуск таймера, увеличение счётчика на 1, если нет то счётчик=0-> метка2-> если счётчик =1 и таймер<10сек ->увеличение счётчика на 1, если нет то счётчик=0->метка3-> если счётчик =2 и таймер<10сек ->увеличение счётчика на 1, если нет то счётчик=0->если счётчик=3, открытие мотора-> закрытие мотора, счётчик=0
BlackWizard. Так программировать уже не "модно", я бы сказал отстойно, убого . Сети умные дома Интернет и прочая хрень , которая требует другого подхода к программированию . Вот только "программирование в Ардуине" находится в ЖОПЕ. Никогда не смотри что у вас 1 Ардуина. Рассматривайте что у вас БРИГАДА из классов. У вас FRID датчик . Что он должен делать? Подать сигналы что пришла 1 карточка, пришла 2 карточка, пришла левая карточка и все. У вас Серва . Что она должна делать? Если последовательно пришло по времени 2 сигнала : 1 карточка, 2 карточка . В других случаях на все забить.
ПС: модернизировал программу с сервой и кнопками , если кому интересно, то можно "покататься"
дело в применении этой программы, она и не должна быть очень сложной, максимальная простота и понятность, вот что надо. Этой программой будет контролироваться крышка сундука, которая откроется при определенных условиях.
О чем вы. Если вы такой дикий , то пользуйтесь каменными орудиями труда. А если вы не хотите диким , то учитесь. Вы наверное пользуетесь смартфонами и компьютерами. А ведь это сложные вещи. Даже если надо просто написать что-то или посмотреть фильм. Не я такой, это жизнь такая. И что бы сделать что-то простое надо учится . Здесь и пожилые люди приходят на форум. А ведь у них вроде скоро пенсия, но нифига прогресс догонит их раньше, чем пенсия.
не нужно микроскопом гвозди забивать, если что-то можно сделать просто, оно должно быть простым, если будет необходимо, то нужно сделать сложно, вот и всё. Не надо плодить сущности сверх необходимого.
не нужно микроскопом гвозди забивать, если что-то можно сделать просто, оно должно быть простым, если будет необходимо, то нужно сделать сложно, вот и всё. Не надо плодить сущности сверх необходимого.
Вот вы опять несете хрень . УСТРОЙСТВО ДОЛЖНО БЫТЬ ПРОСТЫМ В ИСПОЛЬЗОВАНИИ, но само устройство может быть сложным, тем более все равно процесс копирования дешев, чем разработка. Сейчас эра массового производства, чем штучного. У меня мои программы влегкую работают совместно не мешая друг другу. У меня нет проблем совмещать разные компоненты моих программ. У меня даже на отладку программы уходит меньше времени из-за мнимой "по вашей точке зрения сложности".
Я верю, но я не программист, я хочу написать простой код, для решения простой задачи и чтобы он был понятен другим таким же людям. Я просто не разобрался в одном вопросе, а именно, как вставить в код таймер, поэтому и задал вопрос.
Согласен. Но видишь ли, мы окружены вещами, которые простыми только кажутся. На вас обувь, штаны, рубашка,футболка. Что может быть проще. Ну да ,пошел, купил ,одел. Но если вы начнете ее шить. Хрен с ним,с горем попалам, пошили. Так вы это носить не будете. Все одеты с иголочки, только вы ,как пугало. Еда. Что проще еды. Но если вы за ней пойдете в супермаркет, то вам придется напрягать мозг, что купить. Вдумайтесь . Что проще процесса покупки еды. Разумеется можно набрать всякой дряни, но зачем покупать дрянь и ей питатся, если питаться хочется получше и быть здоровее. Вернемся к нашей теме. В типичных скетчах Ардуины основная проблема. Скетчи работают замечательно, но каждый на свой Ардуине. А вот собираться в кучу и работать совместно у них получается не очень. Или хреново работают ,или человеку надо напрягать мозг ,как их собрать в кучу. Я решил эту проблему. И что в итоге. Компоненты надо писать самому. Да и программа остальным кажется охуительно сложной. Но она эта программа деревянная и с помощью нее легко программировать простые задачи. ПС: В последнем моем коде я могу в легкую прицепить еще 5 RFID устройств и еще 5 серв , и они все будут выполнять такие же задачи на одной Ардуине. При обычном подходе это не выйдет.
А еще создаешь класс
Извините, что прерываю вашу научную беседу, но тема мне настолько интересна .... разрешите мне присесть ...
Вы действительно считаете, что программировать ардуино удобнее с помощью классов??? Создаете класс (он память у ардуино занимает или нет - я не в курсе) и потом инициализируете один единственный экземпляр этого класса????
Самое интересное, что с классами код компактнее, чем простыней. Я говорю о коде, а не исходнике. Опять же вы знакомы с терминами: программирование сверху вниз и снизу вверх?
Самое интересное, что с классами код компактнее, чем простыней. Я говорю о коде, а не исходнике.
Я просто никогда не задумывался о использовании классов при программировании ардуино, хотя, естественно, использую готовые библиотеки ... нужно попробовать переписать что-нить свое с использованием классов и посмотреть, будет ли код более "красив" ...
Ну не все так гладко. Программирование с помощью классов требует более серьезного изучения, а то получится как мартышка и очки.
Вот еще одна моя программа . Посылание импульса 1 сек по нажатию кнопки . Рабочая я проверял.
А теперь покажу как обе программы собрать в кучу и они будут работать независимо друг от друга.
А вот результат объединения. Я уверен что обе программы работают. Чем не облегчение труда программиста.
Ну не все так гладко. Программирование с помощью классов требует более серьезного изучения, а то получится как мартышка и очки.
Понимаю ваш педагогический настрой, но с классами я разберусь сам. Единственное, что мне не нравится в вашем коде - это использование "небезопасного" кода (пардон за тавтологию) и использование имен методов, могущих ввести в заблуждение.
Ну извините , за мной нет отработаной школы. Приходится самому разбираться ,что "опасно", что "безопасно", а что "банальные устоявшие заблуждения".
ПС:http://document.saraff.ru/
http://document.saraff.ru/
Интересно, сей документ во всех ипостасях применим к программированию ардуино или нет?
Интересно, сей документ во всех ипостасях применим к программированию ардуино или нет?
И разумеется к Ардуине. Но разработчики среды Ардуино , немного внесли косяков в Си среды.
Спасибо
логика работы программы видится мне следующим образом:
ожидание метки-> метка1-> запуск таймера, увеличение счётчика на 1, если нет то счётчик=0-> метка2-> если счётчик =1 и таймер<10сек ->увеличение счётчика на 1, если нет то счётчик=0->метка3-> если счётчик =2 и таймер<10сек ->увеличение счётчика на 1, если нет то счётчик=0->если счётчик=3, открытие мотора-> закрытие мотора, счётчик=0
Ну, вот что-то подобное я и предполагал. У Вас каша в голове, потому Вы и не можете написать программу, поскольку запрограммировать кашу - это высшая лига в программировании, Вам рано :)
Если хотите, я могу Вас пошагово довести от того, что Вы тут написали до такой записи, которая сама Вам даст собственно и программу, и навык на будущее - как это делается. Но при этом Вы должны делать то, что я скажу шаг за шагом, не считать. что что-то и так понятно - можно пропустить (как Вы сначала поступили с росписью на бумаге). Вы будете так работать? Просто, если не хотите и делать не будете, я не буду время тратить.
Ну, вот что-то подобное я и предполагал. У Вас каша в голове, потому Вы и не можете написать программу, поскольку запрограммировать кашу - это высшая лига в программировании, Вам рано :)
Если хотите, я могу Вас пошагово довести от того, что Вы тут написали до такой записи, которая сама Вам даст собственно и программу, и навык на будущее - как это делается. Но при этом Вы должны делать то, что я скажу шаг за шагом, не считать. что что-то и так понятно - можно пропустить (как Вы сначала поступили с росписью на бумаге). Вы будете так работать? Просто, если не хотите и делать не будете, я не буду время тратить.
Давайте попробуем