Olá amigos!
Estou com um arduino novo e uma dúvida: o uso da função millis.
Estou fazendo os tutoriais do livro Arduino básico, Michael McRoberts. e cheguei em um que não entendi muito bem uma parte do código. Irei colocá-lo completo aqui:
// Projeto 4 – Semáforo interativo
int carRed = 12; // estabelece o semáforo para carros
int carYellow = 11;
int carGreen = 10;
int pedRed = 9; // estabelece o semáforo para pedestres
int pedGreen = 8;
int button = 2; // pino do botão
int crossTime = 5000; // tempo para que os pedestres atravessem
unsigned long changeTime; // tempo desde que o botão foi pressionado
void setup() {
pinMode(carRed, OUTPUT);
pinMode(carYellow, OUTPUT);
pinMode(carGreen, OUTPUT);
pinMode(pedRed, OUTPUT);
pinMode(pedGreen, OUTPUT);
pinMode(button, INPUT); // botão no pino 2
// acende a luz verde
digitalWrite(carGreen, HIGH);
digitalWrite(pedRed, HIGH);
}
void loop() {
int state = digitalRead(button);
/* verifica se o botão foi pressionado e se transcorreram 5 segundos desde a última vez que
isso ocorreu */
if (state == HIGH && (millis() - changeTime) > 5000) {
// Chama a função para alterar as luzes
changeLights();
}
}
void changeLights() {
digitalWrite(carGreen, LOW); // apaga o verde
digitalWrite(carYellow, HIGH); // acende o amarelo
delay(2000); // espera 2 segundos
digitalWrite(carYellow, LOW); // apaga o amarelo
digitalWrite(carRed, HIGH); // acende o vermelho
delay(1000); // espera 1 segundo, por segurança
digitalWrite(pedRed, LOW); // apaga o vermelho dos pedestres
digitalWrite(pedGreen, HIGH); // acende o verde dos pedestres
delay(crossTime); // espera por um intervalo de tempo predefinido
// pisca o verde dos pedestres
for (int x=0; x<10; x++) {
digitalWrite(pedGreen, HIGH);
delay(250);
digitalWrite(pedGreen, LOW);
delay(250);
}
// acende o vermelho dos pedestres
digitalWrite(pedRed, HIGH);
delay(500);
digitalWrite(carYellow, HIGH); // acende o amarelo
digitalWrite(carRed, LOW); // apaga o vermelho
delay(1000);
digitalWrite(carGreen, HIGH); // acende o verde
digitalWrite(carYellow, LOW); // apaga o amarelo
// registra o tempo desde a última alteração no semáforo
changeTime = millis();
// depois retorna para o loop principal do programa
}
Entendi tudo, menos uma parte:
if (state == HIGH && (millis() - changeTime) > 5000) {
A explicação que o livro dá, é:
"Aqui, verificamos se duas condições foram atingidas. A primeira é a de que a variável
state seja HIGH. Se o botão foi pressionado, state será HIGH, pois você já definiu este
como o valor a ser lido do pino digital 2. Você também está conferindo se o valor de
millis() - changeTime é maior que 5000 (utilizando o comando lógico E, &&). millis() é uma
função integrada à linguagem do Arduino, que retorna o número de milissegundos
desde que o Arduino iniciou a execução do programa atual. Sua variável changeTime
inicialmente não armazenará nenhum valor, mas depois que a função changeLights()
tiver sido executada, changeTime será definida como o valor atual de millis()."
A PRIMEIRA PARTE EU ENTENDI! Até antes do && não tem problema nenhum! Só que ele realiza o cálculo (millis() - changeTime) e no final do código ele define millis = changeTime. Sendo assim, millis - changeTime será sempre igual a zero?
Este código funciona perfeitamente, então, não está errado. Só não consegui entendê-lo, o que está me prejudicando pois preciso aprendê-lo bem para avançar.
Tags:
Chefe seguinte.
A função millis() retorna os milissegundos desde que o Arduino foi ligado, ou seja a cada milisegundo um contador e incrementado.
Quando ele coloca millis,() - changeTime ele ta pegando a diferença retornado pela função millis com uma variável de controle chamada changwTime, e verifica se da maior que 5000 milissegundos, ou seja 5 segundos. Se for maior ele executa o bloco abaixo e no final seta a variável changeTimes para o millis() atual. Dessa forma ele irá executar a função a cada 5 segundos aproximadamente.
Desculpe me intrometer mas... aproveitando o assunto teria como tirar duas dúvidas!?
É com relação ao uso da função millis()!!!
Primeira:
Como posso intercalar tempos de funcionamento (Ex: fazer um led piscar por 500 milissegundos e somene
após terminar de executar essa ação dá inicio a função de piscar um segundo led, também por 500 milissegundos).
Segunda:
Como posso montar laços de repetição para que a função millis() de forma que se mantenha por 100 pulsos por exemplo?
Usando o exemplo mais básico que existe para led ( http://playground.arduino.cc/Portugues/LearningBlink )
como ficaria?
.
.
.
int ledPin = 13; // LED conectado ao pino digital 13
void setup()
{
pinMode(ledPin, OUTPUT); // configura pino digital como saída
}
void loop()
{
digitalWrite(ledPin, HIGH); // liga o LED
delay(1000); // temporiza 1 segundo
digitalWrite(ledPin, LOW); // desliga o LED
delay(1000); // aguarda mais um segundo
}
O motivo dessas dúvidas é que montei um projeto para controlar mini bombas solenoides via teclado (com
laços de repetição e replicatas), tudo funcionou direitinho, até que surge a necessidade de inserir um sensor
de luz..... pronto o sono foi embora e o dor de cabeça chegou!
Como não dá para usar o delay() estou tentando contornar essa situação e a função milli() foi a que me
pareceu ser a mais se enquadrar para a minha situação (não me dei bem com a biblioteca timer ).
E desculpe novamente!
Falou!
Opa desconfigurou e perdeu parte do texto!
A última parte do texto é:
.
.
.
"O motivo dessas dúvidas é que montei um projeto para controlar mini bombas solenoides via teclado (com laços de repetição e peplicatas desses laços), tudo funcionou direitinho, até que surge a necessidade de inserir um sensor de luz.... pronto o sono foi embora e a dor de cabeça chegou!
Como não dá para usar o delay() estou tentando contornar essa situação e a função millis(), a qual pareceu ser a mais adequada para situação (não me dei bem com as bibliotecas timer). "
E desculpe novamente!
Falou!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por