Помогите с кодом

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Помогиите плиз найти ошибку в коде, за ранее благодарю!

#include <EEPROM.h> // Подключаем библиотеку для записи в энергонезависимую память "Card UID" / уникальный номер NFC карты.
#include <SPI.h>
#include <MFRC522.h> // скачанная библиотека "RFID" для RC522 Card Read Module.
#include <Password.h>
#include <Keypad.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Объект MFRC522C / reate MFRC522 instance.
unsigned long uidDec, uidDecTemp;  // Для отображения номера карточки в десятичном формате.
unsigned long CardUIDeEPROMread[] = {
  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
  30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49};
int ARRAYindexUIDcard; // Индекс для массива CardUIDeEPROMread.
int EEPROMstartAddr; // Стартовая ячейка памяти для записи / чтения EEPROM "Card UID".
int LockSwitch = 6; // Замок / Переключатель / Блокиратор.
int OpenDoor = 5; // открыть дверь
int PiezoPin = 7; // Piezo / Динамик.
Password password = Password( "1234" );
const byte ROWS = 4; // Four rows
const byte COLS = 3; //  columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = { 2,A0,7,6 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 5,4,3, };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()
//1 часть, RFID ЗАМОК
{
Serial.begin(9600);
//keypad.addEventListener(keypadEvent);   
//Serial.begin(9600); 
SPI.begin();
mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.
pinMode(PiezoPin, OUTPUT);
digitalWrite(PiezoPin, HIGH),delay(100),digitalWrite(PiezoPin, LOW); // Подадим писк при запуске.
EEPROMreadUIDcard(); // Запускаем функцию, для перезаписи массива CardUIDeEPROMread, данными из EEPROM.
for(int i = 0; i <= 49; i++)Serial.print(i),Serial.print(" ---- "),Serial.println(CardUIDeEPROMread[i]);
  //for (int i = 0; i < 512; i++)EEPROM.write(i, 0); // EEPROM Clear / Очистить / стереть EEPROM. 
}

void loop()
{
{
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
for (byte i = 0; i < mfrc522.uid.size; i++) 
{
uidDecTemp = mfrc522.uid.uidByte[i];
uidDec = uidDec*256+uidDecTemp;  
}  
// Внимание!, замените "Card UID" администратора № 3556194005, на свой "Card UID". 
if (uidDec == 3556194005 || LockSwitch > 0)EEPROMwriteUIDcard(); // Запускаем функцию записи в EEPROM "Card UID" пользователей.
delay(2000);
if (LockSwitch == 0) // только если находимся в "режиме управления".
{
for(ARRAYindexUIDcard = 0; ARRAYindexUIDcard <= 49; ARRAYindexUIDcard++) 
{
if (CardUIDeEPROMread[ARRAYindexUIDcard] > 0) // Перебираем весь массив CardUIDeEPROMread, фильтруем от 0.
{
if (CardUIDeEPROMread[ARRAYindexUIDcard] == uidDec) // Если обнаружено совпадение с поднесенной картой.
{
CommandsCARD(); // Запускаем функцию для выполнения любых действий, в зависимости от "Card UID" поднесённой карты.
break; // Выходим, останавливаем проверку / перебор / поиск, в массиве CardUIDeEPROMread.
}
}
}   
if (ARRAYindexUIDcard == 50)Serial.println("NOT  Found CARD-UID"),Serial.println(uidDec);
delay(2000);    
ARRAYindexUIDcard = 0;
}
} 
void EEPROMwriteUIDcard() {
if (LockSwitch == 0) // Если находились в режиме управления.
{
Serial.println("   START    RECORD   Card UID   CLIENT"); 
for(int i = 0; i <= 2; i++)delay(500),digitalWrite(PiezoPin, HIGH),delay(500),digitalWrite(PiezoPin, LOW); // 3 раза пискнем.
} 
if (LockSwitch > 0) // Если находимся в "режиме записи".
{
// Внимание!, замените "Card UID" администратора № 3556194005, на свой "Card UID". 
if (uidDec == 3556194005) // Если поднесена карта администратора. 
{
Serial.println("   SKIP     RECORD   "); 
Serial.println(EEPROMstartAddr/5); // Выводим № пропущенной ячейки памяти.
EEPROMstartAddr += 5; // Пропускаем запись в ячейку памяти, если не хотим записывать туда "Card UID".
digitalWrite(PiezoPin, HIGH),delay(200),digitalWrite(PiezoPin, LOW); // 1 раз пискнем.
}
else // Иначе, то есть поднесена карта для записи.
{
EEPROM.write(EEPROMstartAddr, uidDec & 0xFF); 
EEPROM.write(EEPROMstartAddr + 1, (uidDec & 0xFF00) >> 8); 
EEPROM.write(EEPROMstartAddr + 2, (uidDec & 0xFF0000) >> 16); 
EEPROM.write(EEPROMstartAddr + 3, (uidDec & 0xFF000000) >> 24);
// Записали!.
delay(10);

//2 часть, КОДОВЫЙ ЗАМОК  


Serial.println("RECORD OK! IN MEMORY "); 
Serial.println(EEPROMstartAddr/5); // Выводим № записанной ячейки памяти.
EEPROMstartAddr += 5; // Прибавляем 5 к стартовой ячейки записи.
for(int i = 0; i <= 40; i++)delay(5),digitalWrite(PiezoPin, HIGH),delay(5),digitalWrite(PiezoPin, LOW); // пискнем.
}   
}
LockSwitch++; // Разблокируем режим записи, и заблокируем режим управления. 
if (EEPROMstartAddr/5 == 50) // если дошли до 50. 
{
delay(2000);
Serial.println("RECORD FINISH"); 
digitalWrite(PiezoPin, HIGH),delay(3000),digitalWrite(PiezoPin, LOW); // Длинный писк.
EEPROMstartAddr = 0;   
uidDec = 0;
ARRAYindexUIDcard = 0;
EEPROMreadUIDcard(); // Запускаем функцию, для перезаписи массива CardUIDeEPROMread, данными из EEPROM.
} 
}
void EEPROMreadUIDcard()
{
for(int i = 0; i <= 49; i++)
{
byte val = EEPROM.read(EEPROMstartAddr+3);   
CardUIDeEPROMread[ARRAYindexUIDcard] = (CardUIDeEPROMread[ARRAYindexUIDcard] << 8) | val; 
val = EEPROM.read(EEPROMstartAddr+2); 
CardUIDeEPROMread[ARRAYindexUIDcard] = (CardUIDeEPROMread[ARRAYindexUIDcard] << 8) | val; 
val = EEPROM.read(EEPROMstartAddr+1); // увеличиваем EEPROMstartAddr на 1.
CardUIDeEPROMread[ARRAYindexUIDcard] = (CardUIDeEPROMread[ARRAYindexUIDcard] << 8) | val; 
val = EEPROM.read(EEPROMstartAddr); 
CardUIDeEPROMread[ARRAYindexUIDcard] = (CardUIDeEPROMread[ARRAYindexUIDcard] << 8) | val;
ARRAYindexUIDcard++; // увеличиваем на 1.
EEPROMstartAddr +=5; // увеличиваем на 5.
}
ARRAYindexUIDcard = 0;
EEPROMstartAddr = 0; 
uidDec = 0;
LockSwitch = 0;
DisplayWAiT_CARD();        
}
void DisplayWAiT_CARD()
{
Serial.println("WAIT");
Serial.println("CARD");
}
void CommandsCARD()
{
Serial.println("Hi "); // Выводим на дисплей "привет".
if (ARRAYindexUIDcard == 0)
{
Serial.println("Dmitry"); // Выводим на дисплей "Dmitry".
digitalWrite(OpenDoor, HIGH),delay(1500),digitalWrite(OpenDoor, LOW);
}  
else if (ARRAYindexUIDcard == 1) // Если Card-UID получен из ячейки № 1 / индекс массива № 1. 
{
Serial.println("Sergey"); 
}
else if (ARRAYindexUIDcard == 2) // Если Card-UID получен из ячейки № 2 / индекс массива № 2.
{
Serial.println("Peter");
}
else if (ARRAYindexUIDcard == 3) 
{
Serial.println("Vasily");
}
else if (ARRAYindexUIDcard == 49) 
{
Serial.println("OSIPOV");
}
Serial.println(CardUIDeEPROMread[ARRAYindexUIDcard]); // Выводим на дисплей обнаруженный Card-UID.
Serial.println(ARRAYindexUIDcard); // Выводим на дисплей  № индекса массива / ячейки, где хранился обнаруженный Card-UID
for(int i = 0; i <= ARRAYindexUIDcard; i++)delay(20),digitalWrite(PiezoPin, HIGH),delay(20),digitalWrite(PiezoPin, LOW);
delay(1); // Дёргаем микроконтроллер.
}


{
keypad.getKey();
}
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
case PRESSED:
Serial.print("Pressed: ");
Serial.println(eKey);
switch (eKey){
case '*': checkPassword(); break;
case '#': password.reset(); break;
default: password.append(eKey);
}
}
}
void checkPassword(){
if (password.evaluate()){
Serial.println("OPEN");
digitalWrite(OpenDoor, HIGH);    //Add code to run if it works
  }else{
Serial.println("CLOASED");
}
password.reset();
}
}
















 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Как Вы себе это видите? Как её искать, если я, например, не знаю, что этот код должен делать по задумке автора и что он делает на самом деле? Сначала я должен догадаться для чего он писался, потом протестировать, обнаружить неадекватность и объяснить её Вам? Не жирно? Может, сами расскажете, что за код, для чего и что с ним не так?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну Хотя бы отформировать строки  было сложно ? Или здесь народ сидит, что бы править ваши "сопли"

#include <EEPROM.h> // Подключаем библиотеку для записи в энергонезависимую память "Card UID" / уникальный номер NFC карты.
#include <SPI.h>
#include <MFRC522.h> // скачанная библиотека "RFID" для RC522 Card Read Module.
#include <Password.h>
#include <Keypad.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Объект MFRC522C / reate MFRC522 instance.
unsigned long uidDec, uidDecTemp;  // Для отображения номера карточки в десятичном формате.
unsigned long CardUIDeEPROMread[] = {
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49
};
int ARRAYindexUIDcard; // Индекс для массива CardUIDeEPROMread.
int EEPROMstartAddr; // Стартовая ячейка памяти для записи / чтения EEPROM "Card UID".
int LockSwitch = 6; // Замок / Переключатель / Блокиратор.
int OpenDoor = 5; // открыть дверь
int PiezoPin = 7; // Piezo / Динамик.
Password password = Password( "1234" );
const byte ROWS = 4; // Four rows
const byte COLS = 3; //  columns
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = { 2, A0, 7, 6 }; // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 5, 4, 3, }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
  //1 часть, RFID ЗАМОК
  Serial.begin(9600);
  //keypad.addEventListener(keypadEvent);
  //Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.
  pinMode(PiezoPin, OUTPUT);
  digitalWrite(PiezoPin, HIGH), delay(100), digitalWrite(PiezoPin, LOW); // Подадим писк при запуске.
  EEPROMreadUIDcard(); // Запускаем функцию, для перезаписи массива CardUIDeEPROMread, данными из EEPROM.
  for (int i = 0; i <= 49; i++)Serial.print(i), Serial.print(" ---- "), Serial.println(CardUIDeEPROMread[i]);
  //for (int i = 0; i < 512; i++)EEPROM.write(i, 0); // EEPROM Clear / Очистить / стереть EEPROM.
}

void loop() {
  if ( ! mfrc522.PICC_IsNewCardPresent()) return;
  if ( ! mfrc522.PICC_ReadCardSerial()) return;
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
  }
  // Внимание!, замените "Card UID" администратора № 3556194005, на свой "Card UID".
  if (uidDec == 3556194005 || LockSwitch > 0) EEPROMwriteUIDcard(); // Запускаем функцию записи в EEPROM "Card UID" пользователей.
  delay(2000);
  if (LockSwitch == 0) {// только если находимся в "режиме управления".
    for (ARRAYindexUIDcard = 0; ARRAYindexUIDcard <= 49; ARRAYindexUIDcard++) {
      if (CardUIDeEPROMread[ARRAYindexUIDcard] > 0) { // Перебираем весь массив CardUIDeEPROMread, фильтруем от 0.
        if (CardUIDeEPROMread[ARRAYindexUIDcard] == uidDec) { // Если обнаружено совпадение с поднесенной картой.
          CommandsCARD(); // Запускаем функцию для выполнения любых действий, в зависимости от "Card UID" поднесённой карты.
          break; // Выходим, останавливаем проверку / перебор / поиск, в массиве CardUIDeEPROMread.
        }
      }
    }
    if (ARRAYindexUIDcard == 50)Serial.println("NOT  Found CARD-UID"), Serial.println(uidDec);
    delay(2000);
    ARRAYindexUIDcard = 0;
  }
}
void EEPROMwriteUIDcard() {
  if (LockSwitch == 0) { // Если находились в режиме управления.
    Serial.println("   START    RECORD   Card UID   CLIENT");
    for (int i = 0; i <= 2; i++)delay(500), digitalWrite(PiezoPin, HIGH), delay(500), digitalWrite(PiezoPin, LOW); // 3 раза пискнем.
  }
  if (LockSwitch > 0) {// Если находимся в "режиме записи".
    // Внимание!, замените "Card UID" администратора № 3556194005, на свой "Card UID".
    if (uidDec == 3556194005) { // Если поднесена карта администратора.
      Serial.println("   SKIP     RECORD   ");
      Serial.println(EEPROMstartAddr / 5); // Выводим № пропущенной ячейки памяти.
      EEPROMstartAddr += 5; // Пропускаем запись в ячейку памяти, если не хотим записывать туда "Card UID".
      digitalWrite(PiezoPin, HIGH), delay(200), digitalWrite(PiezoPin, LOW); // 1 раз пискнем.
    }
    else {// Иначе, то есть поднесена карта для записи.
      EEPROM.write(EEPROMstartAddr, uidDec & 0xFF);
      EEPROM.write(EEPROMstartAddr + 1, (uidDec & 0xFF00) >> 8);
      EEPROM.write(EEPROMstartAddr + 2, (uidDec & 0xFF0000) >> 16);
      EEPROM.write(EEPROMstartAddr + 3, (uidDec & 0xFF000000) >> 24);
      // Записали!.
      delay(10);
      //2 часть, КОДОВЫЙ ЗАМОК
      Serial.println("RECORD OK! IN MEMORY ");
      Serial.println(EEPROMstartAddr / 5); // Выводим № записанной ячейки памяти.
      EEPROMstartAddr += 5; // Прибавляем 5 к стартовой ячейки записи.
      for (int i = 0; i <= 40; i++)delay(5), digitalWrite(PiezoPin, HIGH), delay(5), digitalWrite(PiezoPin, LOW); // пискнем.
    }
  }
  LockSwitch++; // Разблокируем режим записи, и заблокируем режим управления.
  if (EEPROMstartAddr / 5 == 50) { // если дошли до 50.
    delay(2000);
    Serial.println("RECORD FINISH");
    digitalWrite(PiezoPin, HIGH), delay(3000), digitalWrite(PiezoPin, LOW); // Длинный писк.
    EEPROMstartAddr = 0;
    uidDec = 0;
    ARRAYindexUIDcard = 0;
    EEPROMreadUIDcard(); // Запускаем функцию, для перезаписи массива CardUIDeEPROMread, данными из EEPROM.
  }
}

void EEPROMreadUIDcard() {
  for (int i = 0; i <= 49; i++) {
    byte val = EEPROM.read(EEPROMstartAddr + 3);
    CardUIDeEPROMread[ARRAYindexUIDcard] = (CardUIDeEPROMread[ARRAYindexUIDcard] << 8) | val;
    val = EEPROM.read(EEPROMstartAddr + 2);
    CardUIDeEPROMread[ARRAYindexUIDcard] = (CardUIDeEPROMread[ARRAYindexUIDcard] << 8) | val;
    val = EEPROM.read(EEPROMstartAddr + 1); // увеличиваем EEPROMstartAddr на 1.
    CardUIDeEPROMread[ARRAYindexUIDcard] = (CardUIDeEPROMread[ARRAYindexUIDcard] << 8) | val;
    val = EEPROM.read(EEPROMstartAddr);
    CardUIDeEPROMread[ARRAYindexUIDcard] = (CardUIDeEPROMread[ARRAYindexUIDcard] << 8) | val;
    ARRAYindexUIDcard++; // увеличиваем на 1.
    EEPROMstartAddr += 5; // увеличиваем на 5.
  }
  ARRAYindexUIDcard = 0;
  EEPROMstartAddr = 0;
  uidDec = 0;
  LockSwitch = 0;
  DisplayWAiT_CARD();
}

void DisplayWAiT_CARD() {
  Serial.println("WAIT");
  Serial.println("CARD");
}
void CommandsCARD() {
  Serial.println("Hi "); // Выводим на дисплей "привет".
  if (ARRAYindexUIDcard == 0) {
    Serial.println("Dmitry"); // Выводим на дисплей "Dmitry".
    digitalWrite(OpenDoor, HIGH), delay(1500), digitalWrite(OpenDoor, LOW);
  }
  else if (ARRAYindexUIDcard == 1) { // Если Card-UID получен из ячейки № 1 / индекс массива № 1.
    Serial.println("Sergey");
  }
  else if (ARRAYindexUIDcard == 2) { // Если Card-UID получен из ячейки № 2 / индекс массива № 2.
    Serial.println("Peter");
  }
  else if (ARRAYindexUIDcard == 3) {
    Serial.println("Vasily");
  }
  else if (ARRAYindexUIDcard == 49) {
    Serial.println("OSIPOV");
  }
  Serial.println(CardUIDeEPROMread[ARRAYindexUIDcard]); // Выводим на дисплей обнаруженный Card-UID.
  Serial.println(ARRAYindexUIDcard); // Выводим на дисплей  № индекса массива / ячейки, где хранился обнаруженный Card-UID
  for (int i = 0; i <= ARRAYindexUIDcard; i++)delay(20), digitalWrite(PiezoPin, HIGH), delay(20), digitalWrite(PiezoPin, LOW);
  delay(1); // Дёргаем микроконтроллер.
  keypad.getKey();
}

void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:
      Serial.print("Pressed: ");
      Serial.println(eKey);
      switch (eKey) {
        case '*': checkPassword(); break;
        case '#': password.reset(); break;
        default: password.append(eKey);
      }
  }
}

void checkPassword() {
  if (password.evaluate()) {
    Serial.println("OPEN");
    digitalWrite(OpenDoor, HIGH);    //Add code to run if it works
  }
  else {
    Serial.println("CLOASED");
  }
  password.reset();
}

 

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Спасибо большое, я только учусь, еще рас спасибо!!!