• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
skrócenie kodu oraz jak usunąć coś z tablicy
#1
Witam mam problem otóż jak skrócić kod chodzi mi dokładnie żeby w 2 poziomowej tablicy nie musiał wypisywać dla każdego "zbioru" (nie wiem jak to się fachowo nazywa) poroównania z zeskanowanym rfid tagiem
Kod:
if
      ( rfid.uid.uidByte[0] == poprawna_karta2[0][0]&&
      rfid.uid.uidByte[1] == poprawna_karta2[1][0]&&
      rfid.uid.uidByte[2] == poprawna_karta2[2][0]&&
      rfid.uid.uidByte[3] == poprawna_karta2[3][0]
      ||
      rfid.uid.uidByte[0] == poprawna_karta2[0][1]&&
      rfid.uid.uidByte[1] == poprawna_karta2[1][1]&&
      rfid.uid.uidByte[2] == poprawna_karta2[2][1]&&
      rfid.uid.uidByte[3] == poprawna_karta2[3][1]
      ||
      rfid.uid.uidByte[0] == poprawna_karta2[0][2]&&
      rfid.uid.uidByte[1] == poprawna_karta2[1][2]&&
      rfid.uid.uidByte[2] == poprawna_karta2[2][2]&&
      rfid.uid.uidByte[3] == poprawna_karta2[3][2]
      ||
      rfid.uid.uidByte[0] == poprawna_karta2[0][3]&&
      rfid.uid.uidByte[1] == poprawna_karta2[1][3]&&
      rfid.uid.uidByte[2] == poprawna_karta2[2][3]&&
      rfid.uid.uidByte[3] == poprawna_karta2[3][3]
     
    )
próbowałem dać przed pętlą if for( a =0; a<=4; a++) i wpisałem == poprawna_karta2[0][a] ale niestety działa tylko 1 tag to przez pętlę for?? Oraz chciał bym się dowiedzieć jak usunąć/ zmienić coś z tablicy( z tego co zrozumiałem jak wartość to -1 to jest to pomijane)
 
Odpowiedź
#2
A dlaczego korzystasz z tablicy dwuwymiarowej?? pokaż cały kod.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C lcd(0x27,16,2);
#define SS_PIN 10
#define RST_PIN 9
unsigned long punkty;
int delayTime = 1500;
int a;

MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

const byte poprawna_karta2[4][4] = { {0x93,0xD3,0xB3,0xE3,},
                                    {0x7D,0xC0,0x8E,0xD4},
                                    {0xE9,0xD4,0x9F,0x12},
                                    {0x1B,0x1B,0xAC,0x1D} };

void setup() {
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  lcd.init();
  lcd.backlight();
  lcd.home();
  lcd.print ("Grabierz");
  lcd.setCursor(0,1);
  delay(3000);
  lcd.clear();
  }
void loop() {
        
          lcd.setCursor(3,0);
          lcd.print("Wynik:");
          lcd.setCursor(7,1);
          lcd.print(punkty);

  // Look for new card
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;
if
      ( rfid.uid.uidByte[0] == poprawna_karta2[0][0]&&
      rfid.uid.uidByte[1] == poprawna_karta2[1][0]&&
      rfid.uid.uidByte[2] == poprawna_karta2[2][0] &&
      rfid.uid.uidByte[3] == poprawna_karta2[3][0]
      ||
      rfid.uid.uidByte[0] == poprawna_karta2[0][1]&&
      rfid.uid.uidByte[1] == poprawna_karta2[1][1]&&
      rfid.uid.uidByte[2] == poprawna_karta2[2][1] &&
      rfid.uid.uidByte[3] == poprawna_karta2[3][1]
      ||
      rfid.uid.uidByte[0] == poprawna_karta2[0][2]&&
      rfid.uid.uidByte[1] == poprawna_karta2[1][2]&&
      rfid.uid.uidByte[2] == poprawna_karta2[2][2] &&
      rfid.uid.uidByte[3] == poprawna_karta2[3][2]
      ||
      rfid.uid.uidByte[0] == poprawna_karta2[0][3]&&
      rfid.uid.uidByte[1] == poprawna_karta2[1][3]&&
      rfid.uid.uidByte[2] == poprawna_karta2[2][3] &&
      rfid.uid.uidByte[3] == poprawna_karta2[3][3]
  
    )
  
    {
          lcd.clear();
          lcd.setCursor(3,0);
          lcd.print("Przyznano");
          lcd.setCursor(3,1);
          lcd.print("2 punkty!!");
          delay(delayTime);
          lcd.clear();
          punkty=punkty+2;
          return;
    
    }
else{
          lcd.clear();
          lcd.setCursor(2,0);
          lcd.print("Niepoprawna");
          lcd.setCursor(3,1);
          lcd.print("Karta!!!");
          delay(delayTime);
          lcd.clear();
        return;
    }


  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}

korzystam z 2wymiarowej bo finalnie ma być około 50 tagów
 
Odpowiedź
#4
4 bajty to liczba uint32_t, po co to trzymać w tablicy dwuwymiarowej. Miałbyś if (liczba1==liczba2) dla całej karty.
Warunki muszą być spełnione wszystkie, więc coś w ten desen:
Kod:
for( int i =0; i<2; i++)//
{
bool czyToDobraKarta=1;
for (( int j =0; j<4; j++) (tu też miałeś błąd <=)
{
if (! rfid.uid.uidByte[j] == poprawna_karta2[j][i])
{
czyToDobraKarta=0; //  
}
//tutaj jeśli czyToDobraKarta  to można przerwać, będzie 0 gdy w sprawdzanych bajtach choć jeden nie pasował
}
}
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości