Measuring how long a button was pressed

How can I measure the time between when a button was pressed and when it was released? I have all the code working for button pressing etc., but I want a certain action when the button is held for 3 seconds.


When the button goes HIGH/LOW record what millis() is.
When the button goes LOW/HIGH record what millis() is.
Then take the difference between the two recorded values.

Show us what you have.
Attach your code using the </> icon on the left side of the posting menu.
Put your sketch between the code tags [code]Paste your sketch here[/code]


So . . . . the button is going to have to be pressed for precisely 3 seconds? Like, 3.000 seconds precise? :)

unsigned long buttonPressedAt = 0;
const int BUTTON = 3;
bool buttonReleased = false;
byte buttonPrevState = 0;

void setup() {

void loop() {
  int state = digitalRead(BUTTON);
  if (state != buttonPrevState) {
    if (state == HIGH) {
      buttonReleased = false;
      buttonPressedAt = millis();
    else {
      buttonReleased = true;

  if (buttonReleased == true) {
    buttonPressedAt = 0;

void after3Sec() {
  long diff = millis()-buttonPressedAt;
  if (diff>3000) {
    //do action for 3 sec button press

Not tested, modified the code for your requirement.

Wrote this for another post, check this post

INTP: Like, 3.000 seconds precise? :)

correction, 3000 milli sec :)