#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10 // SLAVE SELECT la DIGITAL 10
#define RST_PIN 9 // PIN RESET la DIGITAL 9
#define LED_V 5 //LED_Verde la D5
#define LED_R 4 //LED_Rosu la D4
#define BUZZER 2 //BUZZER la D2
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creaza instanta MFRC522.
Servo bariera; //defineste nume Servo
void setup()
{
Serial.begin(9600); // Incepe comunicatia seriala cu PC-ul
SPI.begin(); // Initializeaza bus-ul SPI
mfrc522.PCD_Init(); // Initializeaza MFRC522
bariera.attach(3); //servo pin
bariera.write(0); //servo pozitie start
pinMode(LED_V, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZER, OUTPUT);
noTone(BUZZER);
Serial.println("Apropie cartela...[x][][]");
delay(2500);
Serial.println("Apropie cartela...[x][x][]");
delay(3500);
Serial.println("Apropie cartela...[x][x][x]");
delay(4500);
Serial.println("Astept raspuns utilzator!");
Serial.println();
}
void loop()
{
// Cauta cartele noi
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Selecteaza una dintre cartele
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Arata UID pe monitorul serial
Serial.print("ID Tag/Cartela: ");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Mesaj : ");
content.toUpperCase();
if (content.substring(1) == "A0 B9 8D 7C") //aici schimbam ID-ul (UID-ul) cartelelor autorizate, citite anterior pe monitorul serial
{
Serial.println("Acces autorizat! Bine ati venit!");
Serial.println();
delay(500);
digitalWrite(LED_V, HIGH);
tone(BUZZER, 350);
delay(300);
noTone(BUZZER);
bariera.write(120);
delay(5000);
bariera.write(0);
digitalWrite(LED_V, LOW);
}
else {
Serial.println(" Access interzis! La revedere!");
digitalWrite(LED_R, HIGH);
tone(BUZZER, 300);
delay(1000);
digitalWrite(LED_R, LOW);
noTone(BUZZER);
}
}
Таким образом, если RFID CARD / TAG имеет значение «A0 B9 8D 7C», LED_V загорается, короткий звуковой сигнал и серво (здесь называемый bariera) поворачивается на 120 градусов.
Если RFID CARD / TAG НЕ «A0 B9 8D 7C», LED_R горит, длинный звуковой сигнал и серв ничего не делают.
Я также сделал переключатель из алюминиевой фольги (два листа алюминия, разделенные картоном, при нажатии ((digitalRead (IESIRE) == 0) должен: LED_V светится, короткий сигнал зуммера, и сервопривод (здесь называется bariera) поворачивается на 120 градусов).
Вот код для всего этого с включенным переключателем (#define IESIRE 6):
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10 // SLAVE SELECT la DIGITAL 10
#define RST_PIN 9 // PIN RESET la DIGITAL 9
#define LED_V 5 //LED_Verde la D5
#define LED_R 4 //LED_Rosu la D4
#define BUZZER 2 //BUZZER la D2
#define IESIRE 6 // IESIRE la D6
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creaza instanta MFRC522.
Servo bariera; //defineste nume Servo
void setup()
{
Serial.begin(9600); // Incepe comunicatia seriala cu PC-ul
SPI.begin(); // Initializeaza bus-ul SPI
mfrc522.PCD_Init(); // Initializeaza MFRC522
bariera.attach(3); //servo pin
bariera.write(0); //servo pozitie start
pinMode(LED_V, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(IESIRE, INPUT);
digitalWrite(IESIRE, HIGH);
noTone(BUZZER);
Serial.println("Apropie cartela...[x][][]");
delay(2500);
Serial.println("Apropie cartela...[x][x][]");
delay(3500);
Serial.println("Apropie cartela...[x][x][x]");
delay(4500);
Serial.println("Astept raspuns utilzator!");
Serial.println();
}
void loop()
{
// Cauta cartele noi
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Selecteaza una dintre cartele
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Arata UID pe monitorul serial
Serial.print("ID Tag/Cartela: ");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Mesaj : ");
content.toUpperCase();
if (content.substring(1) == "A0 B9 8D 7C") //aici schimbam ID-ul (UID-ul) cartelelor autorizate, citite anterior pe monitorul serial
{
Serial.println("Acces autorizat! Bine ati venit!");
Serial.println();
delay(500);
digitalWrite(LED_V, HIGH);
tone(BUZZER, 350);
delay(300);
noTone(BUZZER);
bariera.write(120);
delay(5000);
bariera.write(0);
digitalWrite(LED_V, LOW);
}
else if (content.substring(1) != "A0 B9 8D 7C") {
Serial.println(" Access interzis! La revedere!");
digitalWrite(LED_R, HIGH);
tone(BUZZER, 300);
delay(1000);
digitalWrite(LED_R, LOW);
noTone(BUZZER);
}
else if ((content.substring(1) != "A0 B9 8D 7C") && (digitalRead(IESIRE)==0)) {
Serial.println("Drum bun!");
digitalWrite(LED_V, HIGH);
tone(BUZZER, 350);
delay(300);
bariera.write(120);
delay(5000);
bariera.write(0);
digitalWrite(LED_V, LOW);
}
}
Пожалуйста, не обращайте внимания на заявления if else и прочее, я довольно плохо знаком с кодированием и стараюсь изо всех сил. Так что, если переключатель нажат (это переводит в digitalRead(IESIRE)==0)
) сервопривод должен поворачиваться на 120 градусов, независимо от других утверждений.
CARD/RFID TAG present > recognised > servo to 120 + led, buzzer
present > not recognised > led, buzzer
IF SWITCH is pressed > servo to 120 + led, buzzer REGARDLESS of the CARD stuff.
Я надеюсь, что это имеет смысл, и это более явно.
Трудно сказать, что вы подразумеваете под «последней частью», но давайте предположим, что вы здесь:
else if (content.substring(1) != "A0 B9 8D 7C") {
/* stuff */
}
else if ((content.substring(1) != "A0 B9 8D 7C") && (digitalRead(IESIRE)==0)) {
/* other stuff */
}
Позволяет упростить это:
else if (A) {
/* stuff */
}
else if (A && B) {
/* other stuff */
}
Теперь ты видишь это? Если условие А выполнено, первый бит выполняется, а если нет, то игнорируется.
Если 2-й бит всегда должен быть сделан, уберите «else if», чтобы он всегда проверялся. Если это случай одного или другого, то поставить более конкретную часть (A && B)
перед общим делом.
Кроме того: для производительности и смею сказать ясности, не звоните substr
дважды — магазин substr(...) != "..."
в переменной и просто используйте переменную. Если вы даете ему разумное имя, например, что != "A0 B9 8D 7C"
на самом деле означает, что ваш код становится намного понятнее! Вы также избегаете необходимости менять строку в 2 местах при изменении значений и т. Д.
редактировать:
Итак, из комментариев: ANYTIME digitalRead (IESIRE) == 0 Я хочу, чтобы это произошло: Serial.println («Drum bun!»); digitalWrite (LED_V, HIGH); тон (зуммер, 350); задержки (300); bariera.write (120); … (так далее)
Вы должны сделать это:
else if (content.substring(1) != "A0 B9 8D 7C") {
/* stuff */
}
if (digitalRead(IESIRE)==0) {
/* other stuff */
}
Обратите внимание, что это не else if
и мы удалили лишний чек, который вас не волнует.
Другое редактирование:
Я думаю, что это делает это. Это хороший пример того, почему СУХОЙ (не повторяй себя) важен. У вас есть один кусок из примерно 10 строк, который повторяется для 2 условий — это делает его намного труднее видеть, что происходит дерьмо. Сравните ваш оригинальный код с этой упрощенной версией вашего кода.
if (content.substring(1) == "A0 B9 8D 7C") { //aici schimbam ID-ul (UID-ul) cartelelor autorizate, citite anterior pe monitorul serial
doA();
}
else if (content.substring(1) != "A0 B9 8D 7C") {
do(B);
}
else if ((content.substring(1) != "A0 B9 8D 7C") && (digitalRead(IESIRE)==0)) {
doA();
}I think this is what you want:bool isRightCard = (content.substring(1) == "A0 B9 8D 7C");
bool buttonPressed = digitalRead(IESIRE)==0;
if (isRightCard || buttonPressed) //aici schimbam ID-ul (UID-ul) cartelelor autorizate, citite anterior pe monitorul serial
{
if (buttonPressed)
{
Serial.println("Drum bun!");
}
else
{
Serial.println("Acces autorizat! Bine ati venit!");
}
Serial.println();
delay(500);
digitalWrite(LED_V, HIGH);
tone(BUZZER, 350);
delay(300);
noTone(BUZZER);
bariera.write(120);
delay(5000);
bariera.write(0);
digitalWrite(LED_V, LOW);
}
else {
Serial.println(" Access interzis! La revedere!");
digitalWrite(LED_R, HIGH);
tone(BUZZER, 300);
delay(1000);
digitalWrite(LED_R, LOW);
noTone(BUZZER);
}
Других решений пока нет …