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.

Exibições: 3161

Responder esta

Respostas a este tópico

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!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço