Detalii proiect:
– la apasarea butonului starea LED-ului trebuie sa se modifice;
– cat timp butonul este apasat, LED-ul nu trebuie sa schimbe starea.
Prima cerinta se implementeaza astfel:
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(butonPin, INPUT_PULLUP);
}

int stareLed = 0;

void loop() {

  if (digitalRead(butonPin) == LOW) {
    if (stareLed == 0) {
      stareLed = 1;
    }

    else {
      stareLed = 0;
    }

    digitalWrite(ledPin, stareLed);
    delay(100);
  }
}
Delay-ul de 100 de ms se introduce pentru a oferi timp utilizatorului sa apese pe buton si sa ia mana de pe buton, altfel pe perioada cat butonul este apasat, LED-ul se va stinge si aprinde in mod repetat, pana cand butonul este lasat liber.
Pentru a implementa cea de-a doua cerinta, vom adauga o noua variabila care sa retina starea butonului.
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

int stareLed = 0;
int stareButon = 0;

void loop() {
  if (digitalRead(7) == LOW && stareButon == 0) {
    stareButon = 1;
    stareLed = stareLed^1;//XOR
    digitalWrite(8, stareLed);
    delay(50);
  }

  if (digitalRead(7) == HIGH && stareButon == 1) {
    stareButon = 0;
    delay(50);
  }
}
Cele doua instructiuni delay sunt introduse pentru a rezolva problema debouncing-ului butonului, respectiv fluctuatia semnalului (primele cateva zeci de ms) citit pe pinul Arduino la trecerea butonului dintr-o stare in alta.
Pentru a evita folosirea instructiundea delay(), vom folosi instructiunea millis().
Millis() returneaza numarul de milisecunde de la pornirea Arduino. Astfel, la fiecare milisecunda contorul se incrementeaza. Pentru ca, daca Arduino functioneaza suficient de mult numarul de milisecunde va fi foarte mare, vom folosi o variabila de tip long pentru a retine numarul returnat de functia millis(). Astfel, putem stoca o valoare pana la 4,294,967,295 (care este 2^32 – 1).
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(btnPin, INPUT_PULLUP);
}

int stareLed = 0;
int debouncingTime = 20; //20ms for debouncing purposes
unsigned long buttonTime = 0;
enum btn_state {INIT, START_PRESSED, PRESSED, START_DEPRESSED, LAST_STATE};
enum btn_state stareButon = INIT;

void loop() {

  //debouncing PRESSED_BUTTON state
  if (digitalRead(btnPin) == LOW && stareButon == INIT) {
    buttonTime = millis();
    stareButon = START_PRESSED;
  }

  if (digitalRead(btnPin) == LOW && stareButon == START_PRESSED && millis() - buttonTime > debouncingTime) {
    stareButon = PRESSED;
    stareLed = stareLed^1;
    digitalWrite(8, stareLed);
  }

  //debouncing RELEASED_BUTTON state
  if (digitalRead(btnPin) == HIGH && stareButon == PRESSED) {
    buttonTime = millis();
    stareButon = START_DEPRESSED;
  }

 if (digitalRead(btnPin) == HIGH && stareButon == START_DEPRESSED && millis() - buttonTime > debouncingTime) {
    stareButon = INIT;
  }
}



Tutorial