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 }