Skip to content

Instantly share code, notes, and snippets.

@3Magma
Last active June 8, 2018 11:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 3Magma/4ae20828ee104962f804a7155ca8cded to your computer and use it in GitHub Desktop.
Save 3Magma/4ae20828ee104962f804a7155ca8cded to your computer and use it in GitHub Desktop.
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
constexpr uint8_t RST_PIN = 9;
constexpr uint8_t SS_PIN = 10; // Setup for RFID leseren
MFRC522 mfrc522(SS_PIN, RST_PIN);
byte readCard[4]; // Hvor det leste kortet lagres
String navn;
boolean grp;
boolean regi = true;
int person = -1; // Verdien til a finne navnet
int teller = 0;
int randNum = -1;
const int regKort = 27;
// Led koden
int gronn = 3;
int rod = 5;
int blaa = 6;
int r = 0;
int b = 0;
unsigned long sisteFarge = 0;
boolean blinking = false;
boolean blinkk = true;
//Knapp koden
int knapp = 7;
int debounceDelay = 50;
unsigned long sisteKnappeTrykk = 0;
// LCD koden
unsigned long sisteBrikke = 0;
LiquidCrystal lcd(14, 15, 16, 17, 18, 19);
int teller1 = 0;
int teller2 = 0;
int teller3 = 0;
int teller4 = 0;
int oppmot[regKort]; // Liste som registerer hvem som har kommet i rekkefolge
int gruppe[regKort]; // Gruppe liste som brukes ved siden av oppmot for a huske grupper
String navnet[] = { // Navneliste som horer til GoodCards
"Gabrielle",
"Jonas",
"Daniel",
"Per",
"Claudia",
"Mathias",
"Ola",
"Scott",
"Peter",
"Sirius",
"Marcus",
"Kara",
"Nils",
"Norman",
"Silje",
"Amalie",
"Julie",
"Julius",
"Amanda",
"Bruce",
"Selina",
"Patrick",
"Olsen",
"Gwen",
"Yuri",
"Kai",
"Nicolai"
};
byte GoodCards[regKort][4] = { // [Antall registerete kort] + [byten som er lagret pa kortet]
{0x67, 0xB8, 0x15, 0xCC},
{0x20, 0x68, 0x83, 0xB9},
{0x17, 0x25, 0x11, 0xCC},
{0xE7, 0xBD, 0x44, 0xCC},
{0xE7, 0xBB, 0x15, 0xCC},
{0x70, 0x23, 0xEA, 0xAF},
{0xC0, 0xE6, 0xDA, 0xAF},
{0xB0, 0xEE, 0x9D, 0x5E}, // Kortet
{0xF0, 0x57, 0xF1, 0xAF},
{0xE0, 0x93, 0xEE, 0xAF},
{0x20, 0x5F, 0xEE, 0xAF},
{0x57, 0x10, 0x37, 0xCC},
{0xB0, 0x39, 0xEC, 0xAF},
{0x30, 0xFA, 0xF0, 0xAF},
{0x10, 0xC6, 0xEF, 0xAF},
{0xB0, 0x6B, 0xF2, 0xAF},
{0x97, 0xBC, 0x15, 0xCC},
{0xD7, 0xBB, 0x15, 0xCC},
{0x37, 0x81, 0x3C, 0xCC},
{0xA7, 0xA8, 0xA9, 0x74},
{0x10, 0xB4, 0xED, 0xAF},
{0xE7, 0x71, 0xA2, 0x74},
{0x17, 0x01, 0x45, 0xCC},
{0x07, 0xB2, 0x3C, 0xCC},
{0x40, 0x01, 0xE9, 0xAF},
{0x47, 0xEB, 0x0B, 0xCC},
{0x80, 0x04, 0xED, 0xAF}
};
void setup() {
Serial.begin(9600);
grp = true;
randomSeed(analogRead(0));
pinMode(rod, OUTPUT);
pinMode(gronn, OUTPUT);
pinMode(blaa, OUTPUT);
pinMode(knapp, INPUT);
lcd.begin(16, 2);
SPI.begin();
mfrc522.PCD_Init();
}
void loop() {
if (((millis() - 1000) > sisteFarge) && !(blinking)) { // Setter fargen tilbake til blaa etter 1 sekund uten annen input
analogWrite(rod, 0);
analogWrite(blaa, 255);
analogWrite(gronn, 0);
}
if (blinking) {
fargeKnapp();
}
if ((millis() - 3000) > sisteBrikke) { // Tommer skjermen hvis det har gatt 5 sekunder uten en ny registrering
lcd.clear();
}
if ( knappTrykket() && teller > 3 && regi ) { // Starter laging av grupper basert pa alle som er oppmot (ma ha minst 4 personer)
fargeKnapp();
lagGrupper();
regi = false;
blinking = true;
}
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Ser etter nye RFID kort
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
for (int i = 0; i < mfrc522.uid.size; i++) {
readCard[i] = mfrc522.uid.uidByte[i];
}
mfrc522.PICC_HaltA(); // Stoper lesing
person = finnEier();
if (regi) {
skrivNavn(person);
} else {
skrivGruppe(person);
}
}
int finnEier() { // Finner ut om kortet er registert og hvilken nummeringen det har (for a hente ut navnet)
for (int i = 0; i < regKort; i++) {
for (int j = 0; j < 4; j++) {
if (GoodCards[i][j] != readCard[j]) {
break;
}
if (j == 3) { // Vis j == 3 sa har den ikke kommet in til break etter a teste alle fire delene av verdien pa kortet
return i;
}
}
}
return -1; // Vis kortet ikke er registrert sa vil den sende tilbake -1
}
void skrivNavn(int verdi) { // Skriver ut kort navn vis det er registert og nytt
if (verdi == -1) {
// Kortet er ikke registrert
fargeRFID(1); // Rodt lys
} else {
for (int i = 0; i < teller; i++) { // Ser om verdien som proves er registrert fra for av
if (oppmot[i] == verdi) {
// Oppmote allerede registert
fargeRFID(1); // Rodt lys
return;
}
}
if (teller == 0) { // Forste gang sendes denne linjen for a plassere den pa toppen av CSV-filen
Serial.println("Dato:,Tid:,Navn:");
}
navn = navnet[verdi]; // Finner navnet pa brikken som er scanet
skrivUt(navn, 0);
fargeRFID(0); // Gront lys
Serial.println(navn);
oppmot[teller++] = verdi; // Legger til kortets index verdi i en array for a lagre pa det
}
}
void skrivGruppe(int verdi) {
if (verdi == -1) {
// Kort ikke registert
} else {
for (int i = 0; i < teller; i++) {
if (verdi == oppmot[i]) {
navn = navnet[verdi];
skrivUt(navn, (gruppe[i])); // Skriver ut navnet og den tilsvarende gruppen
}
}
}
}
void lagGrupper() {
int abc = (teller/4);
if ((teller-1) % 4 == 0) { // Lager ekstra plass pa gruppene vis det ikke er delbart pa 4
teller1--;
} else if ((teller-2) % 4 == 0) {
teller1--;
teller2--;
} else if ((teller-3) % 4 == 0) {
teller1--;
teller2--;
teller3--;
}
for (int i = 0; i < teller; i++) { // Gir person etter person en gruppe til alle grupper er fulle
grp = true;
while (grp) { // Looper denne til den finner en gruppe med ledig plass
randNum = random(1, 5);
if (randNum == 1) {
if (teller1 != abc) {
grp = false;
}
} else if (randNum == 2) {
if (teller2 != abc) {
grp = false;
}
} else if (randNum == 3) {
if (teller3 != abc) {
grp = false;
}
} else {
if (teller4 != abc) {
grp = false;
}
}
}
if (randNum == 1) {
teller1++;
} else if (randNum == 2) {
teller2++;
} else if (randNum == 3) {
teller3++;
} else {
teller4++;
}
gruppe[i] = randNum;
}
void fargeRFID(int farge) {
if (farge == 0){ // 0 gir gronn farge
analogWrite(gronn, 255);
analogWrite(blaa, 0);
analogWrite(rod, 0);
} else { // 1 gir rod farge
analogWrite(gronn, 0);
analogWrite(blaa, 0);
analogWrite(rod, 255);
}
sisteFarge = millis();
}
void fargeKnapp() {
if ((millis() - 500) > sisteFarge && blinkk) { // Skrup pa det blaa lyset etter 0,5 sekunder
analogWrite(rod, 0);
analogWrite(blaa, 255);
analogWrite(gronn, 0);
sisteFarge = millis();
blinkk = false;
}
if ((millis() - 1000) > sisteFarge && !(blinkk)) { // Skrur av etter 1 sekund
analogWrite(rod, 0);
analogWrite(blaa, 0);
analogWrite(gronn, 0);
sisteFarge = millis();
blinkk = true;
}
}
boolean knappTrykket() {
if (millis() - sisteKnappeTrykk >= debounceDelay) {
if (digitalRead(knapp)) {
sisteKnappeTrykk = millis();
return true;
}
}
return false;
}
void skrivUt(String navn, int nr) {
sisteBrikke = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hei, " + navn + "!");
lcd.setCursor(0, 1);
if (nr != 0) {
String gruppe = String(nr);
lcd.print("Gruppe " + gruppe);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment