senhores, depois de muito pesquisar verifiquei que o attachInterrupt assim que coloco sensível a borda de subida o arduino para de executar até até que a condição mude ou seja de 16MHz passa a funcionar perto dos 60Hz, como tenho menus e mais 2 sensores, isso se reflete como lentidão nos processos. ao tirar o fio que chega ao pino2 (responsável pelo attachInterrupt) o circuito funcionar perfeitamente, outra curiosidade é quando aumenta e velocidade do dimmer a velocidade do menu também aumenta.

Então, como solucionar ?

Pensei em 2 idéias, uma seria tentar acoplar um circuito que corte o sinal que chega ao pino 2, este circuito seria responsável pela abertura do pino quando se manipula o menus.  

Uma outra solução más aí já não sei como se comunica seria comprar aqueles mini Arduino que custa no ME R$12,00 deixar o dimmer rodando nele e mandar via I2C ou RX/TX as informações de execução.

o que os senhores acham?

este é o vídeo de como está funcionando atualmente.

https://www.youtube.com/watch?v=ZM6t7X7qRAQ&feature=youtu.be

vlw

Exibições: 972

Responder esta

Respostas a este tópico

pensei em usar o 4066..vou começar os testes..

Sua explicação esta confusa. Informe detalhes do projeto, sketch, diagramas, etc. 

O problema que pode estar tendo é o de bounce nas teclas (pulsos espúrios) !

https://www.arduino.cc/en/Tutorial/Debounce

https://en.wikipedia.org/wiki/Switch#Contact_bounce

Obrigado por responder, más o problema não deve (acho eu) está relacionado a Debounce, até porque quando desligo o pino (pino 2) do attachInterrupt, tudo funciona normalmente..No esquema elétrico seria o ZeroCrossing..Li em alguns artigos que attachInterrupt pausa o que o Arduíno até que o status do pulso muda, que no caso da rede elétrica muda 60 vezes (que é o sinal que o ZeroCrossing). ou seja lentidão total no aplicativo. daí propus uma alternativa para poder contornar este problema de forma eletrônica. más entendo agora que usar um segundo Arduíno somente para a função do dimmer (slave) seria uma opção menos problemática, enquanto o outro ordena(master). ou seja por programação acredito que não tem como resolver..ví vários casos semelhantes que os autores ou mudaram ou simplesmente desistiram.. 

Então é problema na programação (sketch). 

porque acha isso ? você viu o vídeo ? se fosse isso tava filé demais más acredito que não. este tópico a pessoa descreve o problema..

http://br-arduino.org/2016/04/arduino-interrupcoes-timer1.html 

de toda forma o dá uma olhada no código..

http://pastebin.com/yBGX2TJs

Obrigado por responder, más o meu dimmer funciona, ele só não gosta de brincar com outros colega dele, menus, sensores..rsrsr

Oi GCM, boa noite.

Primeiro vamos falar sobre conceitos:

O que é um interrupt em um computador ou ucontrolador?

É uma interrupção de um processo causado por um evento.

Um evento pode ser interno ou externo.

Evento interno:  estouro de timer, Watchdog Time-out Interrupt, SPI Serial Transfer Complete, etc

Evento externo: Pin Change Interrupt Request 0,Pin Change Interrupt Request 1, etc

Ao ocorrer um evento, a execução normal de um program é "interrompida" ( daí a origem do 

nome interrupt). Os registradores de controle do processador são salvos, e um determinado

endereço de memoria é colocado no registrador de controle de programa.

Em outras palavras, uma função especifica é chamada.

O compilador do arduino permite escolher o nome e criar esta função.

Após terminar de executar esta função chamada pelo interrupt, o processador restaura os

valores salvos e volta onde ele estava no seu processamento.

O compilador do arduino permite selecionar o tipo de evento dos interrupt dos

port 2 e 3 (No UNO),.

FALLING (queda)  É qdo por uma ocorrência externa do o port muda de +5V para 0V;

RISING (subida)  É qdo por uma ocorrência externa do o port muda de  0V para +5V;

LOW  (Baixo) Enquanto o port estiver em nível baixo;

CHANGE  (Mudança) Qdo qualquer mudança no port, seja de 0V para +5V ou +5V para 0.

Fim de conceito

Agora vamos falar de pratica.

Primeiro uma correção:

esta sua frase está errada:  

       "que no caso da rede elétrica muda 60 vezes (que é o sinal que o ZeroCrossing). "

Se a rede é de 60 HZ, o ZeroCrossing acontece 120 vezes por segundo.

Agora vamos as contas:  1000ms / 120 = 8,3333333......ms

120 vezes por segundo significa  que entre uma e outra passagem pelo zero o tempo é de

 8,333ms, ou seja em um code de dimmer, ao passar pelo zero, acontece um interrupt externo.

Aí o processador para e vai atender o interrupt, para depois voltar a fazer o que estava fazendo.

Se você  vai disparar o triac neste momento, a perda de tempo é muito pequena.

Mas se você vai disparar o triac, digamos nos últimos 15% do tempo (pouca luz), você tem

que esperar passar 85% do tempo antes de mandar o sinal pra disparar o triac.

Em resumo: Ao passar pelo zero, há uma interrupcão, o processador para o que estáva

fazendo, espera 7ms e dispara o triac. Sobram 1,33 ms antes da próxima passagem pelo zero.

O que se pode fazer é usar recursos que aproveitem estes tempos "7 ms e 1.33 ms"para

fazer as outras tarefas do seu code, como por exemplo gerenciar menus.

Um recurso é usar millis() ao invés de delays, e o outro  é usar millis() combinado com threads.

Rui

Obrigado por responder, Rui sempre atendendo aos chamados, realmente a sua correção está correta sobre a frequência, fiz confusão com o período e ignorei completamente a passagem pelo zero, estou de acordo com todo o conceito que falou, tive que estudar e pesquisar sobre este assunto mesmo não tendo conhecimento para tal e estou realmente a par disso, e para te ser honesto isto é um projeto de inciativa própria que estou fazendo para faculdade a titulo apenas de agregar conhecimento e claro se as informações obtidas pelas variáveis durante o período de testes, talvez uso como tema de TCC para o ano que vem quando formo.

Como todo projeto, este não é o primeiro (o segundo envolvendo programação) sempre me deparei com algum problema e este não está sendo diferente, más não se trata do programa, ele está funcionando e muito bem, vc mesmo me ajudou muito nisso, más sim uma limitação do hardware, e essa é minha proposta nesse tópico, como resolver isso..o meu projeto inteiro tem 783 linhas e usa 2 delays apenas, um no setup apenas para fazer um splash, e um para exibir a temperatura e mesmo assim em um switcase, e quando tiro a conexão do pino 2 tudo roda normal, sensores, menus..

Más funcionaria sim se deixasse como está, más para mim isto se resume a um projeto incompleto e é aí que entra o desafio (aliás este projeto esta sendo um desafio desde o começo), encontrando solução para isso. 

Aí entro lá no inicio do tópico soluções para isso, corrigir eletronicamente ou adicionando um outro Arduíno somente para o dimmer e comanda-lo pelo rx/tx. com relação a programação acredito eu que esteja correta, até poque vc foi que deu a ultima dica, e como te passei o código inteiro e vc mesmo falou que estava correto e dei este como encerrado.

Más ainda sobre a programação pode ser uma questão de percepção sobre o problema (lentidão do menu) pode ser normal para vc pode não ser normal pra mim ou não atender as minhas expectativas, más acho que este não é o caso.

Já me falaram aqui no fórum que estou carregando demais o Arduíno com os sensores e saídas e que estão lentidão faz parte do processo, por isso penso que 2 Arduínos pensam melhor do que um.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço