·
Cursos Gerais ·
Linguagens de Programação
Send your question to AI and receive an answer instantly
Recommended for you
3
Registro de Aulas Práticas: Procedimentos e Passos para o Registro de Ocorrência
Linguagens de Programação
UMG
1
Histograma de Notas e Maior Nota por Cargo - Concurso
Linguagens de Programação
UMG
6
Atividade em C
Linguagens de Programação
UMG
8
Projeto Angular Catalogo de Livros - Implementacao de Componentes e Servicos
Linguagens de Programação
UMG
5
Algoritmos em Pascal - Exemplos de Soma, Multiplicação e Dados Pessoais
Linguagens de Programação
UMG
1
Implementacao-Classes-Shape-Circle-Rectangle-em-C
Linguagens de Programação
UMG
1
Resolucao de Saidas de Ponteiros em C++ - Exercicio de Programacao
Linguagens de Programação
UMG
1
Exercício de Programação C - Manipulação de Struct user com Dados de Usuário
Linguagens de Programação
UMG
1
Trabalho de Desenvolvimento Web em Html5 com Javascript
Linguagens de Programação
UMG
1
Exercicios Resolvidos de Alocacao Dinamica Funcoes Ponteiros e Estruturas em C
Linguagens de Programação
UMG
Preview text
Temporização não bloqueante Até aqui temos usado a função delay para temporização de nossos programas o problema é que essa função é bloqueante ou seja ela faz com que o programa fique travado durante todo o tempo até que o delay acabe e isso é indesejado quando seu sistema é multitarefa porque todas as tarefas f icarão travadas quando uma delas executar um delay Para contornar esse problema o Arduino dispõe da função millis que não bloqueia a execução do programa Funciona assim o Arduino tem um relógio interno que conta quantos milissegundos se passara m desde que o mesmo foi ligado Esse relógio está contando independente a execução do seu programa quando a função millis é chamada ela simplesmente retorna o valor desse contador Caberá a você programador usar esse valor para decidir se está no t empo de executar a ação desejada Vejamos um exemplo Considere o botão ligadesliga do seu smartphone ou do PC com um pulso curto ele liga o aparelho e com um pulso longo mantendoo pressionado por cerca de 2s ou mais ele desliga Como implementa r essa funcionalidade no Arduino de forma que ele acenda ou apague um LED com um pulso curto ou longo de um botão botão LED 0 bt 0 1 bt 1 t0 millis bt 0 LED HIGH 2 millis t0 2000 LED LOW bt 0 T botão LED 0 bt 0 1 bt 1 t0 millis bt 0 LED HIGH 2 millis t0 2000 LED LOW bt 0 T Vou demonstrar aqui uma solução usando MEF Claro que essa não é a única solução mas acredito ser a forma mais fácil de abordar o problema Se você quiser tentar outras formas desejolhe boa sorte e que me traga o resultado Vamos à descrição passo a passo do raciocínio que nos leva à construção do Diagrama de Estados A cada rodada do programa atualizaremos as variáveis ta millis e b digitalReadBOTAO Enquanto o botão não for pressionado b0 o sistema permanecerá em seu estado inicial 0 Quando o botão for pressionado o sistema fará a inicialização da contagem do tempo t0 ta e então passará para o estado seguinte 1 No estado 1 faremos a contagem do tempo que o botão permanece pressionado Aqui há duas condições de saída se o botão permanecer pressionado por muito tempo a diferença ta t0 vai crescendo continuamente até que chegando ao limite estabelecido ta t0 2000 considera se que houve um pulso longo o LED será apagado e o sistema vai para o estado 2 Caso contrário se o botão for liberado antes da contagem atingir o limite ta t0 2000 considerase que foi dado um pulso curto o LED será aceso e o sistema volta ao estado inicial 0 para aguardar um novo pulso O estado 2 é necessário para que o sistema espere a liberação do botão b0 após o pulso longo antes de voltar ao estado inicial 0 0 1 2 b1 t0ta b1 tat0T S0 b0 S1 b0 b0 b1 0 1 2 b1 t0ta b1 tat0T S0 b0 S1 b0 b0 b1 Estado Atual Condição Ação Estado Futuro 0 b0 0 0 b1 t0 ta 1 1 b0 S1 0 1 b1 1 1 tat0T S0 2 2 b0 0 2 b1 2 Diagrama de Estados Tabela de Transições A seguir vemos o Algoritmo à esquerda e o código à direita correspondentes à MEF descrita acima Note que o código não está completo contém estritamente a funcionalidade correspondente ao algoritmo mas você precisa complementar com as declarações i niciais funções setup e loop pelo valor de estado selecione caso estado 0 se botão pressionado faça t0 ta faça estado 1 caso estado 1 se botão não pressionado ative a Saída faça estado 0 caso contrário se tat0T desative a Saída faça estado 2 caso estado 2 se botão não pressionado faça estado 0 static byte estado 0 static unsigned long t0 0 unsigned long ta millis bool b digitalReadBOTAO switch estado case 0 if b 1 t0 ta estado 1 break case 1 if b 0 digitalWrite S HIGH estado 0 else if ta t0 T digitalWrite S LOW estado 2 break case 2 if b 0 estado 0 break Exercícios Implemente o código completo declarações globais funções setup e loop para que essa funcionalidade possa ser testada na prática Mova toda a funcionalidade da MEF para uma função void clickCurtoLongo A função acima mistura duas funcionalidades a de identificar se o pulso é curto ou longo e a de acionar o LED de acordo com a duração do pulso Já vimos que isso não é uma boa prática Modifique a função da questão anterior para byte clickCurtoLongo de modo que em vez de acionar o LED ela ap enas retorne um valor um byte para indicar o comportamento detectado no botão Caberá ao programa principal com esse código retornado decidir qual ação tomar A função deverá retornar os códigos a seguir 0 nenhum evento detectado no botão 1 pulso curto detectado 2 pulso longo detectado Agora considere a funcionalidade que temos no uso do botão do mouse ou nos dispositivos sensíveis ao toque onde um toque simples faz uma coisa um toque duplo faz outra Siga todo o procedimento descrito acima para desenvolver uma nova MEF para essa funcionalidade Implementea em uma nova função byte clickSimplesDuplo que deverá funcionar de forma semelhante à desenvolvida na questão 3 mas agora os val ores de retorno serão interpretados assim 0 nenhum evento detectado no botão 1 pulso simples detectado 2 pulso duplo detectado Agora considere o comportamento do teclado do PC suponha que você esteja usando um editor de textos ao pressionar uma tecla qualquer o caractere correspondente vai aparecer na tela Se a tecla continuar pressionada por algum tempo 1s digamos esta entra em modo de repetição e o caractere será repetido na tela com uma certa velocidade a cada 200ms digamos Siga t odo o procedimento descrito acima para desenvolver uma nova MEF para essa funcionalidade Implementea em uma nova função byte clickRepete que deverá funcionar de forma semelhante à desenvolvida na questão 3 mas agora os códigos serão interpretados a ssim 0 nenhum evento detectado no botão 1 o botão foi pressionado nesse momento 2 o botão entrou em modo de repetição e esse código será retornado a cada 200ms intercalado com 0 Combinando as funcionalidades das questões 4 e 5 implemente uma nova função byte eventoBotao que detecta o tipo de evento ocorrido em um botão retornando os códigos abaixo 0 nenhum evento detectado 1 click simples 1 pulso com duração menor que TEMPOCLICKLONGO 2 click duplo 2 pulsos em tempo menor que TEMPOCLICKDUPLO 3 click longo 1 pulso com duração maior que TEMPOCLICKLONGO 4 modo repetição após click longo persistindo botão pressionado emite esse código a cada intervalo TEMPOREPETE
Send your question to AI and receive an answer instantly
Recommended for you
3
Registro de Aulas Práticas: Procedimentos e Passos para o Registro de Ocorrência
Linguagens de Programação
UMG
1
Histograma de Notas e Maior Nota por Cargo - Concurso
Linguagens de Programação
UMG
6
Atividade em C
Linguagens de Programação
UMG
8
Projeto Angular Catalogo de Livros - Implementacao de Componentes e Servicos
Linguagens de Programação
UMG
5
Algoritmos em Pascal - Exemplos de Soma, Multiplicação e Dados Pessoais
Linguagens de Programação
UMG
1
Implementacao-Classes-Shape-Circle-Rectangle-em-C
Linguagens de Programação
UMG
1
Resolucao de Saidas de Ponteiros em C++ - Exercicio de Programacao
Linguagens de Programação
UMG
1
Exercício de Programação C - Manipulação de Struct user com Dados de Usuário
Linguagens de Programação
UMG
1
Trabalho de Desenvolvimento Web em Html5 com Javascript
Linguagens de Programação
UMG
1
Exercicios Resolvidos de Alocacao Dinamica Funcoes Ponteiros e Estruturas em C
Linguagens de Programação
UMG
Preview text
Temporização não bloqueante Até aqui temos usado a função delay para temporização de nossos programas o problema é que essa função é bloqueante ou seja ela faz com que o programa fique travado durante todo o tempo até que o delay acabe e isso é indesejado quando seu sistema é multitarefa porque todas as tarefas f icarão travadas quando uma delas executar um delay Para contornar esse problema o Arduino dispõe da função millis que não bloqueia a execução do programa Funciona assim o Arduino tem um relógio interno que conta quantos milissegundos se passara m desde que o mesmo foi ligado Esse relógio está contando independente a execução do seu programa quando a função millis é chamada ela simplesmente retorna o valor desse contador Caberá a você programador usar esse valor para decidir se está no t empo de executar a ação desejada Vejamos um exemplo Considere o botão ligadesliga do seu smartphone ou do PC com um pulso curto ele liga o aparelho e com um pulso longo mantendoo pressionado por cerca de 2s ou mais ele desliga Como implementa r essa funcionalidade no Arduino de forma que ele acenda ou apague um LED com um pulso curto ou longo de um botão botão LED 0 bt 0 1 bt 1 t0 millis bt 0 LED HIGH 2 millis t0 2000 LED LOW bt 0 T botão LED 0 bt 0 1 bt 1 t0 millis bt 0 LED HIGH 2 millis t0 2000 LED LOW bt 0 T Vou demonstrar aqui uma solução usando MEF Claro que essa não é a única solução mas acredito ser a forma mais fácil de abordar o problema Se você quiser tentar outras formas desejolhe boa sorte e que me traga o resultado Vamos à descrição passo a passo do raciocínio que nos leva à construção do Diagrama de Estados A cada rodada do programa atualizaremos as variáveis ta millis e b digitalReadBOTAO Enquanto o botão não for pressionado b0 o sistema permanecerá em seu estado inicial 0 Quando o botão for pressionado o sistema fará a inicialização da contagem do tempo t0 ta e então passará para o estado seguinte 1 No estado 1 faremos a contagem do tempo que o botão permanece pressionado Aqui há duas condições de saída se o botão permanecer pressionado por muito tempo a diferença ta t0 vai crescendo continuamente até que chegando ao limite estabelecido ta t0 2000 considera se que houve um pulso longo o LED será apagado e o sistema vai para o estado 2 Caso contrário se o botão for liberado antes da contagem atingir o limite ta t0 2000 considerase que foi dado um pulso curto o LED será aceso e o sistema volta ao estado inicial 0 para aguardar um novo pulso O estado 2 é necessário para que o sistema espere a liberação do botão b0 após o pulso longo antes de voltar ao estado inicial 0 0 1 2 b1 t0ta b1 tat0T S0 b0 S1 b0 b0 b1 0 1 2 b1 t0ta b1 tat0T S0 b0 S1 b0 b0 b1 Estado Atual Condição Ação Estado Futuro 0 b0 0 0 b1 t0 ta 1 1 b0 S1 0 1 b1 1 1 tat0T S0 2 2 b0 0 2 b1 2 Diagrama de Estados Tabela de Transições A seguir vemos o Algoritmo à esquerda e o código à direita correspondentes à MEF descrita acima Note que o código não está completo contém estritamente a funcionalidade correspondente ao algoritmo mas você precisa complementar com as declarações i niciais funções setup e loop pelo valor de estado selecione caso estado 0 se botão pressionado faça t0 ta faça estado 1 caso estado 1 se botão não pressionado ative a Saída faça estado 0 caso contrário se tat0T desative a Saída faça estado 2 caso estado 2 se botão não pressionado faça estado 0 static byte estado 0 static unsigned long t0 0 unsigned long ta millis bool b digitalReadBOTAO switch estado case 0 if b 1 t0 ta estado 1 break case 1 if b 0 digitalWrite S HIGH estado 0 else if ta t0 T digitalWrite S LOW estado 2 break case 2 if b 0 estado 0 break Exercícios Implemente o código completo declarações globais funções setup e loop para que essa funcionalidade possa ser testada na prática Mova toda a funcionalidade da MEF para uma função void clickCurtoLongo A função acima mistura duas funcionalidades a de identificar se o pulso é curto ou longo e a de acionar o LED de acordo com a duração do pulso Já vimos que isso não é uma boa prática Modifique a função da questão anterior para byte clickCurtoLongo de modo que em vez de acionar o LED ela ap enas retorne um valor um byte para indicar o comportamento detectado no botão Caberá ao programa principal com esse código retornado decidir qual ação tomar A função deverá retornar os códigos a seguir 0 nenhum evento detectado no botão 1 pulso curto detectado 2 pulso longo detectado Agora considere a funcionalidade que temos no uso do botão do mouse ou nos dispositivos sensíveis ao toque onde um toque simples faz uma coisa um toque duplo faz outra Siga todo o procedimento descrito acima para desenvolver uma nova MEF para essa funcionalidade Implementea em uma nova função byte clickSimplesDuplo que deverá funcionar de forma semelhante à desenvolvida na questão 3 mas agora os val ores de retorno serão interpretados assim 0 nenhum evento detectado no botão 1 pulso simples detectado 2 pulso duplo detectado Agora considere o comportamento do teclado do PC suponha que você esteja usando um editor de textos ao pressionar uma tecla qualquer o caractere correspondente vai aparecer na tela Se a tecla continuar pressionada por algum tempo 1s digamos esta entra em modo de repetição e o caractere será repetido na tela com uma certa velocidade a cada 200ms digamos Siga t odo o procedimento descrito acima para desenvolver uma nova MEF para essa funcionalidade Implementea em uma nova função byte clickRepete que deverá funcionar de forma semelhante à desenvolvida na questão 3 mas agora os códigos serão interpretados a ssim 0 nenhum evento detectado no botão 1 o botão foi pressionado nesse momento 2 o botão entrou em modo de repetição e esse código será retornado a cada 200ms intercalado com 0 Combinando as funcionalidades das questões 4 e 5 implemente uma nova função byte eventoBotao que detecta o tipo de evento ocorrido em um botão retornando os códigos abaixo 0 nenhum evento detectado 1 click simples 1 pulso com duração menor que TEMPOCLICKLONGO 2 click duplo 2 pulsos em tempo menor que TEMPOCLICKDUPLO 3 click longo 1 pulso com duração maior que TEMPOCLICKLONGO 4 modo repetição após click longo persistindo botão pressionado emite esse código a cada intervalo TEMPOREPETE