Last active
June 8, 2018 11:21
-
-
Save 3Magma/4ae20828ee104962f804a7155ca8cded to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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