Controle de uma Lâmpada incandescente utilizando o shield dimmer e Arduino

Bom dia, estou com um problema na aquisição de dados pelo monitor serial do Arduíno, quando controlo uma lâmpada incandescente... eu utilizei o Dimmer Shield acoplado ao arduino, e em sua programação conforme o lab de garagem fornece, temos que a passagem pelo zero, gerá um Delay variável, que é necessário para o correto funcionamento do dimmer! mas quando eu quero fazer a aquisição de dados em tempo real, para plotar no MatLab a curva de controle do sistema, o tempo de amostragem é variável devido a esse delay, alguém sabe o que posso fazer para corrigir esse problema?

A programação do delay onde há a passagem pelo zero, é essa:

void zero_crosss_int() // Função que detecta a passagem por 0
  {
           // Calculo do ângulo de disparo :: 60Hz-> 8.33ms (1/2 Cycle)
           // (8333us - 8.33us) / 128 = 65 (Approx)
           int dimtime = (65*dimming); // 65 equivale a 1 de 128
           delayMicroseconds(dimtime); // Off cycle
           digitalWrite(AC_LOAD, HIGH); // disparando o Triac
           delayMicroseconds(8.33); // Aguarda o tempo de disparo
           digitalWrite(AC_LOAD, LOW); // finaliza o pulso do Triac
}

Reparem que o valor do dimtime é variável de acordo com o valor do dimming, e o valor do dimming é inversamente proporcional a ação! ou seja, se eu mandar a lâmpada ficar acessa com uma potência alta o dimming é baixo e o delay é menor, caso contrário ocorre o inverso.

Desde já Obrigado

Exibições: 567

Responder esta

Respostas a este tópico

Faça a pergunta para o André, ele é o incubador desta placa, solicite a amizade dele e envie msg.

http://labdegaragem.com/profile/AndreAraujoKuhnPereira?xg_source=ac...

Boa sorte!

Abs.

Obrigado!

Creio que a solução é partir para interrupção por tempo ao invés de usar delay. A interrupção que detecta o zero vai disparar a interrupção por tempo, aí o Arduino vai ficar livre para continuar processando e atendendo a serial.

Boa noite a todos!

Conforme o contato por e-mail na plataforma labdegaragem, e a discussão deste post, quero compartilhar o código de controle do Dimmer Shield sem a utilização do delay (interrupção)

Em breve pretendo fazer um tutorial com esse código, controlando lâmpadas leds, fluorescentes e incandescentes, todos dimmenrizáveis.

Segue o código também em anexo em dois formato, .ino e .rar.

Caro João Archetti, será necessário fazer algumas modificações para satisfazer a sua necessidade!

//André Kuhn
//Controle do Dimmer Shield pelos botões sem interrupção (sem delay)

//Criando uma variavel inteira e armazenando o valor 3, corresponde a porta digital 3, do gate do triac
int load = 3;

//Criando uma variavel inteira e armazenando o valor 2, corresponde a porta digital 2, circuito de zero do Dimmer Shield
int interrupcao = 2;

//Criando variavel inteira para armazenar o pino da chave tácteis do Dimmer Shield
int chave_1 = 4, chave_2 = 5;

//Criando variável para armazenar o tempo de inicio do ponto zero (tempo_inicio), e o tempo corrido após a passagem pelo ponto zero (tempo_corrente)
long tempo_inicial = 0;
long tempo_corrente = 0;

//Variável inteira para armazenar a porcentagem desejada
int porcentagem_desejada = 40;

//Variável lógico para verificar se um dos dois botões estão pressionados
boolean verifica = false;


//Função de configuração do microcontrolador
void setup()
{
//Configurando a comunicação serial, com Baud Rate de 9600
Serial.begin(9600);

//Definindo o pino digital do disparo do triac como saída
pinMode(load, OUTPUT);

//Definindo o pino digital do circuito de zero do Dimmer Shield como entrada
pinMode(interrupcao, INPUT);

//Definindo os pinos digitais das chaves tácteis do Dimmer Shield como entrada
pinMode(chave_1, INPUT);
pinMode(chave_2, INPUT);
}

//Função da programação do arduino
void loop()
{
//Código para executar o controle do disparo do triac, e chamando a função zeroCross()
//------------------------------------------------------------------------------------
if(digitalRead(interrupcao))
{
//Função de controle do disparo do triac
zeroCross();
}
//Código para executar o controle do disparo do triac, e chamando a função zeroCross()
//-----------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------
//Botões responsáveis para controlar a potência do load
if((digitalRead(chave_1) == HIGH) && (verifica == false))
{
//Imprime na tela do Serial Monitor da IDE do arduino, o pressionamento da chave_1
Serial.println("Chave_1 pressionado");

//Verificando se a chave continua pressionado
verifica = HIGH;

//Se a porcentagem desejada for menor que 100, executa essa condição
if(porcentagem_desejada < 100)
{
//Incrementando valor 10 na variável porcentagem_desejada
porcentagem_desejada = porcentagem_desejada + 10;
}

//Imprimindo na tela o valor da porcentagem desejada
Serial.println(porcentagem_desejada);
}

if((digitalRead(chave_2) == HIGH) && (verifica == false))
{
//Imprime na tela do Serial Monitor da IDE do arduino, o pressionamento da chave_2
Serial.println("Chave_2 pressionado");

//Verificando se a chave continua pressionado
verifica = HIGH;

//Se a porcentagem desejada for maior que 0, executa essa condição
if(porcentagem_desejada > 0)
{
//Decrementando valor 10 na variável porcentagem_desejada
porcentagem_desejada = porcentagem_desejada - 10;
}

//Imprimindo na tela o valor da porcentagem desejada
Serial.println(porcentagem_desejada);
}
//Botões responsáveis para controlar a potência do load
//-----------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------
//Verificando se algum botão está pressionado
if((digitalRead(chave_1) == LOW) && (digitalRead(chave_2) == LOW))
{
verifica = LOW;
}
//Verificando se algum botão está pressionado
//-----------------------------------------------------------------------------------
}


//Função responsável por executar o controle do Disparo do Triac
void zeroCross()
{
//Fazendo a leitura do tempo e armazenando na variável tempo_inicial
tempo_inicial = micros();

//Enquanto o tempo percorrido for menor que 8200, executa essa condição
while((micros() - tempo_inicial) < 8200)
{
//Fazendo a leitura do tempo corrente
tempo_corrente = micros() - tempo_inicial;

//Se a condição for verdadeira, faz o disparo do triac, ou seja, coloca o pino de disparo do triac em nivel alto
if(tempo_corrente > (porcentagem_desejada * 82)) digitalWrite(load, HIGH);

//Coloca o pino de disparo do triac em nível baixo
digitalWrite(load, LOW);
}
}

//Controle do Dimmer Shield pelos botões sem interrupção (sem delay)
//André Kuhn

Att.

André Kuhn.

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço