asbVersion First Commit

This commit is contained in:
asb 2022-09-15 11:51:06 +10:00
parent fe0b2112f4
commit 48e8059e6d

View File

@ -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?) //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
//Includes //Includes
//These can be installed in the arduino IDE by clicking on tools in the top bar, then manage libraries. //These can be installed in the arduino IDE by clicking on tools in the top bar, then manage libraries.
#include <EasyButton.h> //Used to define a button and debounces it #include <EasyButton.h> //Used to define a button and debounces it
#include "HID-Project.h" //Lets us simulate keyboard presses. #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 //LEDS
#define LED1 3 #define LED1 3
#define LED2 5 #define LED2 5
#define LED3 6 #define LED3 6
#define LED4 9 #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 //Buttons
#define BUTTON1 A3 #define BUTTON1 A3
#define BUTTON2 A2 #define BUTTON2 A2
#define BUTTON3 A1 #define BUTTON3 A1
#define BUTTON4 A0 #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 button1(BUTTON1, 35, false, false);
EasyButton button2(BUTTON2, 35, false, false); EasyButton button2(BUTTON2, 35, false, false);
EasyButton button3(BUTTON3, 35, false, false); EasyButton button3(BUTTON3, 35, false, false);
@ -45,7 +44,9 @@ EasyButton button4(BUTTON4, 35, false, false);
//Standard Arduino setup function. Code that only needs to run once goes here //Standard Arduino setup function. Code that only needs to run once goes here
void setup() { void setup() {
// Send a clean report to the host. This is important on any Arduino type.
Keyboard.begin(); 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. //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(LED1, OUTPUT);
@ -76,78 +77,115 @@ void loop() {
button3.read(); button3.read();
button4.read(); button4.read();
////////////////////////////////////
/////////// Buttons //////////////
////////////////////////////////////
//This should be pretty self explanitory. Make sure to always release a button. //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)
/*
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.
*/
// 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()) if(button1.isPressed())
{ {
Keyboard.press(KEY_LEFT_ALT); // PASTE COMMAND (Ctrl+V)
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.write('v');
lastPressTime = millis(); lastPressTime = millis();
blnDelayActions = true;
} }
else if(button1.wasReleased()) else if(button1.wasReleased())
{ {
Keyboard.release(KEY_LEFT_ALT);
lastPressTime = millis(); lastPressTime = millis();
blnDelayActions = false;
blnReleaseALLKeys = true;
} }
// 2nd Button
if(button2.isPressed()) if(button2.isPressed())
{ {
// COPY COMMAND (Ctrl+C)
Keyboard.press(KEY_LEFT_CTRL); Keyboard.press(KEY_LEFT_CTRL);
Keyboard.write('c');
lastPressTime = millis(); lastPressTime = millis();
blnDelayActions = false;
} }
else if(button2.wasReleased()) else if(button2.wasReleased())
{ {
Keyboard.release(KEY_LEFT_CTRL);
lastPressTime = millis(); lastPressTime = millis();
blnDelayActions = false;
blnReleaseALLKeys = true;
} }
// 3rd Button
if(button3.isPressed()) 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(); lastPressTime = millis();
blnDelayActions = true;
} }
else if(button3.wasReleased()) else if(button3.wasReleased())
{ {
Keyboard.release(KEY_LEFT_SHIFT);
lastPressTime = millis(); lastPressTime = millis();
blnDelayActions = false;
blnReleaseALLKeys = true;
} }
// 4th (Bottom) Button
if(button4.isPressed()) if(button4.isPressed())
{ {
Keyboard.press(KEY_SPACE); // 'CTRL' KEY (Only)
Keyboard.press(KEY_LEFT_CTRL);
lastPressTime = millis(); lastPressTime = millis();
blnDelayActions = false;
} }
else if(button4.wasReleased()) else if(button4.wasReleased())
{ {
Keyboard.release(KEY_SPACE);
lastPressTime = millis(); 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. // 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)
if((millis() - lastPressTime) > LED_TIME_OUT) 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; ledOn = false;
} }
@ -156,27 +194,29 @@ void loop() {
ledOn = true; ledOn = true;
} }
//This part fades the LEDs to their new state
if ((millis() - ledTickTime) > 10) //Update brightness every 10 milliseconds if ((millis() - ledTickTime) > 10)
{ {
ledTickTime = millis(); ledTickTime = millis();
if(!ledOn && (ledBrightness > 0))
//If led turning off, and brightness is still not low enough, decrement brihtness by 1
if(!ledOn && (ledBrightness > LED_MIN_BRIGHTNESS))
{ {
ledBrightness=ledBrightness-1; ledBrightness=ledBrightness-1;
} }
//If led turning on, and brightness is still not high enough, increment brihtness by 10 else if(ledOn && (ledBrightness < 100))
else if(ledOn && (ledBrightness < LED_MAX_BRIGHTNESS))
{ {
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(LED1, ledBrightness);
analogWrite(LED2, ledBrightness); analogWrite(LED2, ledBrightness);
analogWrite(LED3, ledBrightness); analogWrite(LED3, ledBrightness);
analogWrite(LED4, ledBrightness); analogWrite(LED4, ledBrightness);
} }
// Serial.print("Led Brightness = ");
// Serial.print(ledBrightness);
// Serial.print("\t Led State = ");
// Serial.println(ledOn);
} }