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 }
Dai eu acho o que estava procurando pra que o arduino possar fazer e vejo esses comandos que sei que nao vou conseguir modificar. huahauha mas ficou top era justamente isso que estava procurando, mas depois desse codigo desisto. Valeu Forte abraço.
ResponderExcluirObrigado por disponibilizar este código, usei como um conceito para outro código e me ajudou muito.
ResponderExcluirMuito obrigado. Com mudanças que pretendo fazer caiu como uma luva!- Me inscrevi no seu canal..Valeu!
ResponderExcluir