From 48e8059e6d57a1b7f13c74a91b31232f8a43c7e0 Mon Sep 17 00:00:00 2001 From: asb Date: Thu, 15 Sep 2022 11:51:06 +1000 Subject: [PATCH] asbVersion First Commit --- 4ButtonKeypad/4ButtonKeypad.ino | 162 ++++++++++++++++++++------------ 1 file changed, 101 insertions(+), 61 deletions(-) diff --git a/4ButtonKeypad/4ButtonKeypad.ino b/4ButtonKeypad/4ButtonKeypad.ino index 7937df2..5871572 100644 --- a/4ButtonKeypad/4ButtonKeypad.ino +++ b/4ButtonKeypad/4ButtonKeypad.ino @@ -1,43 +1,42 @@ - //Recommend reading: https://www.arduino.cc/reference/en/ +//Recommend reading: https://www.arduino.cc/reference/en/ - //Buttons go 1-4 from Top to bottom +//Buttons go 1-4 from Top to bottom - //This project uses an Arduino Pro Micro (also known as an Arduino Leonardo?) - - //If using an clone arduino board, you may also need the USB driver from http://www.wch-ic.com/downloads/CH341SER_EXE.html before you will be able to upload +//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 - +//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 -#define LED_TIME_OUT 10000 //How long it will take for the LEDs to turn off after a button press, in milliseconds -#define LED_MAX_BRIGHTNESS 100 //Max brightness of LEDs, from 0-255. Note that this is not really linear. -#define LED_MIN_BRIGHTNESS 100 //Min brightness of LEDs, from 0-255. Note that this is not really linear. 0 is off. - -unsigned long ledTickTime = 0; //Time since the last time the LED state was updated -unsigned long lastPressTime = 0; //Time since the last button was pressed or released -uint8_t ledBrightness = 100; //Brightness that the LEDs should be aiming for -bool ledOn = false; //Should the LEDs turning/staying on or off - //Buttons #define BUTTON1 A3 #define BUTTON2 A2 #define BUTTON3 A1 #define BUTTON4 A0 -//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. +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); @@ -45,8 +44,10 @@ 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); @@ -76,78 +77,115 @@ void loop() { button3.read(); button4.read(); - //////////////////////////////////// - /////////// Buttons ////////////// - //////////////////////////////////// //This should be pretty self explanitory. Make sure to always release a button. - - /* - Also updates the lastPressTime on press and release. - If only release, then Lights wont turn on when pressed, and if only when pressed depending on hold length lights may turn off instantly after release. - Lights will not turn off while button is held, as lastPressTime will be updated each loop while button is pressed. - */ + //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) - // Depending on what you want to do, Keyboard.write() may be more useful to you than Keyboard.press(). Check the Keyboard library docs. - - // 1st (Top) Button if(button1.isPressed()) { - Keyboard.press(KEY_LEFT_ALT); + // PASTE COMMAND (Ctrl+V) + Keyboard.press(KEY_LEFT_CTRL); + Keyboard.write('v'); lastPressTime = millis(); + blnDelayActions = true; } else if(button1.wasReleased()) { - Keyboard.release(KEY_LEFT_ALT); lastPressTime = millis(); + blnDelayActions = false; + blnReleaseALLKeys = true; } - // 2nd Button if(button2.isPressed()) { + // COPY COMMAND (Ctrl+C) Keyboard.press(KEY_LEFT_CTRL); + Keyboard.write('c'); lastPressTime = millis(); + blnDelayActions = false; } else if(button2.wasReleased()) { - Keyboard.release(KEY_LEFT_CTRL); lastPressTime = millis(); + blnDelayActions = false; + blnReleaseALLKeys = true; } - // 3rd Button if(button3.isPressed()) { - Keyboard.press(KEY_LEFT_SHIFT); + //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()) { - Keyboard.release(KEY_LEFT_SHIFT); lastPressTime = millis(); + blnDelayActions = false; + blnReleaseALLKeys = true; } - // 4th (Bottom) Button if(button4.isPressed()) { - Keyboard.press(KEY_SPACE); + // 'CTRL' KEY (Only) + Keyboard.press(KEY_LEFT_CTRL); lastPressTime = millis(); + blnDelayActions = false; } else if(button4.wasReleased()) { - Keyboard.release(KEY_SPACE); lastPressTime = millis(); + blnDelayActions = false; + blnReleaseALLKeys = false; //When FALSE - you must implicidly release Keys (below) + Keyboard.release(KEY_LEFT_CTRL); } - //////////////////////////////////// - /////////// Lights /////////////// - //////////////////////////////////// - //If the time between now and the last time the buttons were pushed is greater than the time set in LED_TIME_OUT, set the LEDs to turn off, otherwise turn them on. - if((millis() - lastPressTime) > LED_TIME_OUT) + // 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; } @@ -155,28 +193,30 @@ void loop() { { ledOn = true; } - - //This part fades the LEDs to their new state - if ((millis() - ledTickTime) > 10) //Update brightness every 10 milliseconds - { - ledTickTime = millis(); - //If led turning off, and brightness is still not low enough, decrement brihtness by 1 - if(!ledOn && (ledBrightness > LED_MIN_BRIGHTNESS)) + + if ((millis() - ledTickTime) > 10) + { + ledTickTime = millis(); + if(!ledOn && (ledBrightness > 0)) { ledBrightness=ledBrightness-1; } - - //If led turning on, and brightness is still not high enough, increment brihtness by 10 - else if(ledOn && (ledBrightness < LED_MAX_BRIGHTNESS)) + + else if(ledOn && (ledBrightness < 100)) { - ledBrightness=ledBrightness+10; //Making this 10 instead of 1 means it will fade in faster than it fades out. Easier than making another setup with another ledTickTime2 or something variable. + ledBrightness=ledBrightness+10; } - //Set new brightness on pins analogWrite(LED1, ledBrightness); analogWrite(LED2, ledBrightness); analogWrite(LED3, ledBrightness); analogWrite(LED4, ledBrightness); } -} \ No newline at end of file + +// Serial.print("Led Brightness = "); +// Serial.print(ledBrightness); +// Serial.print("\t Led State = "); +// Serial.println(ledOn); + +}