Olá pessoal!
Após muito tempo estou de volta!
Ingressei em outras atividades e não continuei com arduino, por isso recorre novamente ao grupo.
Meu caso é o seguinte:
Preciso piscar um led apenas 5x mas não posso usar o delay, pois ele pára o processamento e não consigue executar outras operações, como ler um botão.
Pesquisei tutoriais no youtube mas eles só explicam como fazer piscar o led e executar outras operações, ou seja, o led fica piscando indefinidamente e no meu caso quero apenas 5x. Obrigado a todos pela força!
Tags:
Então você precisa entender como funciona o millis.
https://www.arduino.cc/reference/pt/language/functions/time/millis/
https://www.filipeflop.com/blog/subtituindo-delay-por-millis-no-ard...
Qualquer coisa, pesquise: "millis arduino" no google.
É uma função simples de entender. Ele retorna sempre o valor atual em millisec. A ideia é criar um comparativo, assim, evita as travadas que o delay oferece.
A primeira coisa que o cara aprende é o delay, a segunda é o millis. Não tem pra onde você correr, será necessário parar um pouco e buscar entender.
Boa noite TM.
" Não tem pra onde você correr," tem sim, tem TimerOne.h
Vamos analisar as possibilidade:
1. delay(), Intuitivo, fácil de usar, mas trava o processamento enquanto durar o delay;
2. millis(), Um pouco mais complexo, não trava o processamento, mas erra o " if " a cada
49 dias, 17 horas, 2 minutos, 47 segundos e 295 milissegundos.
Porque erra. Porque após este tempo dá overflow no registador.
Dias Horas min seg milseg Total
49 * 24 * 60 * 60 * 1.000 = 4.233.600.000
17 * 60 * 60 * 1.000 = 61.200.000
2 * 60 * 1.000 = 120.000
47 *1.000 = 47.000
295 = 295
_______________
4.294.967.295 = 0xFFFF FFFF
Ou seja é o maior formato de variável que se pode guardar em um registrador do
Atmega328. 4 bytes um unsigned long.
3. micros(), Também complexo, não trava o processamento, mas erra o " if " a cada
1 hora, 11 minutos, 34 segundos e 967295 microsegundos.
Porque erra. Porque após este tempo dá overflow no registador.
Horas min seg microseg Total
1 * 60 * 60 * 1.000.000 = 3.600.000.000
11 * 60 * 1.000.000 = 660.000.000
34 * 1.000.000 = 34.000.000
967.295 = 967.295
_______________
4.294.967.295 = 0xFFFF FFFF
Ou seja é o maior formato de variável que se pode guardar em um registrador do
Atmega328. 4 bytes um unsigned long.
4. Biblioteca TimerOne.h complexa para usar, mas nunca não dá overflow de registrador.
RV mineirin
Bem observado.
Devido a existencia do limite do millis(), eu imaginava que existiria uma do micros também, mas não imaginei que seria em um pouco mais de 1hora, ainda bem que criei uma alternativa a um tempo atrás hahaha.
O TimerOne.h eu não conheço. Irei pesquisar sobre.
Vamos lá! Fiz essa void para piscar o led 5x mas como uso delay o programa para
Gostaria de usar o millis para piscar o led 5x, em lugar do delay
Obrigado!
void adicionaSegundo() { // Funcao de adicao de 1 segundo ao proximo led
if (digitalRead (ch1) == 0) {
ledPisca++; // Incrementa led a ser tratado
if (ledPisca > 10) ledPisca = 0; // Certifica que o led 0 seja o proximo depois do led 10
digitalWrite (ledPisca, HIGH);
delay (275);
digitalWrite (ledPisca, LOW);
delay (275);
digitalWrite (ledPisca, HIGH);
delay (275);
digitalWrite (ledPisca, LOW);
delay (275);
digitalWrite (ledPisca, HIGH);
delay (275);
digitalWrite (ledPisca, LOW);
delay (275);
digitalWrite (ledPisca, HIGH);
delay (275);
digitalWrite (ledPisca, LOW);
delay (275);
Primeiramente, por favor, não fique colando o código na postagem, eu sugiro que cole o .ino ou utilize uma ferramenta como o pastebin ou github.
Sobre sua postagem anterior (que você editou/deletou): https://pastebin.com/gyVWi5pj
Por favor não cole código na área de texto do tópico.
fica poluído e perde caractere e formatação.
Remova o que vc postou e anexe como arquivo clicando no
pequeno clip acima da tela.
RV mineirin
O primeiro passo para se utilizar o millis é ENTENDER o que ele faz, sem isso, é impossível. (a não ser que alguém faça para você, ou que você utilize a lib que o RV citou).
Vou explicar de forma grosseira e com linguagem popular.
1- O que é o millis?
r- um contador ou relógio. Sempre que você ligar o equipamento, o millis() inicia. Se você fizer um print do millis() ele sempre irá mostrar um valor diferente. Se você deixar o Microcontrolador ligado por 1 segundo, o valor de millis() será igual a 1000. Se deixar por 60 segundos, o valor de millis será igual a 60.000...
2- Como funciona uma condição com o millis?
r- A ideia é realizar uma subtração de 2 variáveis para se obter um valor de tempo..
Exemplo. Imagine que acabamos de ligar o controlador. Então atribuimos uma variável qualquer ("var") para ser igual ao valor de millis():
var = millis()
Neste EXATO instante, o valor de var será identico ao de millis.
o valor de millis é o TEMPO em que o controlador já está ligado.
Se FOSSE possível relizar uma subtração neste momento, então o resultado seria ZERO.
"millis - var = 0" (na prática, eu não sei se é possível obter isso pois o contador nunca para)
Então, vamos imaginar que queremos um atraso de 1 segundo para simular uma ação. ok?
primeiro, iguala a variavel ao millis.
var = millis().
Depois criamos uma condição para QUANDO a subtração for igual, maior ou maior/igual ao tempo desejado (1000), a ação acontece, ex:
if (millis() - var >= 1000) {
// eventos
}
Então, os eventos irão acontecer.
Vale lembrar que, cada resultado da equação requer atenção especial. Isto é, se você fizer (millis() - var == 1000), então a ação só irá acontecer 1 vez (a não ser que você atualize o var, igualando-o ao novo valor de millis()). Se fizer como o exemplo anterior, e não adicionar uma condição para interromper, ele irá sempre retornar verdadeiro, e isso não costuma ser bom.
Exercício para você:
1) Crie um código onde você consiga, através do millis(), LIGAR um led.
2) Crie um código onde você consiga, através do millis(), executar a ação de DESLIGAR um led CASO ele esteja ligado.
3) Crie um código onde você consiga, através do millis(), criar um loop, onde o led fique ativo por 1 segundo, e depois inativo por 1 segundo.
Depois a gente vai para o próximo passo.
Edit: No primeiro momento pode parecer difícil, mas não é. Na verdade é bem simples. Estou disposto a te ajudar, mas você precisa se ajudar também.
EDIT 2: Quando fizer o que eu disse, você irá perceber o quão simples é o millis, e ficará feliz por ser capaz de utiliza-lo da forma que VOCÊ desejar. hehehe.
Valeu Tiago! Vou fazer o que pediu!
Pessoal, desculpe a colagem no tópico!
Vou analisar a ajuda de todos com carinho!
Assim que possível coloco o resultado aqui (sem colar no post kkk)
Abç
barbadinha 2.0 para entender ainda melhor.
iniciamos o setup com um var = millis()
Num campo hipotético teríamos aos 0 segundos:
millis() == 0
var == 0
1 segundo depois, atribuimos novamente o valor (var = millis()), então teríamos:
var = 1000
millis() = 1000
Mas... e se o valor de var não fosse atualizado? imagine que, 1 segundo se passou e não atualizamos o var, o que teríamos?
var = 1000
millis() = 2000
perceba que, neste caso, a diferença de millis e var (utilizado nas condições como: "millis()-var") será igual a 1000 (2000 - 1000 = 1000), que é a representação, em milissegundos, de 1 segundo.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por