Pessoal,
Sou novato no mundo arduino e gostaria de fazer um carrinho de polícia para o meu sobrinho, mas empaquei em um impasse na programação. Como faço para acionar leds e um piezo ao mesmo tempo? se eu coloco os dois em um loop, um aciona em quanto o outro desliga.
Como posso resolver isso e acionar os dois ao mesmo tempo?
Obrigado
Tags:
Olá, amigo. Coloca mais ou menos a descrição de como vai funcionar para que possamos te ajudar. Por exemplo:
O carrinho vai para a frente por tanto tempo e depois para, acende as luzes (leds), aciona o piezo e volta a correr....
O motor do carro é acionado via ponte H, tem sensores de distância, etc...
Por exemplo, o som da sirene, temos esse aqui: http://www.dobitaobyte.com.br/linux/eletronica-digital-com-arduino-...
Estuda essa aqui também:
Piscar sem delay- http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Amigo, segue o sketch:
// Projeto - Carro de polícia
float sinVal;
int toneVal;
int ledDelay = 50; // delay de 50ms
int redPin = 9;
int bluePin = 11;
void setup(){
pinMode(8, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop(){
for (int x=0; x<180; x++){
//converte graus para radianos, e depois obtém o valor do seno
sinVal = (sin(x*(3.1416/180)));
//gera uma freguência a partir do valor do seno
toneVal = 2000+(int(sinVal*1000));
tone(8, toneVal);
delay(2);
ESTOU COM PLOBLEMAS A PARTIR DAQUI, POIS SOMENTE QND A SIRENE TOCA O LUZ ACENDE
}
digitalWrite(redPin, HIGH); // Liga o led Vermelho
delay(ledDelay); // espera 50 ms
digitalWrite(redPin, LOW); // Desliga o led Vermelho
delay(ledDelay); // espera 50 ms
digitalWrite(redPin, HIGH); // Liga o led Vermelho
delay(ledDelay); // espera 50 ms
digitalWrite(redPin, LOW); // Desliga o led Vermelho
delay(ledDelay); // espera 50 ms
digitalWrite(redPin, HIGH); // Liga o led Vermelho
delay(ledDelay); // espera 50 ms
digitalWrite(redPin, LOW); // Desliga o led Vermelho
delay(ledDelay); // espera 50 ms
delay(100); // delay para alternar o led 100ms
digitalWrite(bluePin, HIGH); // Liga o led Azul
delay(ledDelay); // espera 50 ms
digitalWrite(bluePin, LOW); // Desliga o led Azul
delay(ledDelay); // espera 50 ms
digitalWrite(bluePin, HIGH); // Liga o led Azul
delay(ledDelay); // espera 50 ms
digitalWrite(bluePin, LOW); // Desliga o led Azul
delay(ledDelay); // espera 50 ms
digitalWrite(bluePin, HIGH); // Liga o led Azul
delay(ledDelay); // espera 50 ms
digitalWrite(bluePin, LOW); // Desliga o led Azul
delay(ledDelay); // espera 50 ms
}
Já tentei fazer isso. Não consegui.
O Arduíno executa linha por linha, então não tem como executar duas coisas ao mesmo tempo.
Se alguém souber fazer, eu também quero saber!
O problema está na função TONE.
no comando : tone(8, toneVal); , não sei o que acontece que o programa parece parar ali. Ainda estou estudando o que acontece. Há inclusive uma discussão a respeito aqui no blog: http://labdegaragem.com/forum/topics/a-fun-o-tone-interfere-no-func...
Fiz um teste e, retirando a linha acima mencionada, o programa roda tranquilamente. Após recolocá-la, o led não pisca.
Como eu estava tendo dificuldade em implementar a função tone, utilizei a função AnalogWrite. Não sei se vai funcionar pois não testei no "mundo real". Fiz virtualmente.
Código:
float sinVal; // variável para estocar o valor de sinVal
int toneVal; // variável para estocar o valor de toneVal
int somPin= 3; // o pino do som é o pino analógico 3
int redPin = 10; // LED vermelho no pino 10
int bluePin = 11; // LED azul no pino 11
int ledState = LOW; // variável de estado dos LED's
long previousMillis = 0;
long interval = 1000; // intervalo entre as piscadas dos LED's
void setup(){
Serial.begin(9600);
pinMode (somPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop(){
for (int x=0; x<180; x++){
//converte graus para radianos, e depois obtém o valor do seno
sinVal = (sin(x*(3.1416/180)));
Serial.print("sinval ="); // joga no serial monitor o valor de sinval
Serial.println(sinVal);
//gera uma freguência a partir do valor do seno
toneVal = (int(sinVal*1000)); // Somar mais 2000
Serial.print("toneval ="); // joga no serial monitor o valor de toneval
Serial.println(toneVal);
// código para piscar os LED's sem delay
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// salva a última vez que o led piscou
previousMillis = currentMillis;
// se o LEDstate é LOW, o novo estado é High
if (ledState == LOW)
ledState = HIGH;
// caso contrário, o estado é LOW
else
ledState = LOW;
// seta o LED azul com o estado inverso do LED vermelho
digitalWrite(redPin, ledState);
digitalWrite(bluePin,!ledState);
}
// Joga no pino 3, o valor de toneVal
analogWrite(somPin,toneVal);
delay(2);
}
}
link para o circuito funcionando: http://123d.circuits.io/circuits/96725-teste-tone/view
Olá Felipe,
Observei a proposta do seu projeto, e é bem parecida com uma que tive à algum tempo atrás. A melhor maneira que encontrei foi utilizando o conceito de Máquinas de Estado. Onde você cria uma tarefa, e assim que uma tarefa for executada ela passa para a tarefa seguinte.
Criei um projeto simulado que responde bem ao que você queria. Basicamente criei uma máquina de estados para controlar os periféricos, e através de uma variável ("configurável de acordo com os tempos e controle que queira") ela é acionada para controlar os dois leds e a buzina.
O código não está enxuto, fiz correndo. ^^ Mas é fácil de entender e você pode customizá-lo para ficar melhor. Junto mandei o projeto do Proteus para poder verificar (podendo até ouvir a sirene pelo audio do PC) e no código já possui algum debug pela serial.
Segue imagens das duas sirenes que criei, uma pulsando a buzina com um led, e a outra com a buzina contínua. E o arquivo está em anexo.
Espero ter ajudado, boa sorte.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por