Помогите пожалуйста дописать скетч

Тема в разделе "Arduino & Shields", создана пользователем Stix1191, 29 ноя 2016.

  1. Stix1191

    Stix1191 Нерд

    Добрый день. Имеется скетч для открывания замка с помощью 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);  // устанавливаем серву в закрытое сосотояние
    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    напиши отдельно код включения зуммера при нажатии кнопки
     
  3. Stix1191

    Stix1191 Нерд

    Получается при таком варианте, если кнопка нажата(провод не оборван) значит зуммер молчит, (иначе) то есть если на проводе обрыв, начинает орать зуммер. Правильно?
    Код (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);
    }
    }
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    да, правильно, если есть внешний подтягивающий резистор у кнопки. Если нету, надо писать pinMode(but, INPUT_PULLUP);

    Вот такой принцип и надо вставить в loop() ПЕРЕД проверкой карты (т.к. там код работы с картой кривой):
    Код (C++):
    void loop(){
    // Проверка периметра
    if(digitalRead(but)== HIGH){
    tone(5, 200, 500);// Делаем звуковой сигнал. Отмена сирены - поднесением карты
    }
    // Поиск новой метки
    if(! mfrc522.PICC_IsNewCardPresent()){
       return;
    }
     
    Stix1191 нравится это.
  5. Stix1191

    Stix1191 Нерд

    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);  // устанавливаем серву в закрытое сосотояние
     
    }
     
  6. vvr

    vvr Инженерище

    delay(3000); всю вашу идею паскудит
     
  7. Stix1191

    Stix1191 Нерд

    vvr Вы это к тому, что лучше бы замок закрывался при повторном прикладывании карточки к считывателю?
     
  8. vvr

    vvr Инженерище

    это я к тому, что после прикладывания карты ваш контроллер тупо нифига не делает 3 сек и так по кругу
     
  9. Stix1191

    Stix1191 Нерд

    vvr а какие варианты могут быть по его работе? Что из полезного он может еще делать во время простоя? Просто тема с замками и вообще ардуиной для меня нова, так,ч что если можете, что-то посоветовать, я буду рад.
    Кстати по вопросу о "незамолкании" зуммера, этот косяк вылазит когда подключаешь активный зуммер, с пассивным же, все работает четко, но тихо((( Как можно решить эту проблему?
    Зуммеры вот такие, на 3 контакта с подложкой
     

    Вложения:

  10. Neilon

    Neilon Нерд

    Желательно избегать такого простоя.
    Используй функцию 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;                                
        }
     
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    Все правильно, ведь код включения зуммера у тебя есть:
    Код (C++):
    tone(5, 500, 500);
    но ни в одной из трех ситуаций кода отключения зуммера нету:
    Код (C++):
    noTone(5);
    Вот он и орет дурниной, дабы прославить своего программиста :D
     
    Stix1191 нравится это.
  12. Neilon

    Neilon Нерд

    ну вопще странно, "tone(5, 500, 500);" - третий параметр duration - длительность сигнала в миллисекундах, если он указан, то генерация сигнала прекратится через указанное время, noTone(5); можно не вызывать. Тут мне кажется всё норм...
     
  13. Tomasina

    Tomasina Сушитель лампочек Модератор

    в теории должна, но по факту никогда этот параметр не работает.
     
  14. Airbus

    Airbus Радиохулиган Модератор

    А что он должен делать конкретно в этой ситуации?Тут именно должна быть тупая задержка на 3 сек.В других ситуациях да millis().
     
  15. vvr

    vvr Инженерище

    конструкция
    Код (C++):
    if (uidDec == 3052608851) // Сравниваем Uid метки, если он равен заданому то серва открывает.
      {
        tone(5, 200, 500); // Делаем звуковой сигнал, Открытие
        servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.)
        delay(3000); // пауза 3 сек и механизм запирается.
        tone(5, 500, 500); // Делаем звуковой сигнал,  Закрытие
      }
      servo.write(0);  // устанавливаем серву в закрытое сосотояние
    не рабочая
     
  16. Neilon

    Neilon Нерд

    Кстати, кто-нить знает где и как посмотреть код этих стандартных дуиновских функций, чтобы понимать как они работают/должны работать? [сори за оффтоп.]
     
  17. ZAZ-965

    ZAZ-965 Гуру

    Neilon нравится это.
  18. Neilon

    Neilon Нерд

    спасибо!
    зы: приколол файл "binary.h"))) я так извращался когда на Keil4 писал для 1986ВЕ92(русский CortexM3)