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
Arduino
229 lines
5.9 KiB
Arduino
5 years ago
|
|
||
|
#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);
|
||
|
}
|