Nesse vídeo mostro como dimerizar mais de uma lâmpada ao mesmo tempo, utilizando TRIAC TIC226D e MOC3010. Para a detecção do zero (Zero Cross) da Corrente AC, utilizo dois 4N25.
Código-Fonte:
/* Multiplos dimmers com TRIAC. exemplo de como dimerizar várias lâmpadas ao mesmo tempo com o Arduino. dentro da função init_dimmers_01, definir os pinos que serão utilizados pelos dimmers, no exemplo abaixo está sendo utilizado para 3 dimmers, através dos pinos 7, 8 e 9. testes com mais de 3 lampadas não funcionaram no arduino UNO. no arduino mega, possivelmente seja possível utilizar mais lampadas byte pinsDimmers[] = {7, 8, 9}; //mudar aqui para outros, mais ou menos lampadas. testado apenas com no máximo 3. AVISO: não há qualquer garantia de funcionamento do uso desse código em qualquer aplicação. o mesmo serve apenas como exemplo e quem deseja utilizá-lo para outros propósitos fica inteiramente responsável por qualquer problema ou erro que venha a ter. boa sorte. Criado em 23/03/2015 Por: Fabiano A. Arndt http://www.youtube.com/fabianoallex http://fabianoallex.blogspot.com.br fabianoallex@gmail.com *********************************************************************************** *************************INICIO CLASSE DIMMERS************************************* ***********************************************************************************/ /* definição do tipo de ponteiro para a funcao a ser recebida como parâmetro do construtor da classe TriacDimmers que irá ser atachada na interrupção do pino de zero cross. */ typedef void (*p_triac_dimmers)(); class TriacDimmers { private: int _quantidade; int _pin_interrupt; int* _pins; int* _values; int* _pos_sorted; void _sort() { for (int i=0; i<_quantidade; i++) { _pos_sorted[i] = i; } for (int i=0; i<_quantidade; i++) { for (int j=i+1; j<_quantidade; j++) { if (_values[_pos_sorted[i]] < _values[_pos_sorted[j]]) { int t = _pos_sorted[i]; _pos_sorted[i] = _pos_sorted[j]; _pos_sorted[j] = t; } } } } public: //o ultimo parâmetro do construtor, deve ser a função que sera atachada a interrupção TriacDimmers(int pin_interrupt, int quantidade, int pins[], p_triac_dimmers funcao_dimmer){ _quantidade = quantidade; _pins = new int[_quantidade]; _values = new int[_quantidade]; _pos_sorted = new int[_quantidade]; for (int i=0; i<_quantidade; i++){ _pins[i] = pins[i]; pinMode(_pins[i], OUTPUT); _values[i] = 0; } _sort(); pinMode(_pin_interrupt, INPUT); attachInterrupt(pin_interrupt==2 ? 0 : 1, funcao_dimmer, FALLING); } void set_value(int pos, int value) { if (_values[pos] != value){ noInterrupts(); _values[pos] = value; _sort(); interrupts(); } } void dimmer(){ int inc_delay=0; int p, t, t2; for (int i=0; i<_quantidade; i++) { p = _pos_sorted[i]; t = map(_values[p], 0, 100, 7200, 1 ); t2 = t-inc_delay; if (t2 > 0) { delayMicroseconds(t2); } digitalWrite(_pins[p], HIGH); inc_delay += t2; //if (inc_delay >= 7200) { break; } } delayMicroseconds(10); for (int i=0; i<_quantidade; i++) { digitalWrite(_pins[i], LOW); } } int get_quantidade() { return _quantidade; } }; /********************************************************************************** *****************************FIM CLASSE DIMMERS************************************ ***********************************************************************************/ /********************************************************************************** *****************************INICIO DECLARAÇÕES DOS OBJETOS DIMMERS**************** ***********************************************************************************/ /*cada ponteiro declarado para a classe TriacDimmers deve ter uma funcao correspondente a ser anexada (attachInterrupt). Essa função deve ser passada como parâmetro do construtor da classe TriacDimmers. Caso outras instancias da classe TriacDimmers sejam criadas, devem ser criadas também, outras funções para serem passadas como parâmetros do construtor.*/ //ponteiro para o objeto que irá gerenciar os dimmers TriacDimmers *triacDimmers_01; //função a ser atachada na interrupção, passada como parametro no construtor de TriacDimmers void triac_dimmers_01() { triacDimmers_01->dimmer(); } //função acessória, apenas para facilitar a inicialização do objeto. void init_dimmers_01(){ int pinsDimmers[] = {7,8,9}; //configure aqui os pinos de saída para os triacs. int pinInterrupt = 2; //configure aqui o pino para detectar a interrupção. triacDimmers_01 = new TriacDimmers( pinInterrupt, sizeof(pinsDimmers)/sizeof(int), pinsDimmers, triac_dimmers_01 ); } /********************************************************************************** *****************************FIM DECLARAÇÕES DOS OBJETOS DIMMERS**************** ***********************************************************************************/ /********************************************************************************** *****************************SETUP E LOOP****************************************** ***********************************************************************************/ void setup() { init_dimmers_01(); //instancia o objeto que irá gerenciar os dimmers } void loop() { triacDimmers_01->set_value(0,map(analogRead(A0), 0, 1023, 0, 100 ) ); triacDimmers_01->set_value(1,map(analogRead(A1), 0, 1023, 0, 100 ) ); triacDimmers_01->set_value(2,map(analogRead(A2), 0, 1023, 0, 100 ) ); delay(50); } /********************************************************************************** *****************************FIM SETUP E LOOP************************************** ***********************************************************************************/