//TODO: Learn how to use mic. in arduino, transmit plain sound among two arduinos and play it //TODO: Implement encryption and decryption using AES128, test it with text, then use to encrypt sound #include #include #include #include #include #include //Components LiquidCrystal_I2C lcd(0x27, 16, 2); RF24 radio(9,10); // CE, CSN const byte micPin = A0; //Settings //byte unsigned address = 1; const byte address[6] = "00001"; unsigned short key = 0; byte unsigned screen = 0; const String seed = "1305b5cfa1a59e9789de"; // "random" seed ;) String password; bool mode = 0; // 0 = transmit, 1 = recieve, bool is 2 bytes less than byte :) bool encryption = 1; // will the trafic be encrypted? byte value = 0; bool isScreenChanged = true; // we must display first time //Switch screen button const byte switchScreenButton = A1; byte switchScreenLast; //IncreaseButton const byte increaseButton = A2; byte increaseButtonLast; //DecreaseButton const byte decreaseButton = A3; byte decreaseButtonLast; void switchMode(); void printOutput(); void updatePassword(); //short micValue = 337; //const short micBaseline = 337;// 3.3v / 2 = 1.56v, 1.56/5*1024 = 337. short micValues[32]; void setup() { Serial.begin(9600); pinMode(micPin, INPUT); //Setting up buttons pinMode(switchScreenButton, INPUT_PULLUP); pinMode(increaseButton, INPUT_PULLUP); pinMode(decreaseButton, INPUT_PULLUP); //Setting up a radio module radio.begin(); radio.setPALevel(RF24_PA_MAX); radio.setChannel(0x00); radio.setDataRate(RF24_250KBPS); switchMode(); //default is recieving switchMode(); //Setting up a LCD lcd.init(); lcd.backlight(); updatePassword(); } void loop() { switchMode(); if (!mode) {// transmit for (int i = 0; i < 32; i ++) { micValues[i] = analogRead(micPin) << 2; } radio.write(micValues, 32); } else { // receive if (radio.available()) { radio.read(micValues, 32); for (int i = 0; i < 32; i++) { PORTD = micValues[i]; } } } byte switchButtonValue = digitalRead(switchScreenButton); byte increaseValue = digitalRead(increaseButton); byte decreaseValue = digitalRead(decreaseButton); if (switchButtonValue == 0 && switchScreenLast == 1) { screen = screen < 3? screen + 1 : 0; isScreenChanged = true; } if ((decreaseValue == 0 && decreaseButtonLast == 1) || increaseValue == 0 && increaseButtonLast == 1) { isScreenChanged = true; switch (screen) { case 0: mode = !mode; break; case 1: if (decreaseValue == 0 && decreaseButtonLast == 1) // address = address > 0? address - 1 : 127; 1+1; else // address = address < 127? address + 1 : 0; 1+1; break; case 2: if (decreaseValue == 0 && decreaseButtonLast == 1){ key --; } else { key ++; } break; case 3: encryption = !encryption; break; } } switchScreenLast = switchButtonValue; increaseButtonLast = increaseValue; decreaseButtonLast = decreaseValue; if (isScreenChanged) printOutput(); } void switchMode () { if (!mode) { // transmit -> recieve // radio.openReadingPipe(0, 0x0123456789LL); radio.openReadingPipe(0, address); radio.startListening(); } else { // recieve -> transmit radio.openWritingPipe(address); radio.stopListening(); } mode = !mode; } void printOutput () { lcd.clear(); switch (screen) { case 0: lcd.print("Mode: "); lcd.print(mode? "receive" : "transmit"); break; case 1: lcd.print("Address: "); // lcd.print(address); break; case 2: lcd.print("Password: "); lcd.print(key); break; case 3: lcd.print("Encryption: "); lcd.print(encryption? "yes" : "no"); } isScreenChanged = false; // for (int i = 0; i < 5; i ++) lcd.print(address[i] - '0'); //lcd.print(mode); } void updatePassword() { password = seed + key; }