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 ???
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por