//Recommend reading: https://www.arduino.cc/reference/en/ //Buttons go 1-4 from Top to bottom //This project uses an Arduino Pro Micro (also known as an Arduino Leonardo) //Includes //These can be installed in the arduino IDE by clicking on tools in the top bar, then manage libraries. #include //Used to define a button and debounces it #include "HID-Project.h" //Lets us simulate keyboard presses. //Pin Definitions. These numbers refer to the physical GPIO pins on the board //LEDS #define LED1 3 #define LED2 5 #define LED3 6 #define LED4 9 //Buttons #define BUTTON1 A3 #define BUTTON2 A2 #define BUTTON3 A1 #define BUTTON4 A0 const int cintLedOffTime = 60000; //LED 'OFF' time (milliseconds) is how long LED will remain on for after a button was pressed (For reference: 60,000 = 1 minute) const int cintDebounceTime = 200; //DebounceTime (milliseconds) is used with the 'Delay' function to pause code after a button press. This helps to slow 'extra' commands from //a Button like 'PASTING repeated data'). Increase the 'time' if wishing to 'hold' an action from happening (or repeating) for longer. //This is currently only used when 'blnDelayActions' becomes 'true'. If it is 'false', then the delay is 'zero'. unsigned long ledTickTime = 0; unsigned long lastPressTime = 0; uint8_t ledBrightness = 100; bool ledOn = false; bool blnDelayActions = false; //Used to SLOW 'button actions' from repeating (ie. it is a simple debounce to retard 'extra' or 'unwanted' actions from Buttons). bool blnReleaseALLKeys = false; //Used to control when 'ALL Keyboard Keys should be released'.... OR NOT, where (in some cases) 'Multi-button combinations are required' (eg. 'Hold-Key' actions like Ctr+Alt+Del). //If 'blnReleaseALLKeys' is set to false (in the running code), then you must also implicitly state what keys should be released (and when). //Using the EasyButton library we create 4 buttons, with each button being connected to a GPIO pin as defined above, and having a 35ms debounce time. From memory, these do not have internal pullup //resistors, and are not inverted. Hence the two falses. EasyButton button1(BUTTON1, 35, false, false); EasyButton button2(BUTTON2, 35, false, false); EasyButton button3(BUTTON3, 35, false, false); EasyButton button4(BUTTON4, 35, false, false); //Standard Arduino setup function. Code that only needs to run once goes here void setup() { // Send a clean report to the host. This is important on any Arduino type. Keyboard.begin(); Keyboard.end(); //LEDS - Setting the LED pins to be outputs. Normally, the buttons would be set as inputs, but they are handled by that library. pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); //Here we output a PWM signal to the LEDs, where 0 will be off, and 255 is brightest analogWrite(LED1, ledBrightness); analogWrite(LED2, ledBrightness); analogWrite(LED3, ledBrightness); analogWrite(LED4, ledBrightness); //BUTTONS - setup buttons using library. button1.begin(); button2.begin(); button3.begin(); button4.begin(); } //Code that is run constantly goes here void loop() { //Read all the buttons button1.read(); button2.read(); button3.read(); button4.read(); //This should be pretty self explanitory. Make sure to always release a button. //Note1: 'Keyboard.press' code options (for reference) // Keyboard.press(KEY_LEFT_CTRL) // Keyboard.press(KEY_LEFT_ALT) // Keyboard.press(KEY_LEFT_SHIFT) //Note2: 'Keyboard.release' code options (for use when blnReleaseALLKeys = false) // Keyboard.release(KEY_SPACE) // Keyboard.release(KEY_LEFT_CTRL) if(button1.isPressed()) { // PASTE COMMAND (Ctrl+V) Keyboard.press(KEY_LEFT_CTRL); Keyboard.write('v'); lastPressTime = millis(); blnDelayActions = true; } else if(button1.wasReleased()) { lastPressTime = millis(); blnDelayActions = false; blnReleaseALLKeys = true; } if(button2.isPressed()) { // COPY COMMAND (Ctrl+C) Keyboard.press(KEY_LEFT_CTRL); Keyboard.write('c'); lastPressTime = millis(); blnDelayActions = false; } else if(button2.wasReleased()) { lastPressTime = millis(); blnDelayActions = false; blnReleaseALLKeys = true; } if(button3.isPressed()) { //CUSTOM TEXT (Message) Keyboard.println("Hi there"); Keyboard.println(); Keyboard.println("Just confirming that your item is in the mail... See pics."); Keyboard.println(); Keyboard.println("Tracking is available via Australia Post: TMP40083004070052454xxxxx"); Keyboard.println("Tracking progress applies on business days as it processes through Australia Post facilities.."); Keyboard.println(); Keyboard.print("Thank-you and All the best ;)"); lastPressTime = millis(); blnDelayActions = true; } else if(button3.wasReleased()) { lastPressTime = millis(); blnDelayActions = false; blnReleaseALLKeys = true; } if(button4.isPressed()) { // 'CTRL' KEY (Only) Keyboard.press(KEY_LEFT_CTRL); lastPressTime = millis(); blnDelayActions = false; } else if(button4.wasReleased()) { lastPressTime = millis(); blnDelayActions = false; blnReleaseALLKeys = false; //When FALSE - you must implicidly release Keys (below) Keyboard.release(KEY_LEFT_CTRL); } // Check if a 'Pause' is required while performing 'Button' action(s): This stops (or rather 'SLOWS') 'repeated button actions' if a button is 'held down too long' (eg. helps stop extra 'PASTE data' commands) switch (blnDelayActions) { case true: // Pause delay(cintDebounceTime); blnDelayActions = false; break; default: // No Delay, or maybe repeat action(s) delay(0); break; } // Check if ALL Keyboard Keys should now be released (Usually 'true', but perhaps 'false' if 'multi-button hold combinations' are required) switch (blnReleaseALLKeys) { case true: // Release ALL Keyboard Keys (this should almost always be the case) Keyboard.releaseAll(); blnReleaseALLKeys = false; break; default: // Do NOT Release Keys (IMPORTANT: If here not by default, then you should have already implicidly set what Keys have been (or are to be) released.) break; } if((millis() - lastPressTime) > cintLedOffTime) { ledOn = false; } else { ledOn = true; } if ((millis() - ledTickTime) > 10) { ledTickTime = millis(); if(!ledOn && (ledBrightness > 0)) { ledBrightness=ledBrightness-1; } else if(ledOn && (ledBrightness < 100)) { ledBrightness=ledBrightness+10; } analogWrite(LED1, ledBrightness); analogWrite(LED2, ledBrightness); analogWrite(LED3, ledBrightness); analogWrite(LED4, ledBrightness); } // Serial.print("Led Brightness = "); // Serial.print(ledBrightness); // Serial.print("\t Led State = "); // Serial.println(ledOn); }