You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
5.9 KiB
C++

#include <SPI.h>
#include <MFRC522.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.
#include <LiquidCrystal_I2C.h>
//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);
}