From a554a9ea6f7a1613b3d3ccfdfecdca7fd38f694d Mon Sep 17 00:00:00 2001 From: ezn Date: Thu, 24 Aug 2023 14:54:34 +0100 Subject: [PATCH] Add 'txx.uo/txx.ino' --- txx.uo/txx.ino | 222 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 txx.uo/txx.ino diff --git a/txx.uo/txx.ino b/txx.uo/txx.ino new file mode 100644 index 0000000..b8024ea --- /dev/null +++ b/txx.uo/txx.ino @@ -0,0 +1,222 @@ +#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("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, 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); +}