Quiz 0x01

42 views
Skip to first unread message

DQ

unread,
Mar 29, 2016, 8:26:39 AM3/29/16
to Garoa Hacker Clube
== INTRO ==
0. Um problema
1. Uma discussao
2. Quem sabe a resposta, nao conta, mas pode colaborar na discussao
3. O objetivo nao eh responder e sim discutir
4: A resposta (caso conhecida) sera dada numa thread separada depois de uns dias
5. Nao se esqueca: be excellent to each other
6. Tem uma proposta de problema? Abra um quiz vc tb!

== O PROBLEMA ==
Aquecendo para o Arduino Day, um probleminha para quem está começando a programar para o Arduino pensar em estruturas mais sofisticadas que a do Blink.

Considere dois botões (B1 e B2) ligados a duas entradas digitais e dois LEDs (LED1 e LED2) ligados a duas saídas digitais de um Arduino. Sua missão é piscar o LED1 2 vezes por segundo enquanto o B1 estiver apertado e piscar o LED2 5 vezes por segundo enquanto o B2 estiver apertado. Quando um botão estiver solto o LED correspondente deve ficar apagado. Sendo mais explícito, os botões devem ser tratados de forma independente; por exemplo deve funcionar corretamente se apertar B2 e soltar B2 enquanto B1 está apertado.


Felipe Sanches

unread,
Mar 29, 2016, 8:39:59 AM3/29/16
to Garoa HC
esclarecimento: Tem que piscar com duty-cyle de 50% ?
> --
> -... . . -..- -.-. . .-.. .-.. . -. - - --- . .- -.-. .... --- - .... . .-.
> Regras da Lista: https://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend
> Para mais informações sobre o Garoa Hacker Clube acesse https://garoa.net.br
> Maiores opções sobre o Google Groups, visite:
> https://groups.google.com/group/hackerspacesp
> .--. .- .-. .- -- .- .. ... .. -. ..-. --- .-. -- .- . ... .- -.-. . ... ...
> . --- .-- .. -.- ..
> Epoch 0 <=> Fundação: 1298244863 s ~ 2.408064*10^52 tP (tempos de Planck)

DQ

unread,
Mar 29, 2016, 9:04:43 AM3/29/16
to Garoa Hacker Clube
Podemos estabelecer que sim.

DQ

Raimundo Nonato Pimenta Filho

unread,
Mar 29, 2016, 9:21:00 AM3/29/16
to hacker...@googlegroups.com
Os osciladores / contadores / temporizadores rodam independente do
estado dos botões?
Ou rodam apenas quando os botões estão pressionados?

Associado a esta dúvida, a frequência ou rebatimento dos botões.
Ao soltar o botão o LED se apaga imediatamente ou termina o tempo de aceso?
Há algum sincronismo dos estados dos temporizadores, ou LEDs,
associado aos botões?

[]s

DQ

unread,
Mar 29, 2016, 9:36:05 AM3/29/16
to Garoa Hacker Clube

On Tuesday, March 29, 2016 at 10:21:00 AM UTC-3, Raimundo Nonato Pimenta Filho wrote:
Os osciladores / contadores / temporizadores rodam independente do
estado dos botões?
Ou rodam apenas quando os botões estão pressionados?
Associado a esta dúvida, a frequência ou rebatimento dos botões.
Ao soltar o botão o LED se apaga imediatamente ou termina o tempo de aceso?
Há algum sincronismo dos estados dos temporizadores, ou LEDs,
associado aos botões?

[]s


Sinta-se à vontade para estudar as várias alternativas  ; )

Talvez seja mais fácil  implementar os osciladores / contadores / temporizadores rodando de forma independente, mas mudar o estado do LED imediatamente quando aperta ou solta o botão talvez dê um melhor retorno para o "usuário".

Na Noite do Arduino a gente monta o circuito e testa as propostas de soluções.

DQ

Felipe Sanches

unread,
Mar 29, 2016, 9:55:06 AM3/29/16
to Garoa HC
* 5 Hz = 5 ciclos por segundo = 200ms por ciclo = 100ms por meio ciclo
* 2 Hz = 2 ciclos por segundo = 500ms por ciclo = 250ms por meio ciclo

Então se usarmos um loop principal com delay de 50ms, podemos contar:
* 2 loops principais por meio ciclo da onda de 5Hz
* 5 loops principais por meio ciclo da onda de 2Hz

Acho que é esse o caminho... Ter 2 contadores e definir o estado d
ecada LED de acordo com o valor de cada contador. (E só ativar de fato
os LEDs caso o botão respectivo esteja pressionado e a contagem
respectiva esteja em uma das fases de meio-ciclo).

DQ

unread,
Mar 29, 2016, 10:33:59 AM3/29/16
to Garoa Hacker Clube
Esta é uma forma de fazer os contadores rodando de forma independente, agora deixe os novatos codificarem...

Alguém sugere uma outra forma?

DQ

Oda

unread,
Mar 29, 2016, 1:23:40 PM3/29/16
to hacker...@googlegroups.com
vamos comecar pela versao mais simples possivel para animar o pessoal?
segue um rascunho para 1 led para a gente comecar a jogar pedra:

int led1_estado=0;
long led1_ultima_mudanca=0;
voip loop(){
long agora=millis();
if(B1 apertado){
if(agora-led1_ultima_mudanca>250){
if(led1_estado==0){
led1_estado=1;
}else{
led1_estado=0;
}
led1_ultima_mudanca=agora;
}
}else{
led1_estado=0;
led1_ultima_mudanca=0;
}
LED1=led1_estado;
}

Isso esta terrivel... bora melhorar e colocar o outro par led/botao ;)

--
Oda
------------------------------------------------------
If you don't have time to do it right, where
are you going to find the time to do it over?
------------------------------------------------------

Dalton Barreto

unread,
Mar 29, 2016, 2:00:56 PM3/29/16
to hacker...@googlegroups.com
Animam de colocar esse código no github para que o pessoal que queira ajudar possa abrir pull requests lá? Acho que fica mais organizado. Não sei se existe uma conta no github do Garoa, seria o ideal.

Ou a idéia é que a discussão (e postagem de soluções) permaneça aqui na lista?

Na empresa onde trabalho temos um grupo de estudo uma vez por semana. Nesse grupo, cada pessoa estuda o que quiser e o fato de existirem mais pessoas o mesmo local físico permite a troca de ideias, mesmo que nem todo mundo esteja estudando o mesmo assunto.

Eu e mais dois amigos estamos estudando eletrônica, posso propor para eles de tentarmos submeter uma solução para esse Quiz.

Abraços,

p.s Por mais desafios como esse!!! =D
 
--

DQ

unread,
Mar 29, 2016, 2:22:53 PM3/29/16
to Garoa Hacker Clube
Temos conta no github (https://github.com/garoa/) mas eu acho melhor a discussão ficar na lista. Inclusive porque já temos duas sugestões bem diferentes: a do Juca (que usa contadores + delay) e a do Oda (que testa a "hora" atual).

DQ

Dalton Barreto

unread,
Mar 29, 2016, 4:32:03 PM3/29/16
to hacker...@googlegroups.com
Blz! Sugeri o github pois seria mais fácil de visualizar uma implementação maior, por exemplo com múltiplos arquivos, uso de classes e etc. Mas para sugestões de solução sem código, como a do Sanches, de boas na lista.

Minha estratégia é a mesma do Oda, usar a "hora atual" para saber se tenho que rodar tal tarefa novamente. Essa é a técnica que já vi implementada em muitos "Task Schedulers" que encontrei pelo mundo. =D

Precisarei de um em breve, inclusive. =D

Oda

unread,
Mar 29, 2016, 6:31:36 PM3/29/16
to hacker...@googlegroups.com

Entao continua o código ae, Dalton!

Dalton Barreto

unread,
Mar 29, 2016, 8:49:54 PM3/29/16
to hacker...@googlegroups.com

Fizemos essa “prova de conceito” hoje no grupo de estudos. Não tem o lógica do botão porque não tínhamos botoes para montar o protótipo. =D

Acredito que seria uma questão de adicionar um “if botao no estado que eu quero” cercando a lógica que faz “toggle” no pino e, claro, mudar a assinatura da task_func_ptr para receber mais alguns parametros, indicando o pino onde o botão está ligado e o estado desejado do botão.

Como tinha comentado antes, a implementação segue a mesma ideia que o Oda já tinha mencionado, usando “millis()” como referência de tempo. Está aí mais código pra ser apedrejado! rsrsr


typedef void (*task_func_ptr)(int);

typedef struct task_t{
  int freq;
  task_func_ptr run;
  int pin;
  int last_run;
}task_t;

void pin_toggle(int pin){
  if (digitalRead(pin) == HIGH){
    digitalWrite(pin, LOW);
  }
  else {
    digitalWrite(pin, HIGH);
  }
}

task_t tasks[2];

void setup() {                
  pinMode(2, OUTPUT);     
  pinMode(3, OUTPUT);
  tasks[0].freq = 500;
  tasks[0].run = pin_toggle;
  tasks[0].pin = 2;
  tasks[0].last_run = 0;

  tasks[1].freq = 200;
  tasks[1].run = pin_toggle;
  tasks[1].pin = 3;    
  tasks[1].last_run = 0;  
}

void loop() {
  int now;
  while (true){
    now = millis();
    for (int t=0; t < 2; t++){
        if ((now - tasks[t].last_run) >= tasks[t].freq){
          tasks[t].run(tasks[t].pin);
          tasks[t].last_run = now;
        }
    }
  }
}

Quem continua e adiciona a lógica dos botões? =D

Valeu!

Sebastião Barretto

unread,
Mar 31, 2016, 8:48:40 AM3/31/16
to Garoa Hacker Clube
Desculpe, mas depois de passar alguns minutos tentando entender o código (talvez eu ainda esteja com sono), achei que estruturas e ponteiros devem ser usados apenas quando são realmente necessários e simplificam o código. Sempre gosto de códigos que economizem bytes de memória tanto nos códigos objetos como nos fontes (é claro que os bytes gastos nos comentários não se incluem nessa conta).

Sebastião. 

Dalton Barreto

unread,
Mar 31, 2016, 9:46:25 AM3/31/16
to hacker...@googlegroups.com
Em 31 de março de 2016 09:48, Sebastião Barretto <ssbar...@gmail.com> escreveu:
Desculpe, mas depois de passar alguns minutos tentando entender o código (talvez eu ainda esteja com sono), achei que estruturas e ponteiros devem ser usados apenas quando são realmente necessários e simplificam o código. Sempre gosto de códigos que economizem bytes de memória tanto nos códigos objetos como nos fontes (é claro que os bytes gastos nos comentários não se incluem nessa conta).


Foi exatamente por isso que usei, para simplificar o código que o Oda tinha postado (e ele mesmo tinha já achado horrível). E nem tem tanto ponteiro assim, só tem *um*! Dá uma chance pro amigo. =D

Outro detalhe, esse código foi escrito em menos de 30 minutos então pode não estar tão legível.

É uma implementação genérica para a ideia do Oda, "mais simples" no sentido que de não temos uma "festa de ifs" e flags globais que controlam o o estado das coisas.

Não sei se você desistiu de entender o código (o que seria uma pena), mas se tiver quaisquer dúvidas posso explicar qual a ideia geral e o que o código está fazendo.

Valeu!
Reply all
Reply to author
Forward
0 new messages