как добавить кнопку
- Войдите на сайт для отправки комментариев
Втр, 23/08/2016 - 15:13
Все доброе время суток!
Собрал 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); //Время на открытие двери после того как карта принята
}
if(кнопка) {открыть двэр};
Не получается. Или я что-то не так делаю.
Назначил пин 8 b состояние кнопки 0
В void setup назначил
в цикле добавил
if (buttonState== 0); { tone(3, 100, 500); servo.write(180 Serial.println("SERVO move 90"); break; }А нельзя добавть символ "или" для открытия сервы? или кнопка или метка.
класс титановый велосипед для тактовой кнопки.
Удалите точку с запятой после
if(buttonState== 0) - у вас это условие ничего не делает.и здесь исправьте
servo.write(180наservo.write(180);Часть кода которая отпирает дверь оформите в отдельную функцию которую будете вызывать при совпадении метки или при нажатии на кнопку или пульт или по датчику движения или...
Кнопку безболезненно можно добавить с помощю титанового велосипеда или DigIn
Все равно не работает
Подключал отдельно кнопку с диодом, все работает.
Куда копать не пойму
Если кор открытия оформить в функцию, то в том месте где вы зажигаете светодиод вызывайте функцию отвечающую за открытие, аналогично и с меткой, если совпала вызываем функцию открытия двери. Как по другому объяснить я не знаю.
Имею два вопроса:
1. Кнопка подтянута (или притянута) резистором куда нибудь?
2. В каком месте кода проверяется состояние пина (buttonState = digitalRead(buttonPin))?
кнопка подключена к 5v через резистр, к 8 пину и земле
/* //#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); } } } }