[DESAFIO] Depois do desafio, menor blink, agora o desafio é menor delay sem delay(funcao), quebre a cuca e sugira

Olá Galera,

        A algum tempo lançamos uma duvida, o menor blink, visto que o Blink oficial da IDE, tem ao todo 6 linhas ( 1 setagem, 1 no void setup e 4 no void loop)

        O resultado final foi maravilhoso e conseguido não por uma só pessoa, mas pela união da ideia e da discussão de diversos garagistas, e reduziu pra 2 linhas ( 1 no void setup e 1 no void loop) veja ela aqui:

void setup(){
  pinMode(13, OUTPUT);
}

void loop(){
  digitalWrite(13, millis() / 1000 %2);
}

     Bom, o desafio agora é diferente, o desafio é a MENOR CÓDIGO PARA PAUSA SEM A FUNÇÃO DELAY.

    Nesse desafio, deveremos incrementar o valor de uma variável em +1, a cada um segundo, e apresenta-la na serial, porem, sem interromper o codigo como faz a função delay().

     Usando novamente um exemplo da IDE, adaptaremos o exemplo BlinkWinthouDelay:

int conter = 0;   
unsigned long previousMillis = 0;

void setup() {
   Serial.begin(9600);  
}


void loop(){
  if(millis() - previousMillis > 1000) {
      previousMillis = millis();                      
      Serial.println(conter++);         
  }
}

O DESAFIO É:  COMO DIMINUIR O TAMANHO DO CÓDIGO ACIMA ???

Exibições: 400

Responder esta

Respostas a este tópico

Olá Weider!

Segue minha contribuição.

Usando a função do resto da divisão, é possível retirar do código a variável previousMillis :

Como o IF só possui um comando, é possível retirar as chaves para diminuir ainda mais o código.

int conter = 0;  
void setup() {
   Serial.begin(9600); 
}
void loop(){
  if(millis() % 1000 == 0 ) Serial.println(conter++);        
}

Jose Augusto,

              Vibrei aqui e torci quando vi seu código, porem,  para o desejado no desafio ele não corresponde.

               Eu o copiei e executei em um arduino, e ele emite no monitor serial valores de 7 em sete, a cada segundo e não de um.

                Quando executei ele fez assim

0

1

2

3

4

5

6

7

pausa de 1 segundo

8

9

10

11

12

13

14

pausa de 1 segundo

... E POR AI EM DIANTE.

     Quando ele deveria aparecer assim:

0

pausa de 1 segundo

1

pausa de 1 segundo

2

pausa de 1 segundo

e por ai vai....

Mas valeu,  vamos continuar tentando....

Ninguem ????

Weider, bom  dia!

Segue nova versão. Testei e funcionou.
Mudei apenas o tipo da variável counter para uma do tipo inteiro, mas de maior capacidade.
A variável m indica o número de segundos (em milissegundos) desejado.

unsigned long counter = 0;  
int m = 1000;
void setup() {
   Serial.begin(9600);
}
void loop(){
  if((millis() > counter * m)) Serial.println(counter++);  
}

Obs:

1) Como qualquer programa que realiza contagens, deve-se colocar validações para evitar o estouro da variável contadora. Ou seja, uma contagem nunca será infinita.

2) Durante os testes, percebi que o millis dá uma engasgada no começo da contagem.
Por isso que primeira versão do programa não estava funcionando.
Para testar essa engasgada do millis. fiz o seguinte programa:

void setup() {
   Serial.begin(9600);
   
}
void loop(){
  Serial.println(millis());  
}

Veja o resultado. Um monte de zeros e uns no começo para depois iniciar a cronometragem:

Zé Augusto,

    Um milhão de desculpas, eu não havia visto que você tinha respondido, só hoje fui futucar posts antigos e vi.

  

   Bem, talvez eu não tenha me expressado bem qual o objetivo do desafio.

   O objetivo é criar um codigo simples, de preferência uma condição simples de IF, que entrasse nesse condicional somente uma vez a cada mil milissegundos, porem, podendo dentro desse condicional IF, não sendo utilizado NADA do que faz o IF funcionar,  visto que no codigo original, usamos uma variavel de armazenagem e comparação, a qual quando validada, ou seja, quando entra dentro do codigo ela é zerada.

    Então dentro do codigo, outras coisas podem ser postas, criando assim, um BLINK WITHOUT DELAY, ou seja, uma interrupção sem pausa.

    O problema no seu codigo, é que ao que vejo, você utiliza a variavel counter para uma dupla finalidade, ou seja, ela é ao mesmo tempo a variavel de armazenagem e a de exibição, porem, na pratica, seu codigo não é diminuido, visto que continua sendo necessario a existencia da modificação dessa variavel dentro do codigo, pra que ele funcione.

   Resumindo, se eu quiser por exemplo, ao inves de mostrar o valor de counter na serial, eu quiser que um botão ao ser pressionado, ele fique em standby, e só possa ser pressionado novamente, apos 1.000 millis,  esse codigo seu não funcionaria,  ou até funcionaria, desde que eu trouxesse a variavel pra dentro do codigo, mas ai em nada se estaria reduzindo o codigo oficial arduino.

   Logo, fico feliz que estejamos tentando,  pois o antigo desafio ensinou muito pra muita gente, e até hoje eu uso partes dele.

   A ideia agora é criar um blink sem delay, onde o condicional pra fazer entrar no laço , esteja na propria formula do condicinal, e que dentro eu possa colocar qualquer coisa, como um  digitalWrite(13, !digitalRead(13)  por exemplo,  ou seja, um troço que entre dentro do laço a cada 1.000 millis, e que dentro se eu quiser, possa não ter nada.

   Eu coloquei um print de um conter, apenas para ter certeza do funcionamento, mas a ideia é que possa ser qualquer outra coisa.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço