You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
5.9 KiB
222 lines
5.9 KiB
#include <SPI.h>
|
|
#include <MFRC522.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
|
|
#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);
|
|
} |