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!

Exibições: 330

Responder esta

Respostas a este tópico

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. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço