#include // Include Timer1 library // Pin outputs for the 18 lights int AC_pin_offsets[18] = {22, 24, 26, 28, 30, 23, 25, 27, 29, 32, 34, 36, 38, 31, 33, 35, 37, 39}; int freq = 50; // 50 for EU and 60 for US int dims[18]; // dimmer values unsigned char clock_tick; // variable for Timer1 char incomingByte; int val = 0; int light = 0; int delim = 0; void setup() { Serial.begin(115200); for(int i = 0; i < 18; i++){ dims[i] = 215; pinMode(AC_pin_offsets[i], OUTPUT); }; attachInterrupt(0, zero_crosss_int, RISING); Timer1.initialize(1000000 / (freq * 2) / 256); // 8 bit control Timer1.attachInterrupt(timerIsr); // attach the service routine here } // this is the dimmer void timerIsr() { clock_tick++; for(int i = 0; i < 18; i++) { if (dims[i] == clock_tick) { digitalWrite(AC_pin_offsets[i], HIGH); // triac on delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33, for 50Hz use 10) digitalWrite(AC_pin_offsets[i], LOW); //triac off } }; } // function to be fired at the zero crossing to dim the light void zero_crosss_int() { clock_tick=0; } void loop(){ if (Serial.available() > 0) { // something came across serial while(1) { incomingByte = Serial.read(); if(incomingByte == -1) {break;}; if(incomingByte < 0) {val = 256 + incomingByte;} else {val = incomingByte;}; if(val == 253) {delim = 1; continue;}; if(val == 254) {delim = 0; continue;}; if(delim == 0) light = val; if(delim == 1) dims[light] = val; } } }