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
}