- #include <avr/sleep.h>
- #include <avr/interrupt.h>
- #include <SoftwareSerial.h>
-
- const int rx = 1; // for serial input
- const int tx = 4; // pin 5 for serial.print()
- SoftwareSerial Serial(rx, tx); // rx, tx pins
-
- int rgLed = 2; // red/green LED pin
- int button = 3; // buttons pin
- int buttonValue; // Stores analog value when button is pressed
-
- String ourCode = ""; // Set the required PIN code.
- String currentCode = ""; // Stores entered code
-
- void generateRandomPin() {
-
- ourCode = ""; // ensure is empty
-
- // Use multiple entropy sources for the random seed
- int pinSeed = analogRead(0) + analogRead(1); // Read from pin 0 and pin 1 for more randomness
- unsigned long combinedSeed = pinSeed + random(100, 200); // Combine them all
- randomSeed(combinedSeed); // Seed the random number generator with the combined value
-
- int pinLength = random(4, 9); // Random length between 4 and 8
- for (int i = 0; i < pinLength; i++) {
- ourCode += String(random(1, 5)); // Random number between 1 and 4 (inclusive)
- }
- Serial.println("Generated PIN: " + ourCode); // Display the generated PIN for debugging
- }
-
- void setup() {
- pinMode(rgLed, INPUT);
- pinMode(rx, INPUT); // setup and print to serial
- pinMode(tx, OUTPUT);
- Serial.begin(9600);
- Serial.println("Running");
- delay(500);
- generateRandomPin();
- red(500);
- green(500);
- }
-
- #pragma GCC push_options
- #pragma GCC optimize ("O0") // Disable optimisations
-
- void addkey(String keyPressed) {
- currentCode += keyPressed;
- Serial.print("Added: ");
- Serial.println(currentCode);
-
- if (currentCode.length() == ourCode.length()) {
- Serial.print("Checking: ");
- volatile bool correct = true;
-
- for (int i = 0; i < ourCode.length(); i++) {
- if (currentCode[i] != ourCode[i]) {
- correct = false;
- break;
- }
-
- do_login();
- }
-
- if (correct) {
- Serial.println("correct");
- green(500);
- delay(500);
- green(500);
- delay(500);
- green(500);
- } else {
- Serial.println("failed");
- red(500);
- }
- currentCode = ""; // Reset the entered code
- }
- }
-
- #pragma GCC pop_options
-
- void green(int del) { // turn on green LED for delay()
- pinMode(rgLed, OUTPUT);
- analogWrite(rgLed, HIGH);
- delay(del);
- pinMode(rgLed, INPUT);
- }
-
- void red(int del) { // turn on red LED for delay()
- pinMode(rgLed, OUTPUT);
- analogWrite(rgLed, 255);
- delay(del);
- pinMode(rgLed, INPUT);
- }
-
- void do_login(){
- delay(10);
- }
-
- void loop() {
- buttonValue = analogRead(button); // Read analog value from A0 pin
- if (buttonValue > 100){
- Serial.println("Button analog value: " + String(buttonValue)); // Print button value
- }
-
- if (buttonValue >= 1011 && buttonValue <= 1030) { // For 1st button:
- addkey("1");
- } else if (buttonValue >= 1000 && buttonValue <= 1010) { // For 2nd button:
- addkey("2");
- } else if (buttonValue >= 950 && buttonValue <= 999) { // For 3rd button:
- addkey("3");
- } else if (buttonValue >= 870 && buttonValue <= 950) { // For 4th button:
- addkey("4");
- }
-
- if (Serial.available()) { // Check if data is available from Serial input
- delay(10);
- char key = Serial.read(); // Read the character
- if (key >= '1' && key <= '4') { // Ensure input is a valid key
- addkey(String(key));
- }
- }
-
- delay(100);
- }