#include #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. LiquidCrystal_I2C lcd(0x27,20,4); 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(115200); // Initiate a serial communication SPI.begin(); // Initiate SPI bus lcd.init(); // initialize the lcd lcd.backlight(); lcd.setCursor(3,0); 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(" --- - "); 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, 50, 799); delay(100); } else if (content.charAt(i) == '1') { tone(RFIDSound, 44, 880); delay(100); } else if (content.charAt(i) == '2') { tone(RFIDSound, 37, 8077); delay(100); } else if (content.charAt(i) == '3') { tone(RFIDSound, 34, 8090); delay(100); } else if (content.charAt(i) == '4') { tone(RFIDSound, 31, 1000); delay(100); } else if (content.charAt(i) == '5') { tone(RFIDSound, 45, 1200); delay(100); } else if (content.charAt(i) == '6') { tone(RFIDSound, 42, 7600); delay(100); } else if (content.charAt(i) == '7') { tone(RFIDSound, 7, 8000); delay(100); } else if (content.charAt(i) == '8') { tone(RFIDSound, 38, 6600); delay(100); } else if (content.charAt(i) == '9') { tone(RFIDSound, 39, 5550); 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() { // put your main code here, to run repeatedly: 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); } const 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); }