·
Cursos Gerais ·
Linguagens de Programação
Send your question to AI and receive an answer instantly
Recommended for you
11
Portfólio Interdisciplinar ADS - Análise e Desenvolvimento de Sistemas
Linguagens de Programação
UMG
5
Especificacao de Modulos e Funcionalidades de Sistema para Clinica Medica
Linguagens de Programação
UMG
29
Linguagens Formais e Autômatos - Hierarquia de Chomsky
Linguagens de Programação
UMG
4
Trabalho de Java
Linguagens de Programação
UMG
12
Lista de Exercicios R - Manipulacao de Dados e Pacotes
Linguagens de Programação
UMG
1
Análise de Programa em C: Temperaturas em Salvador e São Paulo
Linguagens de Programação
UMG
1
Rdp Web Client
Linguagens de Programação
UMG
1
Lista de Exercícios 05
Linguagens de Programação
UMG
1
Trabalho de Desenvolvimento Web em Html5 com Javascript
Linguagens de Programação
UMG
1
Classes Estagiario e Secretaria em Java - Codigo Fonte
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 ficarã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 passaram 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 tempo 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 implementar essa funcionalidade no Arduino de forma que ele acenda ou apague um LED com um pulso curto ou longo de um botão 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 considerase 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 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 iniciais funções setup e loop pelo valor de estado selecione caso 0 se botão pressionado faça t0 ta faça estado 1 caso 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 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 1 Implemente o código completo declarações globais funções setup e loop para que essa funcionalidade possa ser testada na prática 2 Mova toda a funcionalidade da MEF para uma função void clickCurtoLongobyte i onde i de 0 a 3 seja o índice que permita selecionar um conjunto botãoLED em vetores com 4 botões e 4 LEDs Implemente a função loop de modo que os 4 botões controlem os 4 LEDs independentemente 3 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 anterior para que em vez de acionar o LED ela apenas retorne um código 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 4 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 clickSimplesDuplobyte i que deverá funcionar de forma semelhante à desenvolvida na questão 3 mas agora os códigos serão interpretados assim 0 nenhum evento detectado no botão 1 pulso simples detectado 2 pulso duplo detectado 5 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 todo o procedimento descrito acima para desenvolver uma nova MEF para essa funcionalidade Implementea em uma nova função byte clickRepetebyte i que deverá funcionar de forma semelhante à desenvolvida na questão 3 mas agora os códigos serão interpretados assim 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 6 Combinando as funcionalidades das questões 4 e 5 implemente uma nova função byte eventoBotaobyte i 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 Máquinas de Estados Finitos MEF INÍCIO PROCESSAMENTO FIM INÍCIO PROCESSAMENTO FIM botão LED Estado Atual Condição Ação Estado Futuro 0 b 1 LED 1 1 1 b 0 2 2 b 1 LED 0 3 3 b 0 0 Estado Atual Condição Ação Estado Futuro 0 b1 LED1 1 1 b0 2 2 b1 LED0 3 3 b0 0 função eventoBotao detecta o tipo de evento ocorrido em um botão retorna 0 nenhum evento detectado 1 click simples 2 click duplo 2 clicks em tempo menor que TEMPOCLICKDUPLO 3 click longo 1 click 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 byte eventoBotao static byte estado 0 static unsigned long t0 0 unsigned long ta millis byte ret 0 bool bt digitalReadBOTAO1 switchestado case 0 if bt t0 ta estado 1 break case 1 if bt t0 ta estado 2 else if ta t0 TEMPOCLICKLONGO t0 ta ret 3 click longo estado 3 break case 2 if bt t0 ta ret 2 click duplo estado 3 else if ta t0 TEMPOCLICKDUPLO ret 1 click simples estado 0 break case 3 if bt estado 0 else if ta t0 TEMPOREPETE t0 ta ret 4 modo repetição break return ret
Send your question to AI and receive an answer instantly
Recommended for you
11
Portfólio Interdisciplinar ADS - Análise e Desenvolvimento de Sistemas
Linguagens de Programação
UMG
5
Especificacao de Modulos e Funcionalidades de Sistema para Clinica Medica
Linguagens de Programação
UMG
29
Linguagens Formais e Autômatos - Hierarquia de Chomsky
Linguagens de Programação
UMG
4
Trabalho de Java
Linguagens de Programação
UMG
12
Lista de Exercicios R - Manipulacao de Dados e Pacotes
Linguagens de Programação
UMG
1
Análise de Programa em C: Temperaturas em Salvador e São Paulo
Linguagens de Programação
UMG
1
Rdp Web Client
Linguagens de Programação
UMG
1
Lista de Exercícios 05
Linguagens de Programação
UMG
1
Trabalho de Desenvolvimento Web em Html5 com Javascript
Linguagens de Programação
UMG
1
Classes Estagiario e Secretaria em Java - Codigo Fonte
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 ficarã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 passaram 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 tempo 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 implementar essa funcionalidade no Arduino de forma que ele acenda ou apague um LED com um pulso curto ou longo de um botão 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 considerase 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 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 iniciais funções setup e loop pelo valor de estado selecione caso 0 se botão pressionado faça t0 ta faça estado 1 caso 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 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 1 Implemente o código completo declarações globais funções setup e loop para que essa funcionalidade possa ser testada na prática 2 Mova toda a funcionalidade da MEF para uma função void clickCurtoLongobyte i onde i de 0 a 3 seja o índice que permita selecionar um conjunto botãoLED em vetores com 4 botões e 4 LEDs Implemente a função loop de modo que os 4 botões controlem os 4 LEDs independentemente 3 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 anterior para que em vez de acionar o LED ela apenas retorne um código 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 4 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 clickSimplesDuplobyte i que deverá funcionar de forma semelhante à desenvolvida na questão 3 mas agora os códigos serão interpretados assim 0 nenhum evento detectado no botão 1 pulso simples detectado 2 pulso duplo detectado 5 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 todo o procedimento descrito acima para desenvolver uma nova MEF para essa funcionalidade Implementea em uma nova função byte clickRepetebyte i que deverá funcionar de forma semelhante à desenvolvida na questão 3 mas agora os códigos serão interpretados assim 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 6 Combinando as funcionalidades das questões 4 e 5 implemente uma nova função byte eventoBotaobyte i 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 Máquinas de Estados Finitos MEF INÍCIO PROCESSAMENTO FIM INÍCIO PROCESSAMENTO FIM botão LED Estado Atual Condição Ação Estado Futuro 0 b 1 LED 1 1 1 b 0 2 2 b 1 LED 0 3 3 b 0 0 Estado Atual Condição Ação Estado Futuro 0 b1 LED1 1 1 b0 2 2 b1 LED0 3 3 b0 0 função eventoBotao detecta o tipo de evento ocorrido em um botão retorna 0 nenhum evento detectado 1 click simples 2 click duplo 2 clicks em tempo menor que TEMPOCLICKDUPLO 3 click longo 1 click 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 byte eventoBotao static byte estado 0 static unsigned long t0 0 unsigned long ta millis byte ret 0 bool bt digitalReadBOTAO1 switchestado case 0 if bt t0 ta estado 1 break case 1 if bt t0 ta estado 2 else if ta t0 TEMPOCLICKLONGO t0 ta ret 3 click longo estado 3 break case 2 if bt t0 ta ret 2 click duplo estado 3 else if ta t0 TEMPOCLICKDUPLO ret 1 click simples estado 0 break case 3 if bt estado 0 else if ta t0 TEMPOREPETE t0 ta ret 4 modo repetição break return ret