Arduino nano+rfid виснет программа

написал программу доступа по rfid на ардуино нано, но программа виснет, причем по разному, бывает чуть поработает, бывает нажмешь кнопку для выхода и карты больше не считывет но при этом кнопка остается работать, проблема заключается как раз таки в том что перестает считывать карты доступа, как записанные так и те которые не прописаны. `// карта - 02 187 203 27
// брелок - 133 193 216 101
// КАРТА - 242 166 122 26

#include <SPI.h>
#include <MFRC522.h>

const int SS_PIN = 10; // SS вывод модуля RC522
const int RST_PIN = 9; // RST вывод модуля RC522

const int BUZZER = 2; //Пин для Пищалки
const int LED_R = 3; //Пин для Красного цвета
const int LED_G = 4; //Пин для Зелёного цвета
const int LED_B = 5; //Пин для Голубого цвета
const int LOCK = 6; // подключаем электрозамок
const int buttonPin = 7;

char* keys={“133 193 216 101”,“148 159 247 173”}; // ,“242 166 122 26”,“02 187 203 27”

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

void setup()
{
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
pinMode(LED_G, OUTPUT); //объявляем пин как выход.
pinMode(LED_R, OUTPUT); //объявляем пин как выход.
pinMode(LED_B, OUTPUT); //объявляем пин как выход.
pinMode(BUZZER, OUTPUT); //объявляем пин как выход.
pinMode(LOCK, OUTPUT); //объявляем пин как выход.
pinMode(buttonPin, INPUT_PULLUP);
noTone(BUZZER);
digitalWrite(LOCK, HIGH); //Выключаем замок
Serial.println(“Поднесите карту к считывателю”);
}
void loop()
{

if ( ! mfrc522.PICC_IsNewCardPresent()){
if(!digitalRead(buttonPin)==1){
Serial.println(“выходите”);
digitalWrite(LOCK, LOW);
delay(500);
digitalWrite(LOCK, HIGH);
return;
}
}
if ( ! mfrc522.PICC_ReadCardSerial()){
return;
}

Serial.print(“UID:”);
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], DEC);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0” : " "));
content.concat(String(mfrc522.uid.uidByte[i], DEC));
}
Serial.println();
content.toUpperCase();

int x=1;
for (int i = 0; i < sizeof(keys) / sizeof(char *); i++){
if (content.substring(1) == keys[i]){
Serial.println(“Доступ разрешён”);
digitalWrite(LOCK, LOW); // Включаем Замок
digitalWrite(LED_G, HIGH); // Зажигаем Зелёный светодиод
digitalWrite(LED_R, LOW);
digitalWrite(LED_B, LOW);
delay(3000);
digitalWrite(LED_G, LOW); // Гасим Зелёный светодиод
digitalWrite(LOCK, HIGH); // Выключаем Замок
return;
}
else x=0;
}

if(x==0){
Serial.println(“Доступ запрещён”);
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, LOW);
tone(BUZZER, 100);
delay(500);
digitalWrite(LED_R, LOW);
} noTone(BUZZER);

}
`

Если бы Вы знали в чём заключается проблема, Вы бы её решили и этого поста бы не было, так что давайте без таких громких заявлений.

Если Вы хотите, чтобы кто-то посмотрел Ваш код, вставьте его правильно. Как это делается написано в пустом окне сообщения, Вы видимо так торопились написать пост, что не прочитали что там специально для Вас написали.

Вставьте код нормально, тогда поговорим.

// карта - 02 187 203 27
// брелок - 133 193 216 101
// КАРТА - 242 166 122 26

#include <SPI.h>
#include <MFRC522.h>
 
const int SS_PIN = 10;      // SS вывод модуля RC522
const int RST_PIN = 9;      // RST вывод модуля RC522

const int BUZZER = 2;       //Пин для Пищалки
const int LED_R = 3;        //Пин для Красного цвета
const int LED_G = 4;        //Пин для Зелёного цвета
const int LED_B = 5;        //Пин для Голубого цвета
const int LOCK = 6;         // подключаем электрозамок
const int buttonPin = 7;



char* keys[]={"133 193 216 101","148 159 247 173"}; // ,"242 166 122 26","02 187 203 27"

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 
void setup() 
{
  Serial.begin(9600);       // Initiate a serial communication
  SPI.begin();              // Initiate  SPI bus
  mfrc522.PCD_Init();       // Initiate MFRC522
  pinMode(LED_G, OUTPUT);   //объявляем пин как выход.
  pinMode(LED_R, OUTPUT);   //объявляем пин как выход.
  pinMode(LED_B, OUTPUT);   //объявляем пин как выход.
  pinMode(BUZZER, OUTPUT);  //объявляем пин как выход.
  pinMode(LOCK, OUTPUT);    //объявляем пин как выход.
  pinMode(buttonPin, INPUT_PULLUP);
  noTone(BUZZER);
  digitalWrite(LOCK, HIGH);  //Выключаем замок
  Serial.println("Поднесите карту к считывателю");
}
void loop() 
{
  
  if ( ! mfrc522.PICC_IsNewCardPresent()){
    if(!digitalRead(buttonPin)==1){
    Serial.println("выходите");  
      digitalWrite(LOCK, LOW);  
      delay(500);
      digitalWrite(LOCK, HIGH);
    return;
  }
  }
  if ( ! mfrc522.PICC_ReadCardSerial()){
    return;
  }

  Serial.print("UID:");
  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], DEC);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], DEC));
  }
  Serial.println();
  content.toUpperCase();

int x=1;
  for (int i = 0; i < sizeof(keys) / sizeof(char *); i++){
  if (content.substring(1) == keys[i]){
    Serial.println("Доступ разрешён");
    digitalWrite(LOCK, LOW);     // Включаем Замок
    digitalWrite(LED_G, HIGH);    // Зажигаем Зелёный светодиод 
    digitalWrite(LED_R, LOW);
    digitalWrite(LED_B, LOW);
    delay(3000);
    digitalWrite(LED_G, LOW);    // Гасим Зелёный светодиод
    digitalWrite(LOCK, HIGH);     // Выключаем Замок
    return;
  } 
  else  x=0;
}

      
  
    
 if(x==0){
    Serial.println("Доступ запрещён");
    digitalWrite(LED_R, HIGH);
    digitalWrite(LED_G, LOW);
    digitalWrite(LED_B, LOW);
    tone(BUZZER, 100);
    delay(500);
    digitalWrite(LED_R, LOW);
}   noTone(BUZZER);
 

    
     
}

прошу прощения за то что такое говорю, но место вашей программы в мусорном баке

У вас все ключи карточек = это байты. Зачем вы их сначала преобразуете в строки, потом превращаете в обьекты String, а потом пытаетесь сравнивать String с указателями на символ?
Хранить ключ в виде строк

  • это все бредятина полная.

Вы с РФИД получаете номер карты в виде байт. Запишите свои ключи тоже в виде байт и сравнивайте по одному байту.

я не писал на ардуино лет 5, основы уже не помню, поэтому и пришел сюда за помощью, система будет для доступа в рем зону сервиса для персонала через ключ карту, и выход с обратной сторорны через кнопку возле двери, нужна безотказная система чтобы не было проблем

вот эти строчки что, по вашему, делают?

замечаете ли вы, что первая строчка работает с шестадцатиричным числом, а вторая с десятичным? Если да, то обьясните, зачем вы к десятичным числам прибавляете слева ноль?

В целом, повторюсь, в программе не видно ни грана понимания, как работать с байтами и строками. Тут нет возможности поправить одну-две ошибки, тут надо переписывать минимум половину

вы сможете мне помочь с этой программой?

пример, как прочитать номер карточки и сравнить со списком “разрешенных” - легко ищется в инете

А вот вообще готовый замок

много готовых смотрел, попробую сделать то что вы скинули под электромагнитный замок

Думаю, вам надо либо повторить один в один готовый проект, либо заказать в платном разделе. Сами вы не справитесь.

А вообще, я открываю ОЗОН и вижу готовые замки на РФИД. Для вас, как мне кажется, это лучший вариант - всего-то менее 3 тыс


на ардуино выйдет в разы дороже, если код заказывать

Давайте, сначала исправим очевидные ошибки:

Строка №70

 if (content.substring(1) == keys[i])

Условие никогда (от слова совсем никогда) не будет истинным, т.к. Вы сравниваете не строки, а указатели, а они заведомо не равны друг другу. Строки так не сравнивают. Для этого есть функция strcmp.

Исправьте, а потом расскажите как работает, только свежий код не забудьте выложить.

А вот строка №43 получилась весьма забавная! Вы однозначно ошиблись, но случайно получилось так, что она работает правильно. Если позволите, я утащу её в свою рубрику “говнокод по пятницам” (тем более, что сегодня пятница). Что по-Вашему означает это условие? Готов спорить, что Вы хотели написать (следите за скобками)

if (! (digitalRead(buttonPin) == 1) ) {

а реально Вы написали

if ( (! digitalRead(buttonPin)) == 1) {

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

весьма занятно!

Потому и хочу в “говнокод по пятницам” утащить, если ТС разрешит.

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

if ( (! digitalRead(buttonPin)) == 1) {

А какая разница?
И та, и другая запись эквивалентна if( ! digitalRead(buttonPon)) {.

Кому – какая. Компилятору есть какая-то разница, он предупреждение выдаёт, мне тоже – хочу в “говнокод” утащить.

А какая разница Вам – это Вам виднее. Если Вам нет разницы, то “на нет и суда нет”.

2 лайка

Чтобы понять, есть разница или нет, достаточно построить таблицу истинности. Благо, она для данного случая всего две строки.
А что по этому поводу думает компилятор… да какая разница! Главное, чтобы компилировал именно в соответствии с этой таблицей.

Upd. Хотя, подозреваю, что виноват здесь совсем не компилятор, а тот кто присвоил функции digitalRead тип int вместо bool.

Ну, как я уже говорил,

ты их никогда не знал.

да, действительно, только сейчас заметил со скобками, получился говнокод, вот я и хочу исправить все, хотя к удивлению на макете все работает без проблем, а на установленной системе проблемы, как и говорил давно уже не писал на ардуино поэтому и пришел сюда к знающим людям. Я не против, берите код для вашей рубрики)

Ну, с той ошибкой в сравнении строк, что я Вам показал, оно у Вас не могло работать ни на макетке, ни где ещё. Видимо, с тех пор как Вы выложили код, многое изменилось.