#include #include #define SS_PIN 10 #define RST_PIN 9 #define CHECK_BIT(var,pos) ((var) & (1<<(pos))) MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. #include //LiquidCrystal_I2C lcd(0x38, BACKLIGHT_PIN, POSITIVE); // Set the LCD I2C address LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address const int RFIDled = 6; const int RFIDSound = 5; const int RFIDbin = 3; const int signalIN = A0; const int TextKnob = A1; const int textSound = A2; long randNumber; void setup() { Serial.begin(9600); // Initiate a serial communication SPI.begin(); // Initiate SPI bus lcd.begin(16, 2); // initialize the lcd mfrc522.PCD_Init(); // Initiate MFRC522 Serial.println(); pinMode(RFIDled, OUTPUT); pinMode(RFIDSound, OUTPUT); pinMode(RFIDbin, OUTPUT); pinMode(signalIN, INPUT); pinMode(TextKnob, INPUT); pinMode(textSound, OUTPUT); } void readCard() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Show UID on serial monitor Serial.print("UID tag :"); String content = ""; // for tag + sound String binary = ""; // for binary + LED for (int i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i], DEC); content.concat(String(mfrc522.uid.uidByte[i], DEC)); if (content.charAt(i) == '0') { tone(RFIDSound, 40, 2250); delay(100); } else if (content.charAt(i) == '1') { tone(RFIDSound, 15, 2250); delay(100); } else if (content.charAt(i) == '2') { tone(RFIDSound, 25, 1500); delay(100); } else if (content.charAt(i) == '3') { tone(RFIDSound, 17, 150); delay(100); } else if (content.charAt(i) == '4') { tone(RFIDSound, 30, 1000); delay(100); } else if (content.charAt(i) == '5') { tone(RFIDSound, 27, 1590); delay(100); } else if (content.charAt(i) == '6') { tone(RFIDSound, 28, 1500); delay(100); } else if (content.charAt(i) == '7') { tone(RFIDSound, 10, 1500); delay(100); } else if (content.charAt(i) == '8') { tone(RFIDSound, 13, 1050); delay(100); } else if (content.charAt(i) == '9') { tone(RFIDSound, 7, 1000); delay(100); } } for (int b = 0; b < mfrc522.uid.size; b++) { Serial.println(mfrc522.uid.uidByte[b], BIN); char r = mfrc522.uid.uidByte[b]; for (int j = 8; j >= 0; j--) { if CHECK_BIT(r, j) { digitalWrite(RFIDled, HIGH); digitalWrite(RFIDbin, HIGH); delay(100); } else { digitalWrite(RFIDled, LOW); digitalWrite(RFIDbin, LOW); delay(100); } delay(100); } } Serial.println(); delay(100); } //Q-code questions const char *Qs[] = { "", "", "QRB?:How far are you from my station?", "QRL?:Are you busy?", "QRZ?:Who is calling me?", "QRH?:Does my frequency vary?", "QRI?:How is the tone of my transmission?", "QRK?:What is the readability of my signals?", "QRM?:Do you have interference?", "QRN?:Are you troubled by static noise?", "QRQ?:Shall I send faster?", "QRT?:Shall I cease or suspend operation?", "QRU?:Have you anything for me?", "QRV?:Are you ready?", "QRX?:Shall I standby?", "QSA?:What is the strength of my signals?", "QSB?:Are my signals fading?", "QSD?:Is my keying defective?", "QSL?:Can you acknowledge receipt?" }; //Q-code answers/statements const char *As[] = { "QRH:Your frequency varies.", "QRL:I am busy. Please do not interfere.", "QRM:I have interference.", "QRM:I am troubled by static noise.", "QRO:Please increase transmit power.", "QRQ:Please send faster.", "QRS:Please send more slowly", "QRT:I am suspending operation.", "QRU:I have nothing for you.", "QRV:I am ready.", "QRX:Please standby.", "QSB:Your signals are fading.", "QSD:Your keying is defective.", "QSK:I can hear you between my signals (while transmitting); break in on my transmission.", "QSL:I am acknowledging receipt.", "QSM:Repeat the last telegram which you sent me", "QSY:Please change transmission frequency.", "QSZ:Send each word or group twice." }; void loop() { readCard(); int textnumber; int text = analogRead(TextKnob); textnumber = map(text, 1, 1023, 0, 18); if (textnumber > 1) { //when the knob is turned from the 'position 0' Serial.println(Qs[textnumber]); String question = Qs[textnumber]; lcd.setCursor(0, 0); //Set the lcd cursor to the upper left corner lcd.print(Qs[textnumber]); //Display the specific Q-question on the fisrt row of LCD for (int positionCounter = 0; positionCounter < question.length(); positionCounter++) { lcd.scrollDisplayLeft(); //Q-question scrolls to the left delay(230); } char* specQs = Qs[textnumber]; // loop over each character of question for (int a = 0; a < strlen(specQs); a++ ) { char c = specQs[a]; //Serial.print(c); //Serial.print(" "); Serial.print(specQs[a], BIN); //Serial.println(); // sonify the bits... for (int i = 7; i >= 0; i--) { if CHECK_BIT(c, i) { tone(textSound, 440, 100); } else { tone(textSound, 220, 100); } delay(100); } } } // give an answer randNumber = random(0, 17); int readSignal = digitalRead(signalIN); String randomQ = As[randNumber]; if (readSignal) { //If the module receives a signal via A2 o4 input channel... Serial.println(As[randNumber]); lcd.setCursor(0, 1); //Set the lcd cursor to the lower left corner lcd.print(randomQ); //Displayes a random Q-answer from the answers array for (int counter = 0; counter < randomQ.length(); counter++) { lcd.scrollDisplayLeft(); //Q-answer dissapears in the left side of the LCD delay(230); } } delay(500); }