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,8 +44,10 @@ 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);
pinMode(LED2, OUTPUT); pinMode(LED2, 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)
Also updates the lastPressTime on press and release. // Keyboard.press(KEY_LEFT_ALT)
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. // Keyboard.press(KEY_LEFT_SHIFT)
Lights will not turn off while button is held, as lastPressTime will be updated each loop while button is pressed. //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()) 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;
} }
@ -155,28 +193,30 @@ void loop() {
{ {
ledOn = true; 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; 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);
}