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

#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);
}