Как добавить кнопку

Тема в разделе "Arduino & Shields", создана пользователем <shmel>, 23 авг 2016.

  1. <shmel>

    <shmel> Нуб

    Доброго всем времени суток!

    Собрал 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);    //Время на открытие двери после того как карта принята


    }
     
  2. ostrov

    ostrov Гуру

    Непонятно зачем скетч написан через строку. И логика у него немного запутанная. Но если просто добавить проверку кнопки параллельно метке, то примерно так:
    Код (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);    //Время на открытие двери после того как карта принята


    }
     
  3. <shmel>

    <shmel> Нуб

    Непонятно зачем скетч написан через строку. И логика у него немного запутанная. Но если просто добавить проверку кнопки параллельно метке, то примерно так:

    Не работает) подключил кнопку к 7 пину через резистр к 5v и на землю.
    Подключал отдельно кнопку с диодом, все работает.
    Куда копать не пойму
     
  4. ostrov

    ostrov Гуру

    В скетче то исправили на 7 ногу?
     
  5. Крапивин

    Крапивин Нерд

    тоже собрал систему доступа на 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(); // сброс радио кода
    }  }
     
     
    Последнее редактирование: 31 авг 2016
  6. ZAZ-965

    ZAZ-965 Гуру

    @Крапивин, а если так
    Код (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(); // сброс радио кода
    }  }
     
  7. Крапивин

    Крапивин Нерд

  8. <shmel>

    <shmel> Нуб

    Конечно
     
  9. fogary

    fogary Гик

    Нажатие кнопки соответствует низкому уровню?
    В момент нажатия условие выполняются:
    Код (C++):
    if ( Door_Sensor_State == LOW)
    Нажатие не совпадает с паузой 3 с?
    При нажатии кнопки надпись выводится:
    Код (C++):
    Serial.println("SERVO move 90");
     
  10. <shmel>

    <shmel> Нуб

    скетч залил который скинул "ostrov".
    Не как не реагирует на нажатие кнопки.
    Кнопка нужна что бы открыть замок изнутри.
     
  11. fogary

    fogary Гик

    Вы так и не ответили, при нажатой кнопке, на 7 пине какой уровень: низкий или высокий?
     
  12. <shmel>

    <shmel> Нуб

    высокий
     
  13. fogary

    fogary Гик

    А код проверки нажатия ожидает низкий уровень.
    Попробуйте убрать восклицательный знак из проверки:
    Код (C++):
        if (digitalRead(BUTTON)) {     // нажата нопка делаем тоже самое что при совпадении метки
    . . .
        }
     
  14. <shmel>

    <shmel> Нуб

    Не работает. Может что то не хватает в скетче который скинул "ostrov"?
     
  15. fogary

    fogary Гик

    Чисто для проверки. Можете в функции 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);    //Время на открытие двери после того как карта принята
    }
     
  16. fogary

    fogary Гик

    Немного по логике работы.
    В начале loop() проверяется датчик двери. Если дверь закрыта, то идет проверка карты и кнопки. После проверки стоит задержка 3 секунды, судя по комментария, время на открытие двери. Но при этом не проверяется - открывается дверь или нет. Иными словами, задержка будет происходить всегда, в конце функции loop().

    Пробовали, при закрытой двери, нажать и удерживать нажатой кнопку дольше 3 секунд?
     
  17. <shmel>

    <shmel> Нуб

     
  18. fogary

    fogary Гик

    Кажется я догадался:
    Код (C++):
        // Поиск новой метки
        if ( ! mfrc522.PICC_IsNewCardPresent()) {
          return;
        }
        // Выбор метки
        if ( ! mfrc522.PICC_ReadCardSerial()) {
          return;
        }
    Все дело в "return;". Если условие не выполняется, то происходит принудительный выход из функции и до проверки кнопки просто не добирается. Для проверки, вставьте код кнопки перед кодом метки.
     
  19. <shmel>

    <shmel> Нуб

    При нажатии на кнопку серво работает до тех пор, пока ее не отпустишь и сразу же возвращается обратно.
    А должна при нажатии один раз открыть на 180градусов и при замыкании геркона через 3 секунды повернуть обратно
     
  20. <shmel>

    <shmel> Нуб

    добавил в кнопку паузу и все работает отлично.
    Всем огромное спасибо

    Код (C++):
     if (!digitalRead(BUTTON)) {     // нажата нопка делаем тоже самое что при совпадении метки
          tone(3, 100, 500);            // Делаем звуковой сигнал, Открытие
          servo.write(180);             // Поворачивавшем серву на угол 180 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.)
          Serial.println("SERVO move 90");
          delay(3000);
        }