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

1shmel1
Offline
Зарегистрирован: 23.08.2016

Все доброе время суток!

Собрал RFID замок с герконом и сервоприводом, все работает шикарно.

Осталось добавить кнопку но не получается. 

Как сделать что-бы при нажатии на кнопку проходил цикл действий такой же как после совпадения uid? 

#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); // Поворачивавшем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.)

          Serial.println("SERVO move 90");

          break;

        }

    }; 

   }

   else

   {

      Serial.println("Gerkon: open");

   }

   

   Serial.println("Waiting 3 sec...\n"); 

   delay(3000);    //Время на открытие двери после того как карта принята

 

}

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

if(кнопка) {открыть двэр};

1shmel1
Offline
Зарегистрирован: 23.08.2016

Не получается. Или я что-то не так делаю.

Назначил пин 8 b состояние кнопки 0

int buttonState = 0;

const int buttonPin = 8;

В void setup назначил 

pinMode(buttonPin, INPUT);

в цикле добавил 

    if (buttonState== 0);
  
  {
   tone(3, 100, 500);

          servo.write(180

          Serial.println("SERVO move 90");

          break;
  }

 

 

А нельзя добавть символ  "или" для открытия сервы? или кнопка или метка. 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Удалите точку с запятой после if (buttonState== 0) - у вас это условие ничего не делает.

vvadim
Offline
Зарегистрирован: 23.05.2012

и здесь исправьте

servo.write(180

на

servo.write(180);

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Часть кода которая отпирает дверь оформите в отдельную функцию которую будете вызывать при совпадении метки или при нажатии на кнопку или пульт или по датчику движения или...

Кнопку безболезненно можно добавить с помощю титанового велосипеда или DigIn

1shmel1
Offline
Зарегистрирован: 23.08.2016

Все равно не работает

Подключал отдельно кнопку с диодом, все работает.

Куда копать не пойму

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Если кор открытия оформить в функцию, то в том месте где вы зажигаете светодиод вызывайте функцию отвечающую за открытие, аналогично и с меткой, если совпала вызываем функцию открытия двери. Как по другому объяснить я не знаю.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Имею два вопроса:

1. Кнопка подтянута (или притянута) резистором куда нибудь?

2. В каком месте кода проверяется состояние пина (buttonState = digitalRead(buttonPin))?

1shmel1
Offline
Зарегистрирован: 23.08.2016

кнопка подключена к 5v через резистр, к 8 пину и земле

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
//#1
светодиод -> 8 (Led_pin) 0 горит/ 1 нет
       GND ->  GND
серва  -> 5 (servo_pin)
геркон -> A3 (gercon_pin) 0 дверь закрыта / 1 нет
//#2
кнопка1 -> A1 (btm1_pin) 0 нажата/ 1 нет
       GND ->  GND
кнопка2 -> A2 (btm2_pin) 0 нажата/ 1 нет
       GND ->  GND
//#3               Arduino Uno
RFID_RC522 RST -> 9 (RST_pin)
        SDA(SS)-> 10 (SDA_pin)
        MOSI   -> 11 (MOSI_pin)
        MISO   -> 12 (MISO_pin)
        SCK    -> 13 (SCK_pin)
        3,3В   -> 3,3В
        GND    -> GND

        Card UID: E6 38 FE 13  брелок
        Card UID: 5A 5D 39 D5  пластик
*/
//#1
const int Led_pin = 8 ; // нога светодиода
uint8_t Led ;
const int interval = 2000 ; // интервал после нажатия клавиши 2 сек

#include <Servo.h>
Servo myservo;
const int servo_pin = 5  ; // нога серво
const int servo_OFF = 0; // серва закрыта
const int servo_ON = 90; // серва открыта
const int gercon_pin = A3  ; // нога геркона
uint8_t gercon ;
//#2
const int btm1_pin = A1  ; // нога кнопки
const int btm2_pin = A2  ; // нога кнопки
//#3
byte uidCard1[4] = {0xE6, 0x38, 0xFE, 0x13};
byte uidCard2[4] = {0x5A, 0x5D, 0x39, 0xD5};
#include <SPI.h>
#include <MFRC522.h>
const int SDA_pin = 10;
const int RST_pin = 9;

MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class

void setup() {
  //#1
  pinMode(Led_pin, OUTPUT);
  digitalWrite(Led_pin, Led = 0);
  myservo.attach(servo_pin);
  pinMode(gercon_pin, INPUT_PULLUP);
  //#2
  pinMode(btm1_pin, INPUT_PULLUP);
  pinMode(btm2_pin, INPUT_PULLUP);
  //#3
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  Serial.begin(9600);
  Serial.println("Scan uidCard");
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  static uint32_t future1 = 0 ;
  gercon = digitalRead(gercon_pin); // опрос состояния двери
  if (!gercon && !Led && (MILLIS >= future1)) { // убеждаемся что дверь закрыта и подошло время закрывать на замок
    digitalWrite(Led_pin, Led = 1);
    myservo.write(servo_OFF);  // закрываем
  }
  //#2
  if (!digitalRead(btm1_pin)) { // первая открывающая кнопка
    digitalWrite(Led_pin, Led = 0);
    future1 = millis() + interval;
    myservo.write(servo_ON);
  }
  if (!digitalRead(btm2_pin)) { // вторая открывающая кнопка
    digitalWrite(Led_pin, Led = 0);
    future1 = millis() + interval;
    myservo.write(servo_ON);
  }
  //#3
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3)   {
    future3 = MILLIS + 1000 ;
    if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
      if (rfid.uid.uidByte[0] == uidCard1[0] ||
          rfid.uid.uidByte[1] == uidCard1[1] ||
          rfid.uid.uidByte[2] == uidCard1[2] ||
          rfid.uid.uidByte[3] == uidCard1[3] ) {
        digitalWrite(Led_pin, Led = 0);
        future1 = millis() + interval;
        myservo.write(servo_ON);
      }
      if (rfid.uid.uidByte[0] == uidCard2[0] ||
          rfid.uid.uidByte[1] == uidCard2[1] ||
          rfid.uid.uidByte[2] == uidCard2[2] ||
          rfid.uid.uidByte[3] == uidCard2[3] ) {
        digitalWrite(Led_pin, Led = 0);
        future1 = millis() + interval;
        myservo.write(servo_ON);
      }
    }
  }
}