Vídeo
Código-fonte
byte inputPin = 10;
byte ledPin = 13;
byte redPin = 6;
byte greenPin = 4;
byte bluePin = 3;
byte digitalReadOnce(byte val){
static byte lastVal = HIGH;
static unsigned long m = 0;
if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
lastVal = val;
m = millis();
return lastVal;
}
return HIGH;
}
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(inputPin);
if (digitalReadOnce(r) == LOW){
m1 = millis();
count++;
}
if (r == LOW){
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 setup() {
Serial.begin(9600);
pinMode(inputPin, INPUT_PULLUP); //internal pullup resistor is used to simplify the circuit
pinMode(bluePin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(ledPin,OUTPUT);
}
void loop() {
int command = getCommand();
if (command == 1){
digitalWrite(redPin, !digitalRead(redPin));
}
if (command == 2){
digitalWrite(greenPin, !digitalRead(greenPin));
}
if (command == 3){
digitalWrite(bluePin, !digitalRead(bluePin));
}
if (command == 4){
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, HIGH);
digitalWrite(bluePin, HIGH);
}
if (command == 5){
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
}
digitalWrite(ledPin, !digitalRead(inputPin));
delay(10); //apenas utilizado no simulador
}
Comandos via LDR
Baseado no exemplo anterior, foi substituido o botão por um LDR, onde é possível enviar comandos pro Arduino através de luz.
Vídeo:
Código-Fonte:
byte ledPin = 13;
byte redPin = 6;
byte greenPin = 4;
byte bluePin = 3;
boolean hasLightOnce(byte val){
static boolean lastVal = false;
static unsigned long m = 0;
if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
lastVal = val;
m = millis();
return lastVal;
}
return false;
}
boolean hasLight(){
return (analogRead(A0) < 100);
}
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;
boolean light = hasLight();
if (hasLightOnce(light)){
m1 = millis();
count++;
}
if (light){
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 setup() {
Serial.begin(9600);
pinMode(bluePin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(ledPin,OUTPUT);
}
void loop() {
int command = getCommand();
if (command == 1){
digitalWrite(redPin, !digitalRead(redPin));
}
if (command == 2){
digitalWrite(greenPin, !digitalRead(greenPin));
}
if (command == 3){
digitalWrite(bluePin, !digitalRead(bluePin));
}
if (command == 4){
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, HIGH);
digitalWrite(bluePin, HIGH);
}
if (command == 5){
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
}
digitalWrite(ledPin, hasLight() );
delay(10); //apenas utilizado no simulador
}