Vídeo
Código-fonte
byte pinL1 = 3; byte pinL2 = 4; byte pinL3 = 5; byte pinL4 = 6; byte pinBt = 2; byte lamp1 = 1; byte lamp2 = 1; byte lamp3 = 1; byte lamp4 = 1; void setup() { pinMode(pinBt, INPUT_PULLUP); //internal pullup resistor is used to simplify the circuit pinMode(pinL1, OUTPUT); pinMode(pinL2, OUTPUT); pinMode(pinL3, OUTPUT); pinMode(pinL4,OUTPUT); } byte digitalReadOnce(byte val){ static byte lastVal = LOW; static unsigned long m = 0; if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms lastVal = val; m = millis(); return lastVal; } return LOW; } int getCommand(){ static unsigned long m1 = 0; //millis no momento inicia de pressionar o botão static unsigned long m2 = 0; //millis após soltar o botão static byte count = 0; byte r = digitalRead(pinBt); if (digitalReadOnce(r) == HIGH){ m1 = millis(); count++; } if (r == HIGH){ m2 = millis(); } else { if (! (m2>0 && m2-m1 < 1000) ){ //o botão deve ser pressionado por menos de 1 segundo, senão cancela o comando count = 0; m1 = 0; m2 = 0; } if (m2>0 && millis()-m2 > 1500){ //após a ultima vez pressionado o botao, aguarda 1,5 segundos para finalizar e retornar o comando. byte c = count; count = 0; m1 = 0; m2 = 0; return c; } } return 0; } void loop() { if( digitalRead(pinBt) == HIGH ){ digitalWrite(pinL1, LOW); digitalWrite(pinL2,LOW); digitalWrite(pinL3,LOW); digitalWrite(pinL4,LOW); } else { digitalWrite(pinL1, lamp1); digitalWrite(pinL2,lamp2); digitalWrite(pinL3,lamp3); digitalWrite(pinL4, lamp4); } int command = getCommand(); if (command == 1){ lamp1 = !lamp1; } if (command == 2){ lamp2 = !lamp2; } if (command == 3){ lamp3 = !lamp3; } if (command == 4){ lamp4 = !lamp4; } delay(10); //apenas utilizado no simulador }