Dimmer Tiny (updated: 03 Mar 2017, 09:58:43)

Управлнение диммером или ШИМ на базе внешнего микроконтроллера, подключаемого по I2C шине.

Доступно управление до 5 каналов как PWM опцией из функций модуля. Указываем нумерацию от 5 PWM канал при управлении опцией. Уровень записывается по указанному I2C адресу без дополнительных параметров.

Пример скетча диммера для Attiny25/45/85:

Требуется среда разработки ARDUINO IDE , Arduino-tiny, библиотека TinyWireS

Менеджер плат для Tiny https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

// автономный диммер на ATtiny85
// управляется по I2C. По мотивам
// http://forum.arduino.cc/index.php?topic=314773.0
// Автор Umka(c) http://u-m.biz

#include <TinyWireS.h>
 
#define I2C_SLAVE_ADDR (0x41)
#define DETECT 4      //zero cross detect, interrupt 0, is physical pin 6
#define GATE 3        //triac gate is physical pin 2
#define PULSE 2       //trigger pulse width (counts)
// I2C pins: PB2 - SCL, PB0 - SDA
volatile byte i2cValue;
 
void setup() {
  // set up pins
  TinyWireS.begin(I2C_SLAVE_ADDR);
  
  DDRB &= ~(1<<DETECT);   //zero cross detect
 
  PORTB |= (1<<DETECT); //enable pull-up resistor
 
  DDRB |= 1<<GATE;   //triac gate control
 
  GIMSK=1<<PCIE;
  PCMSK=1<<PCINT4;
 
  OCR1A = 50;    //initialize the comparator
  TIMSK = _BV(OCIE1A) | _BV(TOIE1);  //interrupt on Compare Match A | enable timer overflow interrupt
  sei();  // enable interrupts

  TinyWireS.onRequest(requestEvent);
}
 
ISR (PCINT0_vect){
if (PINB&(1<<PINB4)) { return;}
TCNT1 = 0;                //reset timer - count from zero
TCCR1 = B00001011;        // prescaler on 1024, see table 12.5 of the tiny85 datasheet
 
}
 
ISR(TIMER1_COMPA_vect) {   //comparator match
  PORTB |= (1<<GATE);//set triac gate to high
 
  TCNT1 = 255 - PULSE;     //trigger pulse width, when TCNT1=255 timer1 overflows
}
 
ISR(TIMER1_OVF_vect) {      //timer1 overflow
  PORTB &= ~(1<<GATE);//turn off triac gate
 
  TCCR1 = 0;                //disable timer stop unintended triggers
}
 
void loop() {
 
  if (TinyWireS.available())  i2cValue = TinyWireS.receive();
 
  OCR1A = map(i2cValue, 0, 254, 125, 2);
  TinyWireS_stop_check();
}
 
void requestEvent() {
  TinyWireS.send(i2cValue);
}